13#ifndef IOX2_INCLUDE_GUARD_BB_DETAIL_RAW_BYTE_STORAGE_HPP
14#define IOX2_INCLUDE_GUARD_BB_DETAIL_RAW_BYTE_STORAGE_HPP
30template <
typename T, u
int64_t Capacity>
32 static_assert(std::is_standard_layout<T>::value,
"Storage is only valid for standard layout types.");
36 alignas(T)
char m_bytes[
sizeof(T) * Capacity];
47 , m_size(rhs.m_size) {
48 for (uint64_t index = 0; index < m_size; ++index) {
55 , m_size(rhs.m_size) {
56 for (uint64_t index = 0; index < m_size; ++index) {
57 new (
pointer_from_index(index)) T(std::move_if_noexcept(*rhs.pointer_from_index(index)));
61 template <u
int64_t M, std::enable_if_t<(Capacity > M),
bool> =
true>
65 , m_size(rhs.
size()) {
66 for (uint64_t index = 0; index < m_size; ++index) {
71 template <u
int64_t M, std::enable_if_t<(Capacity > M),
bool> =
true>
75 , m_size(rhs.size()) {
76 for (uint64_t index = 0; index < m_size; ++index) {
77 new (
pointer_from_index(index)) T(std::move_if_noexcept(*rhs.pointer_from_index(index)));
82 for (uint64_t i = m_size; i != 0; --i) {
83 uint64_t
const index = i - 1;
90 for (uint64_t i = 0; i < std::min(m_size, rhs.m_size); ++i) {
93 for (uint64_t i = m_size; i < rhs.m_size; ++i) {
97 for (uint64_t i = rhs.m_size; i < m_size; ++i) {
106 && std::is_nothrow_move_assignable<T>::value)
109 for (uint64_t i = 0; i < std::min(m_size, rhs.m_size); ++i) {
112 for (uint64_t i = m_size; i < rhs.m_size; ++i) {
115 for (uint64_t i = rhs.m_size; i < m_size; ++i) {
123 auto constexpr size() const noexcept -> uint64_t {
128 template <
typename... Args>
135 template <
typename... Args>
142 constexpr void insert_at(uint64_t index, uint64_t count, T
const& value) {
143 for (uint64_t i = 0; i < count; ++i) {
156 constexpr void erase_at(uint64_t begin_index, uint64_t end_index) {
157 uint64_t
const range = end_index - begin_index;
163 constexpr void remove_at(uint64_t index, uint64_t range_size) {
166#pragma GCC diagnostic push
167#pragma GCC diagnostic ignored "-Warray-bounds"
169#pragma GCC diagnostic pop
174 for (uint64_t i = m_size; i != target_size; --i) {
175 uint64_t
const index = i - 1;
178 m_size = target_size;
189 return reinterpret_cast<T*
>(m_bytes + (idx *
sizeof(T)));
195 return reinterpret_cast<T const*
>(m_bytes + (idx *
sizeof(T)));
211 using Self = std::remove_reference_t<
decltype(*this)>;
#define IOX2_CONSTEXPR_DTOR
constexpr auto operator=(RawByteStorage const &rhs) -> RawByteStorage &
constexpr void remove_at(uint64_t index, uint64_t range_size)
auto pointer_from_index(uint64_t idx) const -> T const *
constexpr void insert_at(uint64_t index, uint64_t count, T const &value)
auto constexpr size() const noexcept -> uint64_t
constexpr RawByteStorage() noexcept
constexpr void shrink_from_back(uint64_t target_size)
constexpr RawByteStorage(RawByteStorage< T, M > &&rhs) noexcept
auto pointer_from_index(uint64_t idx) -> T *
constexpr RawByteStorage(RawByteStorage< T, M > const &rhs)
IOX2_CONSTEXPR_DTOR ~RawByteStorage()
constexpr RawByteStorage(RawByteStorage &&rhs) noexcept
constexpr void emplace_back(Args &&... args)
constexpr RawByteStorage(RawByteStorage const &rhs)
constexpr auto operator=(RawByteStorage &&rhs) noexcept(std::is_nothrow_move_constructible< T >::value &&std::is_nothrow_move_assignable< T >::value) -> RawByteStorage &
constexpr void erase_at(uint64_t begin_index, uint64_t end_index)
constexpr void erase_at(uint64_t index)
constexpr void rotate_from_back(uint64_t index_to, uint64_t index_first_from)
constexpr auto static_memory_layout_metrics() noexcept -> StorageMemoryLayoutMetrics
constexpr void emplace_at(uint64_t index, Args &&... args)