| // -*-c++-*- |
| // vim: set ft=cpp: |
| |
| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #ifndef cmext_type_traits |
| #define cmext_type_traits |
| |
| #include <cm/type_traits> |
| |
| namespace cm { |
| |
| // type traits for managed pointer types |
| template <typename> |
| struct is_unique_ptr : std::false_type |
| { |
| }; |
| template <typename T> |
| struct is_unique_ptr<std::unique_ptr<T>> : std::true_type |
| { |
| }; |
| |
| // type traits for containers |
| template <typename, typename = void_t<>> |
| struct is_container : std::false_type |
| { |
| }; |
| template <typename T> |
| struct is_container< |
| T, |
| cm::void_t<typename T::value_type, typename T::size_type, |
| typename T::difference_type, typename T::iterator>> |
| : std::true_type |
| { |
| }; |
| |
| template <typename, typename = void_t<>> |
| struct is_associative_container : std::false_type |
| { |
| }; |
| template <typename T> |
| struct is_associative_container< |
| T, cm::void_t<typename T::key_type, typename T::key_compare>> |
| : cm::is_container<T> |
| { |
| }; |
| |
| template <typename, typename = void_t<>> |
| struct is_unordered_associative_container : std::false_type |
| { |
| }; |
| template <typename T> |
| struct is_unordered_associative_container< |
| T, |
| cm::void_t<typename T::key_type, typename T::hasher, typename T::key_equal, |
| typename T::local_iterator>> : cm::is_container<T> |
| { |
| }; |
| |
| template <typename T> |
| using is_sequence_container = |
| cm::bool_constant<cm::is_container<T>::value && |
| !cm::is_associative_container<T>::value && |
| !cm::is_unordered_associative_container<T>::value>; |
| |
| } // namespace cm |
| |
| #endif |