From 26b7723f192ad147479b9d79b1c722fc601fdb6c Mon Sep 17 00:00:00 2001 From: rexy712 Date: Fri, 15 Jul 2022 16:36:54 -0700 Subject: [PATCH] Make buffer actually constexpr-able --- include/rexy/buffer.hpp | 4 ++++ include/rexy/buffer.tpp | 25 +++++++++++++++---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/include/rexy/buffer.hpp b/include/rexy/buffer.hpp index 2368155..3c6a87e 100644 --- a/include/rexy/buffer.hpp +++ b/include/rexy/buffer.hpp @@ -24,6 +24,8 @@ #include //size_t, ptrdiff_t #include //reverse_iterator +#include "storage_for.hpp" + #include "compat/standard.hpp" namespace rexy{ @@ -92,6 +94,8 @@ namespace rexy{ constexpr const_reverse_iterator crbegin(void)const; constexpr const_reverse_iterator crend(void)const; + REXY_CPP20_CONSTEXPR void clear(void); + REXY_CPP20_CONSTEXPR void append(const_pointer p, size_type len); }; diff --git a/include/rexy/buffer.tpp b/include/rexy/buffer.tpp index e335a6e..6014205 100644 --- a/include/rexy/buffer.tpp +++ b/include/rexy/buffer.tpp @@ -21,6 +21,7 @@ #include //exchange, swap #include //max +#include //construct_at namespace rexy{ @@ -33,7 +34,7 @@ namespace rexy{ m_size(length) { for(size_type i = 0;i < length;++i){ - new (m_data + i) T(data[i]); + std::construct_at(m_data + i, data[i]); } } template @@ -48,7 +49,7 @@ namespace rexy{ count = 0; for(auto it = start;it != last;++it){ - new (m_data + count) T(*it); + std::construct_at(m_data + count, *it); ++count; } m_size = count; @@ -65,7 +66,7 @@ namespace rexy{ m_size(b.m_size) { for(size_type i = 0;i < b.m_size;++i){ - new (m_data + i) T(b.m_data[i]); + std::construct_at(m_data + i, b.m_data[i]); } } template @@ -76,7 +77,7 @@ namespace rexy{ template REXY_CPP20_CONSTEXPR buffer::~buffer(void)noexcept(is_nothrow_allocator_v){ for(size_type i = 0;i < m_size;++i){ - m_data[i].~T(); + std::destroy_at(m_data + i); } this->deallocate(m_data, m_cap * sizeof(value_type)); } @@ -106,7 +107,7 @@ namespace rexy{ if(new_cap > m_cap){ buffer tmp(new_cap); for(size_type i = 0;i < m_size;++i){ - new (tmp.m_data + i) T(std::move(m_data[i])); + std::construct_at(tmp.m_data + i, std::move(m_data[i])); } std::swap(tmp.m_data, m_data); } @@ -202,12 +203,16 @@ namespace rexy{ template REXY_CPP20_CONSTEXPR void buffer::append(const_pointer p, size_type len){ if(len + m_size > m_cap){ - resize(std::max(m_cap * 2, len + m_size)); + buffer b(std::max(m_cap * 2, len + m_size)); + b.append(m_data, m_size); + b.append(p, len); + *this = std::move(b); + }else{ + for(size_type i = 0;i < len;++i){ + std::construct_at(m_data + (m_size + i), p[i]); + } + m_size += len; } - for(size_type i = 0;i < len;++i){ - new (m_data + (m_size + i)) T(p[i]); - } - m_size += len; } }