1#ifndef NEFORCE_CORE_MEMORY_TEMPORARY_BUFFER_HPP__
2#define NEFORCE_CORE_MEMORY_TEMPORARY_BUFFER_HPP__
16NEFORCE_BEGIN_NAMESPACE__
32template <
typename Iterator>
33struct temporary_buffer {
52 NEFORCE_CONSTEXPR20
void allocate_buffer() {
56 len_ = _NEFORCE
min(len_,
max);
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& )
noexcept {}
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) {
76 temporary_buffer() noexcept = default;
78 temporary_buffer(const temporary_buffer&) = delete;
79 temporary_buffer& operator=(const temporary_buffer&) = delete;
81 temporary_buffer(temporary_buffer&& other) noexcept :
82 original_len_(other.original_len_),
84 buffer_(other.buffer_) {
85 other.original_len_ = 0;
87 other.buffer_ =
nullptr;
93 original_len_ = other.original_len_;
95 buffer_ = other.buffer_;
96 other.original_len_ = 0;
98 other.buffer_ =
nullptr;
115 len_ = _NEFORCE
distance(first, last);
116 this->allocate_buffer();
118 this->initialize_buffer(*first);
121 if (buffer_ !=
nullptr) {
136 if (buffer_ !=
nullptr) {
137 _NEFORCE
destroy(buffer_, buffer_ + len_);
146 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
size_type size() const noexcept {
return len_; }
158 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
pointer begin() noexcept {
return buffer_; }
164 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
pointer end() noexcept {
return buffer_ + len_; }
176 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
const_pointer cend() const noexcept {
return buffer_ + len_; }
182 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
bool empty() const noexcept {
return len_ == 0; }
187NEFORCE_END_NAMESPACE__
static constexpr T max() noexcept
获取类型的最大值
static constexpr pointer allocate()
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
获取迭代器的值类型
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
禁止复制赋值
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
常量指针类型