• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2014 Google Inc. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef FRUIT_CONFIG_H
18 #define FRUIT_CONFIG_H
19 
20 #include <fruit/impl/fruit-config-base.h>
21 
22 #if FRUIT_HAS_STD_IS_TRIVIALLY_COPYABLE
23 #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
24 #define FRUIT_IS_TRIVIALLY_COPYABLE(T)                                                                                 \
25   (std::is_trivially_copyable<T>::value || (std::is_empty<T>::value && std::is_trivially_copy_constructible<T>::value))
26 #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
27 #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (std::is_trivially_copyable<T>::value)
28 #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
29 #elif FRUIT_HAS_IS_TRIVIALLY_COPYABLE
30 #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
31 #define FRUIT_IS_TRIVIALLY_COPYABLE(T)                                                                                 \
32   (__is_trivially_copyable(T) || (std::is_empty<T>::value && std::is_trivially_copy_constructible<T>::value))
33 #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
34 #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (__is_trivially_copyable(T))
35 #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
36 #elif FRUIT_HAS_HAS_TRIVIAL_COPY
37 // The compiler doesn't support __is_trivially_copyable (nor is std::is_trivially_copyable
38 // supported by the library). We use this check as a proxy, but it's not exactly the same thing.
39 #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
40 #define FRUIT_IS_TRIVIALLY_COPYABLE(T)                                                                                 \
41   (__has_trivial_copy(T) || (std::is_empty<T>::value && std::is_trivially_copy_constructible<T>::value))
42 #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
43 #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (__has_trivial_copy(T))
44 #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
45 #else
46 // We use the standard one, but most likely it won't work.
47 #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
48 #define FRUIT_IS_TRIVIALLY_COPYABLE(T)                                                                                 \
49   (std::is_trivially_copyable<T>::value || (std::is_empty<T>::value && std::is_trivially_copy_constructible<T>::value))
50 #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
51 #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (std::is_trivially_copyable<T>::value)
52 #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE
53 #endif
54 
55 #if FRUIT_HAS_ALWAYS_INLINE_ATTRIBUTE
56 #define FRUIT_ALWAYS_INLINE __attribute__((always_inline))
57 #elif FRUIT_HAS_FORCEINLINE
58 #define FRUIT_ALWAYS_INLINE __forceinline
59 #else
60 #define FRUIT_ALWAYS_INLINE
61 #endif
62 
63 #if FRUIT_HAS_GCC_ATTRIBUTE_DEPRECATED
64 #define FRUIT_DEPRECATED_DECLARATION(...) __VA_ARGS__ __attribute__((deprecated))
65 // Marking the declaration is enough.
66 #define FRUIT_DEPRECATED_DEFINITION(...) __VA_ARGS__
67 #elif FRUIT_HAS_DECLSPEC_DEPRECATED
68 #define FRUIT_DEPRECATED_DECLARATION(...) __declspec(deprecated) __VA_ARGS__
69 #define FRUIT_DEPRECATED_DEFINITION(...) __declspec(deprecated) __VA_ARGS__
70 // We use this only if the above two are not supported, because some compilers "support" this syntax (i.e., it compiles)
71 // but they just ignore the attribute.
72 #elif FRUIT_HAS_ATTRIBUTE_DEPRECATED
73 #define FRUIT_DEPRECATED_DECLARATION(...) [[deprecated]] __VA_ARGS__
74 #define FRUIT_DEPRECATED_DEFINITION(...) [[deprecated]] __VA_ARGS__
75 #else
76 #define FRUIT_DEPRECATED_DECLARATION(...) __VA_ARGS__
77 #define FRUIT_DEPRECATED_DEFINITION(...) __VA_ARGS__
78 #endif
79 
80 #if FRUIT_HAS_MSVC_ASSUME
81 #define FRUIT_UNREACHABLE                                                                                              \
82   FruitAssert(false);                                                                                                  \
83   __assume(0)
84 #elif FRUIT_HAS_BUILTIN_UNREACHABLE
85 #define FRUIT_UNREACHABLE                                                                                              \
86   FruitAssert(false);                                                                                                  \
87   __builtin_unreachable()
88 #endif
89 
90 #endif // FRUIT_CONFIG_H
91