1#ifndef NEFORCE_CORE_MEMORY_MEMORY_VIEW_HPP__
2#define NEFORCE_CORE_MEMORY_MEMORY_VIEW_HPP__
19NEFORCE_BEGIN_NAMESPACE__
38template <
size_t Extent>
39struct extent_storage {
40 constexpr extent_storage() noexcept = default;
42 constexpr extent_storage(const extent_storage&) noexcept = default;
43 constexpr extent_storage& operator=(const extent_storage&) noexcept = default;
45 constexpr extent_storage(extent_storage&&) noexcept = default;
46 constexpr extent_storage& operator=(extent_storage&&) noexcept = default;
48 constexpr extent_storage(
size_t) noexcept {}
49 static constexpr size_t extent() noexcept {
return Extent; }
58 size_t extent_value_ = 0;
61 constexpr extent_storage() noexcept = default;
63 constexpr extent_storage(const extent_storage&) noexcept = default;
64 constexpr extent_storage& operator=(const extent_storage&) noexcept = default;
66 constexpr extent_storage(extent_storage&&) noexcept = default;
67 constexpr extent_storage& operator=(extent_storage&&) noexcept = default;
69 constexpr extent_storage(const
size_t extent_value) noexcept :
70 extent_value_(extent_value) {}
72 constexpr size_t extent() const noexcept {
return extent_value_; }
89template <
typename Element,
size_t Extent = dynamic_extent>
105 template <
typename U,
size_t ArrayExtent, enable_if_t<Extent == dynamic_extent || ArrayExtent == Extent,
int> = 0>
108 template <
typename Ref>
114 template <
typename U,
size_t OE>
115 friend class memory_view;
118 template <
size_t,
size_t Count, enable_if_t<Count != dynamic_extent,
int> = 0>
119 static constexpr size_t view_extent() noexcept {
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;
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 {
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 {
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 {}
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");
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 {
149 template <
size_t Offset,
size_t Count, enable_if_t<Count == dynamic_extent,
int> = 0>
150 constexpr decltype(
auto) view_aux() const noexcept {
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};
169#ifdef NEFORCE_STANDARD_20
170 requires((Extent + 1u) <= 1u)
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
189#ifdef NEFORCE_STANDARD_20
194 memory_view::check_extend<Extent>(
count);
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
210#ifdef NEFORCE_STANDARD_20
224#ifdef NEFORCE_STANDARD_20
237 template <
typename U,
size_t AE>
238#ifdef NEFORCE_STANDARD_20
239 requires is_compatible_array<U, AE>::value
251 template <
typename U,
size_t AE>
252#ifdef NEFORCE_STANDARD_20
253 requires is_compatible_array<const U, AE>::value
263 constexpr memory_view(
const memory_view& other)
noexcept =
default;
273 template <
typename U,
size_t OE>
274#ifdef NEFORCE_STANDARD_20
281 memory_view(
const memory_view<U, OE>& other) noexcept :
283 static_cast<pointer>(other.extent_pair_.value)) {
284 memory_view::check_extend<Extent>(other.size());
292 constexpr memory_view&
operator=(
const memory_view& other)
noexcept =
default;
315 NEFORCE_NODISCARD
constexpr bool empty() const noexcept {
return size() == 0; }
323 return *extent_pair_.value;
332 return *(extent_pair_.value + (
size() - 1));
342 return *(extent_pair_.value + index);
349 NEFORCE_NODISCARD
constexpr pointer data() const noexcept {
return extent_pair_.value; }
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>;
394 return {
data(), count};
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>;
416 return {
data() + (
size() - count), count};
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>();
440 count =
size() - offset;
445 return {
data() + offset, count};
449#ifdef NEFORCE_STANDARD_17
450template <
typename T,
size_t ArrayExtent>
453template <
typename T,
size_t ArrayExtent>
456template <
typename T,
size_t ArrayExtent>
459# ifdef NEFORCE_STANDARD_20
460template <contiguous_iterator Iter,
typename End>
462template <
typename Iter,
typename End>
475NEFORCE_END_NAMESPACE__
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风格数组构造
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
动态范围标记,表示大小在运行时确定
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的便捷别名