NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
memory_view.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_MEMORY_MEMORY_VIEW_HPP__
2#define NEFORCE_CORE_MEMORY_MEMORY_VIEW_HPP__
3
12
19NEFORCE_BEGIN_NAMESPACE__
20
26
28NEFORCE_INLINE17 constexpr size_t dynamic_extent = numeric_traits<size_t>::max();
29
31NEFORCE_BEGIN_INNER__
32
38template <size_t Extent>
39struct extent_storage {
40 constexpr extent_storage() noexcept = default;
41
42 constexpr extent_storage(const extent_storage&) noexcept = default;
43 constexpr extent_storage& operator=(const extent_storage&) noexcept = default;
44
45 constexpr extent_storage(extent_storage&&) noexcept = default;
46 constexpr extent_storage& operator=(extent_storage&&) noexcept = default;
47
48 constexpr extent_storage(size_t) noexcept {}
49 static constexpr size_t extent() noexcept { return Extent; }
50};
51
55template <>
56struct extent_storage<dynamic_extent> {
57private:
58 size_t extent_value_ = 0;
59
60public:
61 constexpr extent_storage() noexcept = default;
62
63 constexpr extent_storage(const extent_storage&) noexcept = default;
64 constexpr extent_storage& operator=(const extent_storage&) noexcept = default;
65
66 constexpr extent_storage(extent_storage&&) noexcept = default;
67 constexpr extent_storage& operator=(extent_storage&&) noexcept = default;
68
69 constexpr extent_storage(const size_t extent_value) noexcept :
70 extent_value_(extent_value) {}
71
72 constexpr size_t extent() const noexcept { return extent_value_; }
73};
74
75NEFORCE_END_INNER__
77
78
89template <typename Element, size_t Extent = dynamic_extent>
90class memory_view {
91public:
92 using element_type = Element;
93
95 using size_type = size_t;
97 using pointer = Element*;
98 using const_pointer = const Element*;
103
104private:
105 template <typename U, size_t ArrayExtent, enable_if_t<Extent == dynamic_extent || ArrayExtent == Extent, int> = 0>
106 using is_compatible_array = is_array_convertible<Element, U>;
107
108 template <typename Ref>
110
113
114 template <typename U, size_t OE>
115 friend class memory_view;
116
117private:
118 template <size_t, size_t Count, enable_if_t<Count != dynamic_extent, int> = 0>
119 static constexpr size_t view_extent() noexcept {
120 return Count;
121 }
122
123 template <size_t Offset, size_t Count, enable_if_t<Count == dynamic_extent && Extent != dynamic_extent, int> = 0>
124 static constexpr size_t view_extent() noexcept {
125 return Extent - Offset;
126 }
127
128 template <size_t, size_t Count, enable_if_t<Count == dynamic_extent && Extent == dynamic_extent, int> = 0>
129 static constexpr size_t view_extent() noexcept {
130 return dynamic_extent;
131 }
132
133 template <size_t UE = Extent, enable_if_t<UE != dynamic_extent, int> = 0>
134 static NEFORCE_ALWAYS_INLINE constexpr void check_extend(const size_t count) noexcept {
135 NEFORCE_CONSTEXPR_ASSERT(count == Extent);
136 }
137 template <size_t UE = Extent, enable_if_t<UE == dynamic_extent, int> = 0>
138 static NEFORCE_ALWAYS_INLINE constexpr void check_extend(const size_t) noexcept {}
139
140 template <size_t UE = Extent, enable_if_t<UE != dynamic_extent, int> = 0>
141 NEFORCE_ALWAYS_INLINE constexpr void check_count(const size_t Count) const noexcept {
142 static_assert(Count <= Extent, "COunt must less than Extend");
143 }
144 template <size_t UE = Extent, enable_if_t<UE == dynamic_extent, int> = 0>
145 NEFORCE_ALWAYS_INLINE constexpr void check_count(const size_t Count) const noexcept {
147 }
148
149 template <size_t Offset, size_t Count, enable_if_t<Count == dynamic_extent, int> = 0>
150 constexpr decltype(auto) view_aux() const noexcept {
152 return view{data() + Offset, size() - Offset};
153 }
154 template <size_t Offset, size_t Count, enable_if_t<Count != dynamic_extent, int> = 0>
155 constexpr decltype(auto) view_aux() const noexcept {
157 memory_view::check_count<Extent>(Count);
158 memory_view::check_count<Extent>(Count + Offset);
159 return view{data() + Offset, Count};
160 }
161
162public:
168 constexpr memory_view() noexcept
169#ifdef NEFORCE_STANDARD_20
170 requires((Extent + 1u) <= 1u)
171#endif
172 :
173 extent_pair_(exact_arg_construct_tag{}, 0, nullptr) {
174 }
175
184 template <typename Iterator, enable_if_t<is_cot_iter_v<Iterator>, int> = 0>
185#ifdef NEFORCE_STANDARD_20
186 requires is_compatible_ref<iter_reference_t<Iterator>>::value
187#endif
188 constexpr
189#ifdef NEFORCE_STANDARD_20
190 explicit(Extent != dynamic_extent)
191#endif
192 memory_view(Iterator first, size_type count) noexcept :
193 extent_pair_(exact_arg_construct_tag{}, count, _NEFORCE to_address(first)) {
194 memory_view::check_extend<Extent>(count);
195 }
196
205 template <typename Iterator, enable_if_t<is_cot_iter_v<Iterator>, int> = 0>
206#ifdef NEFORCE_STANDARD_20
207 requires is_compatible_ref<iter_reference_t<Iterator>>::value
208#endif
209 constexpr
210#ifdef NEFORCE_STANDARD_20
211 explicit(Extent != dynamic_extent)
212#endif
213 memory_view(Iterator first, Iterator last) noexcept(noexcept(_NEFORCE distance(first, last))) :
214 extent_pair_(exact_arg_construct_tag{}, static_cast<size_type>(last - first), _NEFORCE to_address(first)) {
215 memory_view::check_extend<Extent>(_NEFORCE distance(first, last));
216 }
217
223 template <size_t AE>
224#ifdef NEFORCE_STANDARD_20
225 requires(Extent == dynamic_extent || AE == Extent)
226#endif
227 constexpr memory_view(type_identity_t<element_type> (&arr)[AE]) noexcept :
228 memory_view(static_cast<pointer>(arr), AE) {
229 }
230
237 template <typename U, size_t AE>
238#ifdef NEFORCE_STANDARD_20
239 requires is_compatible_array<U, AE>::value
240#endif
241 constexpr memory_view(array<U, AE>& arr) noexcept :
242 memory_view(static_cast<pointer>(arr.data()), AE) {
243 }
244
251 template <typename U, size_t AE>
252#ifdef NEFORCE_STANDARD_20
253 requires is_compatible_array<const U, AE>::value
254#endif
255 constexpr memory_view(const array<U, AE>& arr) noexcept :
256 memory_view(static_cast<pointer>(arr.data()), AE) {
257 }
258
263 constexpr memory_view(const memory_view& other) noexcept = default;
264
273 template <typename U, size_t OE>
274#ifdef NEFORCE_STANDARD_20
275 requires(Extent == dynamic_extent || OE == dynamic_extent || Extent == OE) && is_array_convertible_v<Element, U>
276#endif
277 constexpr
279 explicit(Extent != dynamic_extent && OE == dynamic_extent)
280#endif
281 memory_view(const memory_view<U, OE>& other) noexcept :
282 extent_pair_(exact_arg_construct_tag{}, other.extent_pair_.get_base(),
283 static_cast<pointer>(other.extent_pair_.value)) {
284 memory_view::check_extend<Extent>(other.size());
285 }
286
292 constexpr memory_view& operator=(const memory_view& other) noexcept = default;
293
297 NEFORCE_CONSTEXPR20 ~memory_view() noexcept = default;
298
303 NEFORCE_NODISCARD constexpr size_type size() const noexcept { return extent_pair_.get_base().extent(); }
304
309 NEFORCE_NODISCARD constexpr size_type size_bytes() const noexcept { return size() * sizeof(element_type); }
310
315 NEFORCE_NODISCARD constexpr bool empty() const noexcept { return size() == 0; }
316
321 NEFORCE_NODISCARD constexpr reference front() const noexcept {
323 return *extent_pair_.value;
324 }
325
330 NEFORCE_NODISCARD constexpr reference back() const noexcept {
332 return *(extent_pair_.value + (size() - 1));
333 }
334
340 NEFORCE_NODISCARD constexpr reference operator[](size_type index) const noexcept {
342 return *(extent_pair_.value + index);
343 }
344
349 NEFORCE_NODISCARD constexpr pointer data() const noexcept { return extent_pair_.value; }
350
355 NEFORCE_NODISCARD constexpr iterator begin() const noexcept { return iterator(extent_pair_.value); }
356
361 NEFORCE_NODISCARD constexpr iterator end() const noexcept { return iterator(extent_pair_.value + size()); }
362
367 NEFORCE_NODISCARD constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator(end()); }
368
373 NEFORCE_NODISCARD constexpr reverse_iterator rend() const noexcept { return reverse_iterator(begin()); }
374
380 template <size_t Count>
381 constexpr memory_view<element_type, Count> first() const noexcept {
382 memory_view::check_count<Extent>(Count);
383 using view = memory_view<element_type, Count>;
384 return view{data(), Count};
385 }
386
392 constexpr memory_view<element_type> first(size_type count) const noexcept {
393 NEFORCE_CONSTEXPR_ASSERT(count <= size());
394 return {data(), count};
395 }
396
402 template <size_t Count>
403 constexpr memory_view<element_type, Count> last() const noexcept {
404 memory_view::check_count<Extent>(Count);
405 using view = memory_view<element_type, Count>;
406 return view{data() + (size() - Count), Count};
407 }
408
414 constexpr memory_view<element_type> last(size_type count) const noexcept {
415 NEFORCE_CONSTEXPR_ASSERT(count <= size());
416 return {data() + (size() - count), count};
417 }
418
425 template <size_t Offset, size_t Count = dynamic_extent>
426 constexpr auto view() const noexcept -> memory_view<element_type, view_extent<Offset, Count>()> {
427 memory_view::check_count<Extent>(Offset);
428 return this->template view_aux<Offset, Count>();
429 }
430
437 constexpr memory_view<element_type> view(size_type offset, size_type count = dynamic_extent) const noexcept {
438 NEFORCE_CONSTEXPR_ASSERT(offset <= size());
439 if (count == dynamic_extent) {
440 count = size() - offset;
441 } else {
442 NEFORCE_CONSTEXPR_ASSERT(count <= size());
443 NEFORCE_CONSTEXPR_ASSERT(offset + count <= size());
444 }
445 return {data() + offset, count};
446 }
447};
448
449#ifdef NEFORCE_STANDARD_17
450template <typename T, size_t ArrayExtent>
451memory_view(T (&)[ArrayExtent]) -> memory_view<T, ArrayExtent>;
452
453template <typename T, size_t ArrayExtent>
455
456template <typename T, size_t ArrayExtent>
458
459# ifdef NEFORCE_STANDARD_20
460template <contiguous_iterator Iter, typename End>
461# else
462template <typename Iter, typename End>
463# endif
465#endif
466
469
472 // MemoryView
474
475NEFORCE_END_NAMESPACE__
476#endif // NEFORCE_CORE_MEMORY_MEMORY_VIEW_HPP__
固定大小数组容器
调试断点和断言工具
固定大小数组容器
内存视图模板
Element * pointer
指针类型
NEFORCE_NODISCARD constexpr bool empty() const noexcept
检查是否为空
NEFORCE_NODISCARD constexpr iterator begin() const noexcept
获取起始迭代器
NEFORCE_NODISCARD constexpr reverse_iterator rbegin() const noexcept
获取反向起始迭代器
NEFORCE_NODISCARD constexpr size_type size() const noexcept
获取元素数量
constexpr memory_view(array< U, AE > &arr) noexcept
从array容器构造
const element_type & const_reference
常量引用类型
NEFORCE_CONSTEXPR20 ~memory_view() noexcept=default
析构函数
NEFORCE_NODISCARD constexpr pointer data() const noexcept
获取数据指针
constexpr memory_view< element_type > view(size_type offset, size_type count=dynamic_extent) const noexcept
获取子视图(运行时偏移和大小)
constexpr memory_view & operator=(const memory_view &other) noexcept=default
拷贝赋值运算符
remove_cv_t< Element > value_type
值类型
NEFORCE_NODISCARD constexpr size_type size_bytes() const noexcept
获取字节数
ptrdiff_t difference_type
差值类型
constexpr memory_view< element_type, Count > last() const noexcept
NEFORCE_NODISCARD constexpr reference back() const noexcept
访问最后一个元素
NEFORCE_NODISCARD constexpr reference operator[](size_type index) const noexcept
下标访问操作符
_NEFORCE reverse_iterator< iterator > reverse_iterator
反向迭代器类型
constexpr memory_view(const memory_view &other) noexcept=default
拷贝构造函数
constexpr memory_view(type_identity_t< element_type >(&arr)[AE]) noexcept
从C风格数组构造
size_t size_type
大小类型
Element element_type
元素类型
element_type & reference
引用类型
constexpr memory_view(const array< U, AE > &arr) noexcept
从常量array容器构造
normal_iterator< pointer > iterator
迭代器类型
const Element * const_pointer
常量指针类型
constexpr memory_view< element_type > first(size_type count) const noexcept
获取前count个元素的视图(运行时大小)
constexpr memory_view() noexcept
默认构造函数
constexpr memory_view< element_type > last(size_type count) const noexcept
获取后count个元素的视图(运行时大小)
NEFORCE_NODISCARD constexpr reference front() const noexcept
访问第一个元素
NEFORCE_NODISCARD constexpr iterator end() const noexcept
获取结束迭代器
constexpr memory_view< element_type, Count > first() const noexcept
constexpr auto view() const noexcept -> memory_view< element_type, view_extent< Offset, Count >()>
获取子视图(编译时偏移和大小)
NEFORCE_NODISCARD constexpr reverse_iterator rend() const noexcept
获取反向结束迭代器
标准迭代器适配器
static NEFORCE_NODISCARD constexpr T max() noexcept
获取类型的最大值
压缩对实现
is_convertible< FromElement(*)[], ToElement(*)[]> is_array_convertible
判断数组元素类型FromElement是否可以转换为ToElement
NEFORCE_INLINE17 constexpr bool is_array_convertible_v
is_array_convertible的便捷变量模板
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
#define NEFORCE_STANDARD_20
使用C++20或更高标准编译
#define NEFORCE_CONSTEXPR_ASSERT(COND)
编译时常量断言
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
memory_view< byte_t > byte_view
字节视图类型别名
memory_view< const byte_t > cbyte_view
常量字节视图类型别名
NEFORCE_INLINE17 constexpr size_t dynamic_extent
动态范围标记,表示大小在运行时确定
uint64_t size_t
无符号大小类型
int64_t ptrdiff_t
指针差类型
constexpr decltype(auto) to_address(const Ptr &ptr) noexcept
安全地获取任意指针类型指向的地址
typename remove_cv< T >::type remove_cv_t
remove_cv的便捷别名
typename type_identity< T >::type type_identity_t
type_identity的便捷别名
标准迭代器适配器
数值特征
反向迭代器
压缩对主模板,使用EBCO优化
精确参数构造标签
查询数组指定维度的大小