/** This file is a part of rexy's general purpose library Copyright (C) 2021 rexy712 This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ #ifndef REXY_BUFFER_TPP #define REXY_BUFFER_TPP #include //memcpy #include //exchange, swap namespace rexy{ template constexpr buffer::buffer(void){} template buffer::buffer(size_type cap)noexcept(noexcept(this->allocate(0))): m_data(this->allocate(sizeof(value_type) * cap)), m_cap(cap), m_size(0){} template buffer::buffer(const buffer& b)noexcept(noexcept(this->allocate(0))): m_data(this->allocate(sizeof(value_type) * b.m_cap)), m_cap(b.m_cap), m_size(b.m_size) { memcpy(m_data, b.m_data, m_cap * sizeof(value_type)); } template constexpr buffer::buffer(buffer&& b)noexcept: m_data(std::exchange(b.m_data, nullptr)), m_cap(b.m_cap), m_size(b.m_size){} template buffer::~buffer(void)noexcept(noexcept(this->deallocate(nullptr, 0))){ this->deallocate(m_data, m_cap * sizeof(value_type)); } template buffer& buffer::operator=(const buffer& b) noexcept(noexcept(this->allocate(0)) && noexcept(this->deallocate(nullptr, 0))) { return (*this = buffer(b)); } template constexpr buffer& buffer::operator=(buffer&& b)noexcept{ std::swap(m_data, b.m_data); m_cap = b.m_cap; m_size = b.m_size; return *this; } template constexpr auto buffer::data(void) -> pointer{ return m_data; } template constexpr auto buffer::data(void)const -> const_pointer{ return m_data; } template void buffer::resize(size_type new_cap){ if(new_cap > m_cap){ buffer tmp(new_cap); memcpy(tmp.m_data, m_data, m_cap * sizeof(value_type)); std::swap(tmp.m_data, m_data); } m_cap = new_cap; } template constexpr void buffer::set_size(size_type size){ m_size = size; } template constexpr auto buffer::cap(void)const -> size_type{ return m_cap; } template constexpr auto buffer::size(void)const -> const size_type&{ return m_size; } template constexpr auto buffer::size(void) -> size_type&{ return m_size; } template constexpr auto buffer::release(void) -> pointer{ return std::exchange(m_data, nullptr); } template constexpr auto buffer::operator[](size_type i) -> reference{ return m_data[i]; } template constexpr auto buffer::operator[](size_type i)const -> const_reference{ return m_data[i]; } template constexpr auto buffer::at(size_type i) -> reference{ return m_data[i]; } template constexpr auto buffer::at(size_type i)const -> const_reference{ return m_data[i]; } template constexpr auto buffer::begin(void) -> iterator{ return m_data; } template constexpr auto buffer::begin(void)const -> const_iterator{ return m_data; } template constexpr auto buffer::cbegin(void)const -> const_iterator{ return m_data; } template constexpr auto buffer::end(void) -> iterator{ return m_data + m_cap; } template constexpr auto buffer::end(void)const -> const_iterator{ return m_data + m_cap; } template constexpr auto buffer::cend(void)const -> const_iterator{ return m_data + m_cap; } template constexpr auto buffer::rbegin(void) -> reverse_iterator{ return reverse_iterator(m_data + m_size); } template constexpr auto buffer::rbegin(void)const -> const_reverse_iterator{ return const_reverse_iterator(m_data + m_size); } template constexpr auto buffer::rend(void) -> reverse_iterator{ return reverse_iterator(m_data - 1); } template constexpr auto buffer::rend(void)const -> const_reverse_iterator{ return const_reverse_iterator(m_data - 1); } template constexpr auto buffer::crbegin(void)const -> const_reverse_iterator{ return const_reverse_iterator(m_data + m_size); } template constexpr auto buffer::crend(void)const -> const_reverse_iterator{ return const_reverse_iterator(m_data - 1); } } #endif