| namespace type_traits_internal { | |
| // is_trivially_copyable() | |
| // | |
| // Determines whether the passed type `T` is trivially copyable. | |
| // | |
| // This metafunction is designed to be a drop-in replacement for the C++11 | |
| // `std::is_trivially_copyable()` metafunction for platforms that have | |
| // incomplete C++11 support (such as libstdc++ 4.x). We use the C++17 definition | |
| // of TriviallyCopyable. | |
| // | |
| // NOTE: `is_trivially_copyable<T>::value` is `true` if all of T's copy/move | |
| // constructors/assignment operators are trivial or deleted, T has at least | |
| // one non-deleted copy/move constructor/assignment operator, and T is trivially | |
| // destructible. Arrays of trivially copyable types are trivially copyable. | |
| // | |
| // We expose this metafunction only for internal use within absl. | |
| template <typename T> | |
| class is_trivially_copyable_impl { | |
| using ExtentsRemoved = typename std::remove_all_extents<T>::type; | |
| static constexpr bool kIsCopyOrMoveConstructible = | |
| std::is_copy_constructible<ExtentsRemoved>::value || | |
| std::is_move_constructible<ExtentsRemoved>::value; | |
| static constexpr bool kIsCopyOrMoveAssignable = | |
| absl::is_copy_assignable<ExtentsRemoved>::value || | |
| absl::is_move_assignable<ExtentsRemoved>::value; | |
| public: | |
| static constexpr bool kValue = | |
| (__has_trivial_copy(ExtentsRemoved) || !kIsCopyOrMoveConstructible) && | |
| (__has_trivial_assign(ExtentsRemoved) || !kIsCopyOrMoveAssignable) && | |
| (kIsCopyOrMoveConstructible || kIsCopyOrMoveAssignable) && | |
| is_trivially_destructible<ExtentsRemoved>::value && | |
| // We need to check for this explicitly because otherwise we'll say | |
| // references are trivial copyable when compiled by MSVC. | |
| !std::is_reference<ExtentsRemoved>::value; | |
| }; | |
| template <typename T> | |
| struct is_trivially_copyable | |
| : std::integral_constant< | |
| bool, type_traits_internal::is_trivially_copyable_impl<T>::kValue> {}; | |
| } // namespace type_traits_internal |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment