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 : namespace tt {
9 : /// @{
10 : /// \ingroup TypeTraitsGroup
11 : /// \brief Check if type T has a begin() and end() function
12 : ///
13 : /// \details
14 : /// Given a type `T` inherits from std::true_type if `T` has member functions
15 : /// `begin()` and `end()`, otherwise inherits from std::false_type
16 : ///
17 : /// \usage
18 : /// For any type `T`
19 : /// \code
20 : /// using result = tt::is_iterable<T>;
21 : /// \endcode
22 : ///
23 : /// \metareturns
24 : /// std::bool_constant
25 : ///
26 : /// \semantics
27 : /// If `T` has member function `begin()` and `end()` then
28 : /// \code
29 : /// typename result::type = std::true_type;
30 : /// \endcode
31 : /// otherwise
32 : /// \code
33 : /// typename result::type = std::false_type;
34 : /// \endcode
35 : ///
36 : /// \example
37 : /// \snippet Test_IsIterable.cpp is_iterable_example
38 : /// \tparam T the type to check
39 : template <typename T, typename = std::void_t<>>
40 1 : struct is_iterable : std::false_type {};
41 :
42 : /// \cond HIDDEN_SYMBOLS
43 : template <typename T>
44 : struct is_iterable<T, std::void_t<decltype(std::declval<T>().begin(),
45 : std::declval<T>().end())>>
46 : : std::true_type {};
47 : /// \endcond
48 :
49 : /// \see is_iterable
50 : template <typename T>
51 1 : constexpr bool is_iterable_v = is_iterable<T>::value;
52 :
53 : /// \see is_iterable
54 : template <typename T>
55 1 : using is_iterable_t = typename is_iterable<T>::type;
56 : /// @}
57 : } // namespace tt
|