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
16NEFORCE_BEGIN_NAMESPACE__
17
23
32template <typename Iterator>
33struct temporary_buffer {
34 static_assert(is_ranges_fwd_iter_v<Iterator>, "temporary buffer requires forward iterator types.");
35
36public:
39 using const_pointer = const value_type*;
41 using const_reference = const value_type&;
42 using size_type = size_t;
45
46private:
47 size_type original_len_ = 0;
48 size_type len_ = 0;
49 pointer buffer_ = nullptr;
50
51private:
52 NEFORCE_CONSTEXPR20 void allocate_buffer() {
53 original_len_ = len_;
54 buffer_ = 0;
55 constexpr size_t max = numeric_traits<uint32_t>::max() / sizeof(value_type);
56 len_ = _NEFORCE min(len_, max);
57
58 while (len_ > 0) {
59 buffer_ = allocator_type::allocate(len_);
60 if (buffer_) {
61 break;
62 }
63 len_ /= 2;
64 }
65 }
66
67 template <typename U = value_type, enable_if_t<is_trivially_copy_assignable_v<U>, int> = 0>
68 NEFORCE_CONSTEXPR20 void initialize_buffer(const U& /*unused*/) noexcept {}
69
70 template <typename U = value_type, enable_if_t<!is_trivially_copy_assignable_v<U>, int> = 0>
71 NEFORCE_CONSTEXPR20 void initialize_buffer(const U& value) {
72 _NEFORCE uninitialized_fill_n(buffer_, len_, value);
73 }
74
75public:
76 temporary_buffer() noexcept = default;
77
78 temporary_buffer(const temporary_buffer&) = delete;
79 temporary_buffer& operator=(const temporary_buffer&) = delete;
80
81 temporary_buffer(temporary_buffer&& other) noexcept :
82 original_len_(other.original_len_),
83 len_(other.len_),
84 buffer_(other.buffer_) {
85 other.original_len_ = 0;
86 other.len_ = 0;
87 other.buffer_ = nullptr;
88 }
90 if (addressof(other) == this) {
91 return *this;
92 }
93 original_len_ = other.original_len_;
94 len_ = other.len_;
95 buffer_ = other.buffer_;
96 other.original_len_ = 0;
97 other.len_ = 0;
98 other.buffer_ = nullptr;
99 return *this;
100 }
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 (...) {
121 if (buffer_ != nullptr) {
123 }
124 buffer_ = 0;
125 len_ = 0;
126 throw;
127 }
128 }
129
135 NEFORCE_CONSTEXPR20 ~temporary_buffer() {
136 if (buffer_ != nullptr) {
137 _NEFORCE destroy(buffer_, buffer_ + len_);
139 }
140 }
141
146 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type size() const noexcept { return len_; }
147
152 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type requested_size() const noexcept { return original_len_; }
153
158 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer begin() noexcept { return buffer_; }
159
164 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer end() noexcept { return buffer_ + len_; }
165
170 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_pointer cbegin() const noexcept { return buffer_; }
171
176 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_pointer cend() const noexcept { return buffer_ + len_; }
177
182 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool empty() const noexcept { return len_ == 0; }
183};
184 // TemporaryBuffer
186
187NEFORCE_END_NAMESPACE__
188#endif // NEFORCE_CORE_MEMORY_TEMPORARY_BUFFER_HPP__
static constexpr T max() noexcept
获取类型的最大值
static constexpr void deallocate(pointer p, const size_type n) noexcept
比较算法
constexpr T * addressof(T &x) noexcept
获取对象的地址
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
constexpr void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
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
指针差类型
constexpr Iterator uninitialized_fill_n(Iterator first, size_t n, const T &x)
在未初始化内存中用指定值填充指定数量的元素
数值特征
标准分配器
constexpr size_type size() const noexcept
获取缓冲区实际大小
standard_allocator< value_type > allocator_type
分配器类型
constexpr size_type requested_size() const noexcept
获取请求的缓冲区大小
ptrdiff_t difference_type
差异类型
const value_type & const_reference
常量引用类型
value_type & reference
引用类型
temporary_buffer & operator=(const temporary_buffer &)=delete
禁止复制赋值
size_t size_type
大小类型
value_type * pointer
指针类型
constexpr ~temporary_buffer()
析构函数
constexpr const_pointer cend() const noexcept
获取常量缓冲区结束迭代器
constexpr pointer end() noexcept
获取缓冲区结束迭代器
constexpr temporary_buffer(Iterator first, Iterator last)
构造函数
constexpr bool empty() const noexcept
检查缓冲区是否为空
constexpr pointer begin() noexcept
获取缓冲区起始迭代器
constexpr const_pointer cbegin() const noexcept
获取常量缓冲区起始迭代器
iter_value_t< Iterator > value_type
元素类型
const value_type * const_pointer
常量指针类型
未初始化内存操作