NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
type_erase.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_TYPE_ERASE_HPP__
2#define NEFORCE_CORE_ALGORITHM_TYPE_ERASE_HPP__
3
11
12#include <initializer_list>
14NEFORCE_BEGIN_NAMESPACE__
15
21
28template <typename Container>
29NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
30begin(Container& cont) noexcept(noexcept(cont.begin())) {
31 return cont.begin();
32}
33
40template <typename Container>
41NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) end(Container& cont) noexcept(noexcept(cont.end())) {
42 return cont.end();
43}
44
51template <typename Container>
52NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
53begin(const Container& cont) noexcept(noexcept(cont.begin())) {
54 return cont.begin();
55}
56
63template <typename Container>
64NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
65end(const Container& cont) noexcept(noexcept(cont.end())) {
66 return cont.end();
67}
68
76template <typename T, size_t Size>
77NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr T* begin(T (&arr)[Size]) noexcept {
78 return arr;
79}
80
89template <typename T, size_t Size>
90NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr T* end(T (&arr)[Size]) noexcept {
91 return arr + Size;
92}
93
100template <typename Container>
101NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
102cbegin(const Container& cont) noexcept(noexcept(cont.cbegin())) {
103 return cont.cbegin();
104}
105
112template <typename Container>
113NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
114cend(const Container& cont) noexcept(noexcept(cont.cend())) {
115 return cont.cend();
116}
117
125template <typename T, size_t Size>
126NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const T* cbegin(T (&arr)[Size]) noexcept {
127 return arr;
128}
129
138template <typename T, size_t Size>
139NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const T* cend(T (&arr)[Size]) noexcept {
140 return arr + Size;
141}
142
149template <typename Container>
150NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
151rbegin(Container& cont) noexcept(noexcept(cont.rbegin())) {
152 return cont.rbegin();
153}
154
161template <typename Container>
162NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) rend(Container& cont) noexcept(noexcept(cont.rend())) {
163 return cont.rend();
164}
165
172template <typename Container>
173NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
174rbegin(const Container& cont) noexcept(noexcept(cont.rbegin())) {
175 return cont.rbegin();
176}
177
184template <typename Container>
185NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
186rend(const Container& cont) noexcept(noexcept(cont.rend())) {
187 return cont.rend();
188}
189
197template <typename T, size_t Size>
198NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reverse_iterator<T*> rbegin(T (&arr)[Size]) noexcept {
199 return reverse_iterator<T*>(arr + Size);
200}
201
209template <typename T, size_t Size>
210NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reverse_iterator<T*> rend(T (&arr)[Size]) noexcept {
211 return reverse_iterator<T*>(arr);
212}
213
220template <typename T>
221NEFORCE_NODISCARD constexpr reverse_iterator<const T*> rbegin(std::initializer_list<T> lls) noexcept {
222 return reverse_iterator<const T*>(lls.end());
223}
224
231template <typename T>
232NEFORCE_NODISCARD constexpr reverse_iterator<const T*> rend(std::initializer_list<T> lls) noexcept {
233 return reverse_iterator<const T*>(lls.begin());
234}
235
242template <typename Container>
243NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
244crbegin(const Container& cont) noexcept(noexcept(cont.crbegin())) {
245 return cont.crbegin();
246}
247
254template <typename Container>
255NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
256crend(const Container& cont) noexcept(noexcept(cont.crend())) {
257 return cont.crend();
258}
259
267template <typename T, size_t Size>
268NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reverse_iterator<const T*> crbegin(T (&arr)[Size]) noexcept {
269 return reverse_iterator<const T*>(arr + Size);
270}
271
279template <typename T, size_t Size>
280NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reverse_iterator<const T*> crend(T (&arr)[Size]) noexcept {
281 return reverse_iterator<const T*>(arr);
282}
283
290template <typename Container>
291NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
292size(const Container& cont) noexcept(noexcept(cont.size())) {
293 return cont.size();
294}
295
303template <typename T, size_t Size>
304NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr size_t size(T (&arr)[Size]) noexcept {
305 return Size;
306}
307
314template <typename T>
315NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr size_t size(std::initializer_list<T> lls) noexcept {
316 return lls.size();
317}
318
325template <typename Container>
326NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
327ssize(const Container& cont) noexcept(noexcept(cont.size())) {
328 using type = make_signed_t<decltype(cont.size())>;
329 return static_cast<common_type_t<ptrdiff_t, type>>(cont.size());
330}
331
339template <typename T, size_t Size>
340NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr ptrdiff_t ssize(T (&arr)[Size]) noexcept {
341 return Size;
342}
343
350template <typename T>
351NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr ptrdiff_t ssize(std::initializer_list<T> lls) noexcept {
352 return lls.size();
353}
354
361template <typename Container>
362NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr bool empty(const Container& cont) noexcept(noexcept(cont.empty())) {
363 return cont.empty();
364}
365
372template <typename T>
373NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr bool empty(const T* ptr) noexcept {
374 return ptr != nullptr;
375}
376
383template <typename T>
384NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr bool empty(std::initializer_list<T> lls) noexcept {
385 return lls.size() == 0;
386}
387
394template <typename Container>
395NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container& cont) noexcept(noexcept(cont.data())) {
396 return cont.data();
397}
398
405template <typename Container>
406NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto)
407data(const Container& cont) noexcept(noexcept(cont.data())) {
408 return cont.data();
409}
410
418template <typename T, size_t Size>
419NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr T* data(T (&arr)[Size]) noexcept {
420 return arr;
421}
422
429template <typename T>
430NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr T* data(T* ptr) noexcept {
431 return ptr;
432}
433
440template <typename T>
441NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const T* data(std::initializer_list<T> lls) noexcept {
442 return lls.begin();
443}
444 // TypeErasureFunctions
446
447NEFORCE_END_NAMESPACE__
448#endif // NEFORCE_CORE_ALGORITHM_TYPE_ERASE_HPP__
反向迭代器模板类
int64_t ptrdiff_t
指针差类型
typename make_signed< T >::type make_signed_t
make_signed的便捷别名
typename common_type< Types... >::type common_type_t
common_type的便捷别名
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) rbegin(Container &cont) noexcept(noexcept(cont.rbegin()))
获取容器的反向起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) crend(const Container &cont) noexcept(noexcept(cont.crend()))
获取const容器的const反向结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) rend(Container &cont) noexcept(noexcept(cont.rend()))
获取const容器的反向起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr bool empty(const Container &cont) noexcept(noexcept(cont.empty()))
检查容器是否为空
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) cbegin(const Container &cont) noexcept(noexcept(cont.cbegin()))
获取const容器的const起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) ssize(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的有符号大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) cend(const Container &cont) noexcept(noexcept(cont.cend()))
获取const容器的const结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) crbegin(const Container &cont) noexcept(noexcept(cont.crbegin()))
获取const容器的const反向起始迭代器
反向迭代器