#pragma once #include #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; # if __cplusplus >= 201703L template auto data() noexcept -> std::enable_if_t, T*> { return static_cast(data()); } template auto data() const noexcept -> std::enable_if_t, T*> { return static_cast(data()); } # else /*__cplusplus < 201703L*/ template auto data() noexcept -> std::enable_if_t::value, T*> { return static_cast(data()); } template auto data() const noexcept -> std::enable_if_t::value, T*> { return static_cast(data()); } # endif/*__cplusplus < 201703L*/ 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 { # if __cplusplus >= 201703L auto [d, s] = to_tuple(); # else /*__cplusplus < 201703L*/ auto tp = to_tuple(); auto d = std::get<0>(tp); auto s = std::get<1>(tp); # endif/*__cplusplus < 201703L*/ 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