0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-07-01 00:08:22 +02:00

Complete the unique_buffer semantics.

This commit is contained in:
Jason Volk 2017-08-15 20:35:34 -06:00
parent 77900b61af
commit ad611c5aa5

View file

@ -63,14 +63,16 @@ struct mutable_buffer
using buffer<char *>::buffer; using buffer<char *>::buffer;
}; };
template<class it, template<class buffer,
size_t align = 16> size_t align = 16>
struct unique_buffer struct unique_buffer
:buffer<it> :buffer
{ {
template<class T> unique_buffer(std::unique_ptr<T[]> &&, const size_t &size); unique_buffer(std::unique_ptr<uint8_t[]> &&, const size_t &size);
unique_buffer(const size_t &size); unique_buffer(const size_t &size);
unique_buffer() = default; unique_buffer() = default;
unique_buffer(unique_buffer &&) noexcept;
unique_buffer(const unique_buffer &) = delete;
~unique_buffer() noexcept; ~unique_buffer() noexcept;
}; };
@ -278,19 +280,21 @@ ircd::buffer::rend(const buffer<it> &buffer)
return std::reverse_iterator<it>(get<0>(buffer)); return std::reverse_iterator<it>(get<0>(buffer));
} }
template<class it, template<class buffer,
size_t alignment> size_t alignment>
template<class T> ircd::buffer::unique_buffer<buffer, alignment>::unique_buffer(std::unique_ptr<uint8_t[]> &&b,
ircd::buffer::unique_buffer<it, alignment>::unique_buffer(std::unique_ptr<T[]> &&b, const size_t &size)
const size_t &size) :buffer
:buffer<it>{it(b.release()), size} {
typename buffer::value_type(b.release()), size
}
{ {
} }
template<class it, template<class buffer,
size_t alignment> size_t alignment>
ircd::buffer::unique_buffer<it, alignment>::unique_buffer(const size_t &size) ircd::buffer::unique_buffer<buffer, alignment>::unique_buffer(const size_t &size)
:unique_buffer :unique_buffer<buffer, alignment>
{ {
std::unique_ptr<uint8_t[]> std::unique_ptr<uint8_t[]>
{ {
@ -301,9 +305,21 @@ ircd::buffer::unique_buffer<it, alignment>::unique_buffer(const size_t &size)
{ {
} }
template<class it, template<class buffer,
size_t alignment> size_t alignment>
ircd::buffer::unique_buffer<it, alignment>::~unique_buffer() ircd::buffer::unique_buffer<buffer, alignment>::unique_buffer(unique_buffer &&other)
noexcept
:buffer
{
std::move(other)
}
{
get<0>(other) = nullptr;
}
template<class buffer,
size_t alignment>
ircd::buffer::unique_buffer<buffer, alignment>::~unique_buffer()
noexcept noexcept
{ {
delete[] data(*this); delete[] data(*this);