IsMaplike.hpp
1 // 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<>>
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>
61 
62 /// \see is_maplike
63 template <typename T>
65 // @}
66 } // namespace tt
std::false_type
tt::is_maplike
Check if type T is like a std::map or std::unordored_map.
Definition: IsMaplike.hpp:47
tt::is_maplike_v
constexpr bool is_maplike_v
Definition: IsMaplike.hpp:60
Requires.hpp
tt::is_maplike_t
typename is_maplike< T >::type is_maplike_t
Definition: IsMaplike.hpp:64
tt
Definition: TensorExpression.hpp:113
type_traits