77#include < utility>
88#include < vector>
99
10- template <typename T>
10+ template <typename T>
1111concept is_iterable = requires (T array_like) {
12- {
13- array_like.has_next ()
14- } -> std::convertible_to<bool >;
15- {
16- array_like.next ()
17- } -> std::same_as<uint32_t >;
18- {
19- array_like.reset ()
20- };
12+ { array_like.has_next () } -> std::convertible_to<bool >;
13+ { array_like.next () } -> std::same_as<uint32_t >;
14+ { array_like.reset () };
2115};
2216
23- template <is_iterable T>
24- constexpr std::size_t count (T array)
25- {
17+ template <is_iterable T>
18+ constexpr std::size_t count (T array) {
2619 array.reset ();
2720 std::size_t count = 0 ;
28- while (array.has_next ())
29- {
21+ while (array.has_next ()) {
3022 array.next ();
3123 count++;
3224 }
3325 return count;
3426}
3527
36- template <typename T>
37- constexpr std::size_t count (T&& array)
38- {
28+ template <typename T>
29+ constexpr std::size_t count (T&& array) {
3930 return count (array);
4031}
4132
42- struct iterable_array
43- {
44- inline constexpr iterable_array () noexcept = default;
45- inline constexpr iterable_array (const iterable_array&) noexcept = default;
46- inline constexpr iterable_array (const std::size_t s)
47- : array(s)
48- {
49- }
50- inline constexpr ~iterable_array () noexcept = default ;
33+ struct iterable_array {
34+ constexpr inline iterable_array () noexcept = default;
35+ constexpr inline iterable_array (const iterable_array&) noexcept = default;
36+ constexpr inline iterable_array (const std::size_t s)
37+ : array(s) {}
38+ constexpr inline ~iterable_array () noexcept = default ;
5139
5240 std::vector<uint32_t > array{};
5341 std::size_t index = 0 ;
5442
55- inline constexpr void reset () { index = 0 ; }
56- inline constexpr bool has_next () const noexcept { return index < array.size (); }
57- inline constexpr std::uint32_t next ()
58- {
43+ constexpr inline void reset () { index = 0 ; }
44+ constexpr inline bool has_next () const noexcept { return index < array.size (); }
45+ constexpr inline std::uint32_t next () {
5946 index++;
6047 return array[index - 1 ];
6148 }
6249};
6350
64- consteval [[nodiscard]] std::size_t __cdecl count_iterable_array ()
65- {
51+ consteval [[nodiscard]] std::size_t __cdecl count_iterable_array () {
6652 static_assert (std::is_constant_evaluated ());
6753 return count (iterable_array (10 ));
6854}
6955
70- namespace std
71- {
56+ namespace std {
7257
73- template <>
74- struct tuple_size <iterable_array> : integral_constant<std::size_t , 2 >
75- {
76- };
58+ template <>
59+ struct tuple_size <iterable_array> : integral_constant<std::size_t , 2 > {};
7760
78- template <>
79- struct tuple_element <0U , iterable_array>
80- {
61+ template <>
62+ struct tuple_element <0U , iterable_array> {
8163 using type = vector<uint32_t >;
8264};
8365
84- template <>
85- struct tuple_element <1U , iterable_array>
86- {
66+ template <>
67+ struct tuple_element <1U , iterable_array> {
8768 using type = size_t ;
8869};
8970
90- template <size_t I>
71+ template <size_t I>
9172 requires (I < tuple_size<iterable_array>::value)
92- typename tuple_element<I, iterable_array>::type& get (iterable_array& itrarray)
93- {
73+ typename tuple_element<I, iterable_array>::type& get (iterable_array& itrarray) {
9474 if constexpr (I == 0 )
9575 return itrarray.array ;
9676 else /* constexpr */
9777 return itrarray.index ;
9878}
9979
100- template <size_t I>
80+ template <size_t I>
10181 requires (I < tuple_size<iterable_array>::value)
102- typename const tuple_element<I, iterable_array>::type& get (const iterable_array& itrarray)
103- {
82+ typename const tuple_element<I, iterable_array>::type& get (const iterable_array& itrarray) {
10483 if constexpr (I == 0 )
10584 return itrarray.array ;
10685 else /* constexpr */
10786 return itrarray.index ;
10887}
10988
110- template <size_t I>
89+ template <size_t I>
11190 requires (I < tuple_size<iterable_array>::value)
112- typename tuple_element<I, iterable_array>::type&& get(iterable_array&& itrarray)
113- {
91+ typename tuple_element<I, iterable_array>::type&& get(iterable_array&& itrarray) {
11492 if constexpr (I == 0 )
11593 return std::forward<tuple_element<0U , iterable_array>::type>(itrarray.array );
11694 else /* constexpr */
@@ -119,8 +97,7 @@ typename tuple_element<I, iterable_array>::type&& get(iterable_array&& itrarray)
11997
12098} // namespace std
12199
122- auto main (void ) -> int
123- {
100+ int main (void ) {
124101 static_assert (std::tuple_size<iterable_array>::value == 2 );
125102 static_assert (std::tuple_size_v<iterable_array> == 2 );
126103 static_assert (std::is_same_v<std::tuple_element<0 , iterable_array>::type, std::vector<std::uint32_t >>);
0 commit comments