33 using unique_array = std::unique_ptr<std::span<T>, std::function<void(std::span<T>*)>>;
42 auto make_unique_array(std::size_t size) {
43 auto buffer = std::make_unique_for_overwrite<std::byte[]>(
sizeof(std::span<T>) + size *
sizeof(T));
44 auto span =
new (buffer.get()) std::span{
new (buffer.get() +
sizeof(std::span<T>)) T[size]{}, size};
45 auto deleter = [size](std::span<T>* inner) {
46 auto data = std::launder(
reinterpret_cast<T*
>(
reinterpret_cast<std::byte*
>(inner) +
sizeof(std::span<T>)));
49 std::ranges::destroy(data, data + size);
50 std::default_delete<std::byte[]>{}(
reinterpret_cast<std::byte*
>(inner));
55 return unique_array<T>{span, deleter};