7#include "../utility/utility.hpp"
8#include "../macros.hpp"
17hi_warning_ignore_msvc(26492);
19hi_warning_ignore_msvc(26403);
20hi_warning_ignore_msvc(26460);
24inline bool check_alignment(
void const *ptr)
noexcept
26 return std::bit_cast<uintptr_t>(ptr) %
alignof(T) == 0;
32 static_assert(std::is_trivially_default_constructible_v<T>);
33 static_assert(std::is_trivially_destructible_v<T>);
37 template<
byte_like Byte>
40 if (offset +
sizeof(value_type) > bytes.size()) {
44 auto ptr = bytes.data() + offset;
45 offset +=
sizeof(value_type);
46 std::uninitialized_default_construct_n(
reinterpret_cast<value_type *
>(ptr), 1);
47 _ptr = std::launder(
reinterpret_cast<value_type *
>(ptr));
52 std::destroy_at(_ptr);
61 value_type *operator->()
const noexcept
66 value_type& operator*()
const noexcept
75template<
typename T,
typename Byte>
81template<
typename T,
typename Byte>
91 static_assert(std::is_trivially_default_constructible_v<T>);
92 static_assert(std::is_trivially_destructible_v<T>);
95 using container_type = std::span<value_type>;
96 using iterator = container_type::iterator;
97 using reference = container_type::reference;
98 using pointer = container_type::pointer;
100 template<
byte_like Byte>
103 if (offset + n *
sizeof(T) > bytes.size()) {
107 hilet ptr = bytes.data() + offset;
108 offset +=
sizeof(T) * n;
110 std::uninitialized_default_construct_n(
reinterpret_cast<value_type *
>(ptr), n);
111 _items = {std::launder(
reinterpret_cast<value_type *
>(ptr)), n};
121 std::destroy(begin(), end());
124 operator std::span<value_type>()
const noexcept
134 iterator begin()
const noexcept
136 return _items.begin();
139 iterator end()
const noexcept
144 reference operator[](ssize_t offset)
const noexcept
146 return _items[offset];
150 std::span<value_type> _items;
153template<
typename T,
byte_like Byte>
159template<
typename T,
byte_like Byte>
166template<
typename T,
byte_like Byte>
169 hilet n =
bytes.size() / ssizeof(T);
173template<
typename T,
byte_like Byte>
DOXYGEN BUG.
Definition algorithm.hpp:16
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
Definition placement.hpp:30
Definition placement.hpp:89