/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FRUIT_CONFIG_H #define FRUIT_CONFIG_H #include #if FRUIT_HAS_STD_IS_TRIVIALLY_COPYABLE #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) \ (std::is_trivially_copyable::value || (std::is_empty::value && std::is_trivially_copy_constructible::value)) #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (std::is_trivially_copyable::value) #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #elif FRUIT_HAS_IS_TRIVIALLY_COPYABLE #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) \ (__is_trivially_copyable(T) || (std::is_empty::value && std::is_trivially_copy_constructible::value)) #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (__is_trivially_copyable(T)) #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #elif FRUIT_HAS_HAS_TRIVIAL_COPY // The compiler doesn't support __is_trivially_copyable (nor is std::is_trivially_copyable // supported by the library). We use this check as a proxy, but it's not exactly the same thing. #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) \ (__has_trivial_copy(T) || (std::is_empty::value && std::is_trivially_copy_constructible::value)) #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (__has_trivial_copy(T)) #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #else // We use the standard one, but most likely it won't work. #if FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) \ (std::is_trivially_copyable::value || (std::is_empty::value && std::is_trivially_copy_constructible::value)) #else // !FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #define FRUIT_IS_TRIVIALLY_COPYABLE(T) (std::is_trivially_copyable::value) #endif // FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE #endif #if FRUIT_HAS_ALWAYS_INLINE_ATTRIBUTE #define FRUIT_ALWAYS_INLINE __attribute__((always_inline)) #elif FRUIT_HAS_FORCEINLINE #define FRUIT_ALWAYS_INLINE __forceinline #else #define FRUIT_ALWAYS_INLINE #endif #if FRUIT_HAS_GCC_ATTRIBUTE_DEPRECATED #define FRUIT_DEPRECATED_DECLARATION(...) __VA_ARGS__ __attribute__((deprecated)) // Marking the declaration is enough. #define FRUIT_DEPRECATED_DEFINITION(...) __VA_ARGS__ #elif FRUIT_HAS_DECLSPEC_DEPRECATED #define FRUIT_DEPRECATED_DECLARATION(...) __declspec(deprecated) __VA_ARGS__ #define FRUIT_DEPRECATED_DEFINITION(...) __declspec(deprecated) __VA_ARGS__ // We use this only if the above two are not supported, because some compilers "support" this syntax (i.e., it compiles) // but they just ignore the attribute. #elif FRUIT_HAS_ATTRIBUTE_DEPRECATED #define FRUIT_DEPRECATED_DECLARATION(...) [[deprecated]] __VA_ARGS__ #define FRUIT_DEPRECATED_DEFINITION(...) [[deprecated]] __VA_ARGS__ #else #define FRUIT_DEPRECATED_DECLARATION(...) __VA_ARGS__ #define FRUIT_DEPRECATED_DEFINITION(...) __VA_ARGS__ #endif #if FRUIT_HAS_MSVC_ASSUME #define FRUIT_UNREACHABLE \ FruitAssert(false); \ __assume(0) #elif FRUIT_HAS_BUILTIN_UNREACHABLE #define FRUIT_UNREACHABLE \ FruitAssert(false); \ __builtin_unreachable() #endif #endif // FRUIT_CONFIG_H