NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
temporary_buffer.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_MEMORY_TEMPORARY_BUFFER_HPP__
2#define NEFORCE_CORE_MEMORY_TEMPORARY_BUFFER_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
22
31template <typename Iterator>
33 static_assert(is_ranges_fwd_iter_v<Iterator>, "temporary buffer requires forward iterator types.");
34
35public:
38 using const_pointer = const value_type*;
40 using const_reference = const value_type&;
41 using size_type = size_t;
44
45private:
46 size_type original_len_ = 0;
47 size_type len_ = 0;
48 pointer buffer_ = nullptr;
49
50private:
58 NEFORCE_CONSTEXPR20 void allocate_buffer() {
59 original_len_ = len_;
60 buffer_ = 0;
61 constexpr size_t max = numeric_traits<uint32_t>::max() / sizeof(value_type);
62 if (len_ > max) {
63 len_ = max;
64 }
65
66 while (len_ > 0) {
67 buffer_ = allocator_type::allocate(len_);
68 if (buffer_) {
69 break;
70 }
71 len_ /= 2;
72 }
73 }
74
82 template <typename U = value_type, enable_if_t<is_trivially_copy_assignable_v<U>, int> = 0>
83 NEFORCE_CONSTEXPR20 void initialize_buffer(const U& val) noexcept {}
84
93 template <typename U = value_type, enable_if_t<!is_trivially_copy_assignable_v<U>, int> = 0>
94 NEFORCE_CONSTEXPR20 void initialize_buffer(const U& val) {
95 _NEFORCE uninitialized_fill_n(buffer_, len_, val);
96 }
97
98public:
100 void operator=(const temporary_buffer&) = delete;
101
113 NEFORCE_CONSTEXPR20 temporary_buffer(Iterator first, Iterator last) {
114 try {
115 len_ = _NEFORCE distance(first, last);
116 this->allocate_buffer();
117 if (len_ > 0) {
118 this->initialize_buffer(*first);
119 }
120 } catch (...) {
122 buffer_ = 0;
123 len_ = 0;
124 throw;
125 }
126 }
127
133 NEFORCE_CONSTEXPR20 ~temporary_buffer() {
134 _NEFORCE destroy(buffer_, buffer_ + len_);
136 }
137
142 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type size() const noexcept { return len_; }
143
148 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type requested_size() const noexcept { return original_len_; }
149
154 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer begin() noexcept { return buffer_; }
155
160 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer end() noexcept { return buffer_ + len_; }
161
166 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_pointer cbegin() const noexcept { return buffer_; }
167
172 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_pointer cend() const noexcept { return buffer_ + len_; }
173
178 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool empty() const noexcept { return len_ == 0; }
179};
180 // TemporaryBuffer
182
183NEFORCE_END_NAMESPACE__
184#endif // NEFORCE_CORE_MEMORY_TEMPORARY_BUFFER_HPP__
static NEFORCE_NODISCARD constexpr T max() noexcept
获取类型的最大值
static NEFORCE_CONSTEXPR20 void deallocate(pointer p, const size_type n) noexcept
NEFORCE_ALLOC_NODISCARD NEFORCE_CONSTEXPR20 static NEFORCE_ALLOC_OPTIMIZE pointer allocate()
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
NEFORCE_CONSTEXPR20 void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
NEFORCE_INLINE17 constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
uint64_t size_t
无符号大小类型
int64_t ptrdiff_t
指针差类型
NEFORCE_CONSTEXPR20 Iterator uninitialized_fill_n(Iterator first, size_t n, const T &x)
在未初始化内存中用指定值填充指定数量的元素
数值特征
标准分配器
standard_allocator< value_type > allocator_type
分配器类型
NEFORCE_CONSTEXPR20 temporary_buffer(Iterator first, Iterator last)
构造函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer end() noexcept
获取缓冲区结束迭代器
temporary_buffer(const temporary_buffer &)=delete
禁止复制构造
ptrdiff_t difference_type
差异类型
void operator=(const temporary_buffer &)=delete
禁止复制赋值
const value_type & const_reference
常量引用类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool empty() const noexcept
检查缓冲区是否为空
value_type & reference
引用类型
size_t size_type
大小类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type requested_size() const noexcept
获取请求的缓冲区大小
value_type * pointer
指针类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer begin() noexcept
获取缓冲区起始迭代器
NEFORCE_CONSTEXPR20 ~temporary_buffer()
析构函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_pointer cend() const noexcept
获取常量缓冲区结束迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type size() const noexcept
获取缓冲区实际大小
iter_value_t< Iterator > value_type
元素类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_pointer cbegin() const noexcept
获取常量缓冲区起始迭代器
const value_type * const_pointer
常量指针类型
未初始化内存操作