emlabcpp
modern opinionated embedded C++ library
base.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include <array>
27 #include <cstdint>
28 #include <ranges>
29 #include <tuple>
30 #include <type_traits>
31 #include <vector>
32 
33 namespace emlabcpp
34 {
38 template < typename Container >
40 {
41  using type =
42  decltype( std::begin( std::declval< std::add_lvalue_reference_t< Container > >() ) );
43 };
44 
45 template < typename Container >
47 
51 template < typename Container >
53 {
54  using type =
55  decltype( std::data( std::declval< std::add_lvalue_reference_t< Container > >() ) );
56 };
57 
58 template < typename Container >
60 
63 namespace impl
64 {
65  template < typename >
66  struct is_view : std::false_type
67  {
68  };
69 
70  template < std::ranges::borrowed_range T >
71  struct is_view< T > : std::true_type
72  {
73  };
74 
75 } // namespace impl
76 
77 template < typename T >
78 struct is_view : impl::is_view< std::decay_t< T > >
79 {
80 };
81 
82 template < typename T >
83 constexpr bool is_view_v = is_view< T >::value;
84 
87 template < typename... >
88 struct are_same;
89 
90 template < typename T, typename... Ts >
91 struct are_same< T, Ts... > : std::conjunction< std::is_same< T, Ts >... >
92 {
93 };
94 
95 template <>
96 struct are_same<> : std::true_type
97 {
98 };
99 
100 template < typename... Ts >
101 constexpr bool are_same_v = are_same< Ts... >::value;
102 
105 template < typename T, typename Tuple >
107 
108 template < typename T, typename... Us >
109 struct tuple_has_type< T, std::tuple< Us... > > : std::disjunction< std::is_same< T, Us >... >
110 {
111 };
112 
113 template < typename T, typename... Us >
114 constexpr bool tuple_has_type_v = tuple_has_type< T, Us... >::value;
115 
118 namespace impl
119 {
120  template < typename >
121  struct is_std_tuple : std::false_type
122  {
123  };
124 
125  template < typename... T >
126  struct is_std_tuple< std::tuple< T... > > : std::true_type
127  {
128  };
129 } // namespace impl
130 
131 template < typename T >
132 struct is_std_tuple : impl::is_std_tuple< std::decay_t< T > >
133 {
134 };
135 
136 template < typename T >
138 
141 namespace impl
142 {
143  template < typename >
144  struct is_std_array : std::false_type
145  {
146  };
147 
148  template < typename T, std::size_t N >
149  struct is_std_array< std::array< T, N > > : std::true_type
150  {
151  };
152 } // namespace impl
153 
154 template < typename T >
155 struct is_std_array : impl::is_std_array< std::decay_t< T > >
156 {
157 };
158 
159 template < typename T >
161 
164 namespace impl
165 {
166  template < typename >
167  struct is_std_vector : std::false_type
168  {
169  };
170 
171  template < typename T >
172  struct is_std_vector< std::vector< T > > : std::true_type
173  {
174  };
175 } // namespace impl
176 
177 template < typename T >
178 struct is_std_vector : impl::is_std_vector< std::decay_t< T > >
179 {
180 };
181 
182 template < typename T >
184 
187 
188 namespace impl
189 {
190  template < typename >
191  struct static_size;
192 
193  template < typename T, std::size_t N >
194  struct static_size< std::array< T, N > >
195  {
196  static constexpr std::size_t value = N;
197  };
198 
199  template < typename... Ts >
200  struct static_size< std::tuple< Ts... > >
201  {
202  static constexpr std::size_t value = std::tuple_size_v< std::tuple< Ts... > >;
203  };
204 } // namespace impl
205 
206 template < typename T >
207 struct static_size : impl::static_size< std::decay_t< T > >
208 {
209 };
210 
212 template < typename T >
213 [[deprecated]] constexpr std::size_t static_size_v = static_size< T >::value;
214 
216 
217 template < typename Signature >
219 
220 template < typename ReturnType, typename Class, typename... Args >
221 struct signature_of< ReturnType ( Class::* )( Args... ) >
222 {
223  using return_type = ReturnType;
224  using class_type = Class;
225  using args_type = std::tuple< Args... >;
226  using signature = ReturnType( Args... );
227 };
228 
229 template < typename ReturnType, typename Class, typename... Args >
230 struct signature_of< ReturnType ( Class::* )( Args... ) const >
231  : signature_of< ReturnType ( Class::* )( Args... ) >
232 {
233 };
234 
235 template < typename ReturnType, typename... Args >
236 struct signature_of< ReturnType( Args... ) >
237 {
238  using return_type = ReturnType;
239  using args_type = std::tuple< Args... >;
240  using signature = ReturnType( Args... );
241 };
242 
243 template < typename Callable >
244 requires( requires() { &Callable::operator(); } )
245 struct signature_of< Callable > : signature_of< decltype( &Callable::operator() ) >
246 {
247 };
248 
249 } // namespace emlabcpp
Definition: vector.h:33
Definition: base.h:191
MIT License.
Definition: impl.h:31
ReturnType(Args...) signature
Definition: base.h:240
typename data_iterator_of< Container >::type data_iterator_of_t
Definition: base.h:59
constexpr bool is_std_array_v
Definition: base.h:160
std::tuple< Args... > args_type
Definition: base.h:239
constexpr pointer data() noexcept
Returns pointer to first item of the storage.
Definition: static_storage.h:108
constexpr std::size_t static_size_v
Marked deprecated on 19.4.2021.
Definition: base.h:213
constexpr bool is_std_tuple_v
Definition: base.h:137
constexpr bool tuple_has_type_v
Definition: base.h:114
typename iterator_of< Container >::type iterator_of_t
Definition: base.h:46
constexpr bool is_std_vector_v
Definition: base.h:183
decltype(std::data(std::declval< std::add_lvalue_reference_t< Container > >())) type
Definition: base.h:55
requires(!range_container< Container >) const expr std
Returns index of an element in tuple 't', for which call to predicate f(x) holds true,...
Definition: algorithm.h:127
ReturnType return_type
Definition: base.h:238
decltype(std::begin(std::declval< std::add_lvalue_reference_t< Container > >())) type
Definition: base.h:42
constexpr bool are_same_v
Definition: base.h:101
N
Definition: static_storage.h:97
constexpr bool is_view_v
Definition: base.h:83
Definition: base.h:88
Definition: base.h:53
Definition: base.h:40
Definition: base.h:218
Definition: base.h:106
Definition: base.h:145
Definition: base.h:122
Definition: base.h:168
Definition: base.h:67
Definition: base.h:156
Definition: base.h:133
Definition: base.h:179
Definition: base.h:79
ReturnType(Args...) signature
Definition: base.h:226
std::tuple< Args... > args_type
Definition: base.h:225
Definition: base.h:208