Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <type_traits> 7 : 8 : #include "Utilities/Requires.hpp" 9 : #include "Utilities/TypeTraits/IsIterable.hpp" 10 : 11 : namespace tt { 12 : /// @{ 13 : /// \ingroup TypeTraitsGroup 14 : /// \brief Check if type `T` is like a std::map or std::unordored_map 15 : /// 16 : /// \details 17 : /// Inherits from std::true_type if the type `T` has a type alias `key_type`, 18 : /// type alias `mapped_type`, and `operator[](const typename T::key_type&)` 19 : /// defined, otherwise inherits from std::false_type 20 : /// 21 : /// \usage 22 : /// For any type `T`, 23 : /// \code 24 : /// using result = tt::is_maplike<T>; 25 : /// \endcode 26 : /// 27 : /// \metareturns 28 : /// std::bool_constant 29 : /// 30 : /// \semantics 31 : /// If the type `T` has a type alias `key_type`, 32 : /// type alias `mapped_type`, and `operator[](const typename T::key_type&)` 33 : /// defined, then 34 : /// \code 35 : /// typename result::type = std::true_type; 36 : /// \endcode 37 : /// otherwise 38 : /// \code 39 : /// typename result::type = std::false_type; 40 : /// \endcode 41 : /// 42 : /// \example 43 : /// \snippet Test_IsMaplike.cpp is_maplike_example 44 : /// \see std::map std::unordered_map is_a 45 : /// \tparam T the type to check 46 : template <typename T, typename = std::void_t<>> 47 1 : struct is_maplike : std::false_type {}; 48 : 49 : /// \cond 50 : template <typename T> 51 : struct is_maplike<T, std::void_t<typename T::key_type, typename T::mapped_type, 52 : decltype(std::declval<T&>()[std::declval< 53 : const typename T::key_type&>()]), 54 : Requires<tt::is_iterable_v<T>>>> 55 : : std::true_type {}; 56 : /// \endcond 57 : 58 : /// \see is_maplike 59 : template <typename T> 60 1 : constexpr bool is_maplike_v = is_maplike<T>::value; 61 : 62 : /// \see is_maplike 63 : template <typename T> 64 1 : using is_maplike_t = typename is_maplike<T>::type; 65 : /// @} 66 : } // namespace tt