7#include "utility/module.hpp"
14hi_warning_ignore_msvc(26492);
16hi_warning_ignore_msvc(26403);
17hi_warning_ignore_msvc(26460);
19namespace hi::inline
v1 {
21inline bool check_alignment(
void const *ptr)
noexcept
23 return std::bit_cast<uintptr_t>(ptr) %
alignof(T) == 0;
29 static_assert(std::is_trivially_default_constructible_v<T>);
30 static_assert(std::is_trivially_destructible_v<T>);
34 template<
byte_like Byte>
37 if (offset +
sizeof(value_type) > bytes.size()) {
41 auto ptr = bytes.data() + offset;
42 offset +=
sizeof(value_type);
43 std::uninitialized_default_construct_n(
reinterpret_cast<value_type *
>(ptr), 1);
44 _ptr = std::launder(
reinterpret_cast<value_type *
>(ptr));
49 std::destroy_at(_ptr);
58 value_type *operator->()
const noexcept
63 value_type& operator*()
const noexcept
72template<
typename T,
typename Byte>
73[[nodiscard]]
auto make_placement_ptr(std::span<Byte> bytes,
std::size_t& offset)
78template<
typename T,
typename Byte>
79[[nodiscard]]
auto make_placement_ptr(std::span<Byte> bytes,
std::size_t&& offset = 0)
82 return make_placement_ptr<T>(bytes, _offset);
88 static_assert(std::is_trivially_default_constructible_v<T>);
89 static_assert(std::is_trivially_destructible_v<T>);
92 using container_type = std::span<value_type>;
93 using iterator = container_type::iterator;
94 using reference = container_type::reference;
95 using pointer = container_type::pointer;
97 template<
byte_like Byte>
100 if (offset +
n *
sizeof(T) > bytes.size()) {
104 hilet ptr = bytes.data() + offset;
105 offset +=
sizeof(T) *
n;
107 std::uninitialized_default_construct_n(
reinterpret_cast<value_type *
>(ptr),
n);
108 _items = {std::launder(
reinterpret_cast<value_type *
>(ptr)),
n};
118 std::destroy(begin(), end());
121 operator std::span<value_type>()
const noexcept
131 iterator begin()
const noexcept
133 return _items.begin();
136 iterator end()
const noexcept
141 reference operator[](ssize_t offset)
const noexcept
143 return _items[offset];
147 std::span<value_type> _items;
150template<
typename T,
byte_like Byte>
156template<
typename T,
byte_like Byte>
160 return make_placement_array<T>(bytes, _offset, n);
163template<
typename T,
byte_like Byte>
164[[nodiscard]]
auto make_placement_array(std::span<Byte> bytes,
std::size_t& offset)
166 hilet n = bytes.size() / ssizeof(T);
167 return make_placement_array<T>(bytes, offset, n);
170template<
typename T,
byte_like Byte>
171[[nodiscard]]
auto make_placement_array(std::span<Byte> bytes,
std::size_t&& offset = 0)
174 return make_placement_array<T>(bytes, _offset);
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:13
Definition placement.hpp:27
Definition placement.hpp:86
Definition concepts.hpp:36
Definition concepts.hpp:39