MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
type_erase.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ALGORITHM_TYPE_ERASE_HPP__
2#define MSTL_CORE_ALGORITHM_TYPE_ERASE_HPP__
3
11
13#include <initializer_list>
15
21
28template <typename Container>
29MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
30decltype(auto) begin(Container& cont)
31noexcept(noexcept(cont.begin())) {
32 return cont.begin();
33}
34
41template <typename Container>
42MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
43decltype(auto) end(Container& cont)
44noexcept(noexcept(cont.end())) {
45 return cont.end();
46}
47
54template <typename Container>
55MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
56decltype(auto) begin(const Container& cont)
57noexcept(noexcept(cont.begin())) {
58 return cont.begin();
59}
60
67template <typename Container>
68MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
69decltype(auto) end(const Container& cont)
70noexcept(noexcept(cont.end())) {
71 return cont.end();
72}
73
81template <typename T, size_t Size>
82MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
83T* begin(T (&arr)[Size]) noexcept {
84 return arr;
85}
86
95template <typename T, size_t Size>
96MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
97T* end(T (&arr)[Size]) noexcept {
98 return arr + Size;
99}
100
107template <typename Container>
108MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
109decltype(auto) cbegin(const Container& cont) noexcept(noexcept(cont.cbegin())) {
110 return cont.cbegin();
111}
112
119template <typename Container>
120MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
121decltype(auto) cend(const Container& cont) noexcept(noexcept(cont.cend())) {
122 return cont.cend();
123}
124
132template <typename T, size_t Size>
133MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
134const T* cbegin(T (&arr)[Size]) noexcept {
135 return arr;
136}
137
146template <typename T, size_t Size>
147MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
148const T* cend(T (&arr)[Size]) noexcept {
149 return arr + Size;
150}
151
158template <typename Container>
159MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
160decltype(auto) rbegin(Container& cont) noexcept(noexcept(cont.rbegin())) {
161 return cont.rbegin();
162}
163
170template <typename Container>
171MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
172decltype(auto) rend(Container& cont) noexcept(noexcept(cont.rend())) {
173 return cont.rend();
174}
175
182template <typename Container>
183MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
184decltype(auto) rbegin(const Container& cont) noexcept(noexcept(cont.rbegin())) {
185 return cont.rbegin();
186}
187
194template <typename Container>
195MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
196decltype(auto) rend(const Container& cont) noexcept(noexcept(cont.rend())) {
197 return cont.rend();
198}
199
207template <typename T, size_t Size>
208MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
209reverse_iterator<T*> rbegin(T (&arr)[Size]) noexcept {
210 return reverse_iterator<T*>(arr + Size);
211}
212
220template <typename T, size_t Size>
221MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
222reverse_iterator<T*> rend(T (&arr)[Size]) noexcept {
223 return reverse_iterator<T*>(arr);
224}
225
232template <typename T>
233MSTL_NODISCARD constexpr
234reverse_iterator<const T*> rbegin(std::initializer_list<T> lls) noexcept {
235 return reverse_iterator<const T*>(lls.end());
236}
237
244template <typename T>
245MSTL_NODISCARD constexpr
246reverse_iterator<const T*> rend(std::initializer_list<T> lls) noexcept {
247 return reverse_iterator<const T*>(lls.begin());
248}
249
256template <typename Container>
257MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
258decltype(auto) crbegin(const Container& cont) noexcept(noexcept(cont.crbegin())) {
259 return cont.crbegin();
260}
261
268template <typename Container>
269MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
270decltype(auto) crend(const Container& cont) noexcept(noexcept(cont.crend())) {
271 return cont.crend();
272}
273
281template <typename T, size_t Size>
282MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
283reverse_iterator<const T*> crbegin(T (&arr)[Size]) noexcept {
284 return reverse_iterator<const T*>(arr + Size);
285}
286
294template <typename T, size_t Size>
295MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
296reverse_iterator<const T*> crend(T (&arr)[Size]) noexcept {
297 return reverse_iterator<const T*>(arr);
298}
299
306template <typename Container>
307MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
308decltype(auto) size(const Container& cont) noexcept(noexcept(cont.size())) {
309 return cont.size();
310}
311
319template <typename T, size_t Size>
320MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
321size_t size(T (& arr)[Size]) noexcept {
322 return Size;
323}
324
331template <typename T>
332MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
333size_t size(std::initializer_list<T> lls) noexcept {
334 return lls.size();
335}
336
343template <typename Container>
344MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
345decltype(auto) ssize(const Container& cont) noexcept(noexcept(cont.size())) {
346 using type = make_signed_t<decltype(cont.size())>;
347 return static_cast<common_type_t<ptrdiff_t, type>>(cont.size());
348}
349
357template <typename T, size_t Size>
358MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
359ptrdiff_t ssize(T (& arr)[Size]) noexcept {
360 return Size;
361}
362
369template <typename T>
370MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
371ptrdiff_t ssize(std::initializer_list<T> lls) noexcept {
372 return lls.size();
373}
374
381template <typename Container>
382MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
383bool empty(const Container& cont) noexcept(noexcept(cont.empty())) {
384 return cont.empty();
385}
386
393template <typename T>
394MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
395bool empty(const T* ptr) noexcept {
396 return ptr != nullptr;
397}
398
405template <typename T>
406MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
407bool empty(std::initializer_list<T> lls) noexcept {
408 return lls.size() == 0;
409}
410
417template <typename Container>
418MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
419decltype(auto) data(Container& cont)
420noexcept(noexcept(cont.data())) {
421 return cont.data();
422}
423
430template <typename Container>
431MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
432decltype(auto) data(const Container& cont)
433noexcept(noexcept(cont.data())) {
434 return cont.data();
435}
436
444template <typename T, size_t Size>
445MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
446T* data(T (& arr)[Size]) noexcept {
447 return arr;
448}
449
456template <typename T>
457MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
458T* data(T* ptr) noexcept {
459 return ptr;
460}
461
468template <typename T>
469MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr
470const T* data(std::initializer_list<T> lls) noexcept {
471 return lls.begin();
472}
473 // TypeErasureFunctions
475
477#endif // MSTL_CORE_ALGORITHM_TYPE_ERASE_HPP__
反向迭代器模板类
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
int64_t ptrdiff_t
指针差类型
typename make_signed< T >::type make_signed_t
make_signed的便捷别名
typename common_type< Types... >::type common_type_t
common_type的便捷别名
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr bool empty(const Container &cont) noexcept(noexcept(cont.empty()))
检查容器是否为空
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) ssize(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的有符号大小
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) rend(Container &cont) noexcept(noexcept(cont.rend()))
获取const容器的反向起始迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) cend(const Container &cont) noexcept(noexcept(cont.cend()))
获取const容器的const结束迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) crbegin(const Container &cont) noexcept(noexcept(cont.crbegin()))
获取const容器的const反向起始迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) cbegin(const Container &cont) noexcept(noexcept(cont.cbegin()))
获取const容器的const起始迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) rbegin(Container &cont) noexcept(noexcept(cont.rbegin()))
获取容器的反向起始迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) crend(const Container &cont) noexcept(noexcept(cont.crend()))
获取const容器的const反向结束迭代器
MSTL反向迭代器