7#include "../utility/utility.hpp"
8#include "../macros.hpp"
17hi_warning_ignore_msvc(26492);
19hi_warning_ignore_msvc(26403);
20hi_warning_ignore_msvc(26460);
22namespace hi::inline
v1 {
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>
38 placement_ptr(std::span<Byte> bytes,
std::size_t& offset)
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);
55 placement_ptr() =
delete;
56 placement_ptr(placement_ptr
const&) =
delete;
57 placement_ptr(placement_ptr&&) =
delete;
58 placement_ptr& operator=(placement_ptr
const&) =
delete;
59 placement_ptr& operator=(placement_ptr&&) =
delete;
61 value_type *operator->()
const noexcept
66 value_type& operator*()
const noexcept
75template<
typename T,
typename Byte>
76[[nodiscard]]
auto make_placement_ptr(std::span<Byte> bytes,
std::size_t& offset)
81template<
typename T,
typename Byte>
82[[nodiscard]]
auto make_placement_ptr(std::span<Byte> bytes,
std::size_t&& offset = 0)
85 return make_placement_ptr<T>(bytes, _offset);
89class placement_array {
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};
114 placement_array(placement_array
const&) =
delete;
115 placement_array(placement_array&&) =
delete;
116 placement_array& operator=(placement_array
const&) =
delete;
117 placement_array& operator=(placement_array&&) =
delete;
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>
163 return make_placement_array<T>(bytes, _offset, n);
166template<
typename T,
byte_like Byte>
167[[nodiscard]]
auto make_placement_array(std::span<Byte> bytes, std::size_t& offset)
169 hilet n = bytes.size() / ssizeof(T);
170 return make_placement_array<T>(bytes, offset, n);
173template<
typename T,
byte_like Byte>
174[[nodiscard]]
auto make_placement_array(std::span<Byte> bytes, std::size_t&& offset = 0)
176 std::size_t _offset = offset;
177 return make_placement_array<T>(bytes, _offset);
DOXYGEN BUG.
Definition algorithm.hpp:16
Definition placement.hpp:30
Definition placement.hpp:89