]>
git.proxmox.com Git - ceph.git/blob - ceph/src/arrow/cpp/src/arrow/util/type_traits.h
1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements. See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership. The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License. You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied. See the License for the
15 // specific language governing permissions and limitations
21 #include <type_traits>
26 /// \brief Metafunction to allow checking if a type matches any of another set of types
27 template <typename
...>
28 struct IsOneOf
: std::false_type
{}; /// Base case: nothing has matched
30 template <typename T
, typename U
, typename
... Args
>
31 struct IsOneOf
<T
, U
, Args
...> {
32 /// Recursive case: T == U or T matches any other types provided (not including U).
33 static constexpr bool value
= std::is_same
<T
, U
>::value
|| IsOneOf
<T
, Args
...>::value
;
36 /// \brief Shorthand for using IsOneOf + std::enable_if
37 template <typename T
, typename
... Args
>
38 using EnableIfIsOneOf
= typename
std::enable_if
<IsOneOf
<T
, Args
...>::value
, T
>::type
;
40 /// \brief is_null_pointer from C++17
42 struct is_null_pointer
: std::is_same
<std::nullptr_t
, typename
std::remove_cv
<T
>::type
> {
47 // A aligned_union backport, because old libstdc++ versions don't include it.
49 constexpr std::size_t max_size(std::size_t a
, std::size_t b
) { return (a
> b
) ? a
: b
; }
51 template <typename
...>
52 struct max_size_traits
;
54 template <typename H
, typename
... T
>
55 struct max_size_traits
<H
, T
...> {
56 static constexpr std::size_t max_sizeof() {
57 return max_size(sizeof(H
), max_size_traits
<T
...>::max_sizeof());
59 static constexpr std::size_t max_alignof() {
60 return max_size(alignof(H
), max_size_traits
<T
...>::max_alignof());
65 struct max_size_traits
<> {
66 static constexpr std::size_t max_sizeof() { return 0; }
67 static constexpr std::size_t max_alignof() { return 0; }
70 template <std::size_t Len
, typename
... T
>
71 struct aligned_union
{
72 static constexpr std::size_t alignment_value
= max_size_traits
<T
...>::max_alignof();
73 static constexpr std::size_t size_value
=
74 max_size(Len
, max_size_traits
<T
...>::max_sizeof());
75 using type
= typename
std::aligned_storage
<size_value
, alignment_value
>::type
;
80 template <std::size_t Len
, typename
... T
>
81 using aligned_union
= std::aligned_union
<Len
, T
...>;
85 } // namespace internal