#pragma once #include #include #include #include "export.h" #include "def.h" namespace ipc { class IPC_EXPORT buffer { public: using destructor_t = void (*)(void*, std::size_t); buffer(); buffer(void* p, std::size_t s, destructor_t d); buffer(void* p, std::size_t s); template explicit buffer(byte_t const (& data)[N]) : buffer(data, sizeof(data)) { } explicit buffer(char const & c); buffer(buffer&& rhs); ~buffer(); void swap(buffer& rhs); buffer& operator=(buffer rhs); bool empty() const noexcept; void * data() noexcept; void const * data() const noexcept; std::size_t size() const noexcept; std::tuple to_tuple() { return std::make_tuple(data(), size()); } std::tuple to_tuple() const { return std::make_tuple(data(), size()); } std::vector to_vector() const { auto [d, s] = to_tuple(); return { static_cast(d), static_cast(d) + s }; } friend IPC_EXPORT bool operator==(buffer const & b1, buffer const & b2); private: class buffer_; buffer_* p_; }; } // namespace ipc