| #include "libipc/buffer.h" |
| #include "libipc/utility/pimpl.h" |
|
|
| #include <cstring> |
|
|
| namespace ipc { |
|
|
| bool operator==(buffer const & b1, buffer const & b2) { |
| return (b1.size() == b2.size()) && (std::memcmp(b1.data(), b2.data(), b1.size()) == 0); |
| } |
|
|
| bool operator!=(buffer const & b1, buffer const & b2) { |
| return !(b1 == b2); |
| } |
|
|
| class buffer::buffer_ : public pimpl<buffer_> { |
| public: |
| void* p_; |
| std::size_t s_; |
| void* a_; |
| buffer::destructor_t d_; |
|
|
| buffer_(void* p, std::size_t s, buffer::destructor_t d, void* a) |
| : p_(p), s_(s), a_(a), d_(d) { |
| } |
|
|
| ~buffer_() { |
| if (d_ == nullptr) return; |
| d_((a_ == nullptr) ? p_ : a_, s_); |
| } |
| }; |
|
|
| buffer::buffer() |
| : buffer(nullptr, 0, nullptr, nullptr) { |
| } |
|
|
| buffer::buffer(void* p, std::size_t s, destructor_t d) |
| : p_(p_->make(p, s, d, nullptr)) { |
| } |
|
|
| buffer::buffer(void* p, std::size_t s, destructor_t d, void* additional) |
| : p_(p_->make(p, s, d, additional)) { |
| } |
|
|
| buffer::buffer(void* p, std::size_t s) |
| : buffer(p, s, nullptr) { |
| } |
|
|
| buffer::buffer(char const & c) |
| : buffer(const_cast<char*>(&c), 1) { |
| } |
|
|
| buffer::buffer(buffer&& rhs) |
| : buffer() { |
| swap(rhs); |
| } |
|
|
| buffer::~buffer() { |
| p_->clear(); |
| } |
|
|
| void buffer::swap(buffer& rhs) { |
| std::swap(p_, rhs.p_); |
| } |
|
|
| buffer& buffer::operator=(buffer rhs) { |
| swap(rhs); |
| return *this; |
| } |
|
|
| bool buffer::empty() const noexcept { |
| return (impl(p_)->p_ == nullptr) || (impl(p_)->s_ == 0); |
| } |
|
|
| void* buffer::data() noexcept { |
| return impl(p_)->p_; |
| } |
|
|
| void const * buffer::data() const noexcept { |
| return impl(p_)->p_; |
| } |
|
|
| std::size_t buffer::size() const noexcept { |
| return impl(p_)->s_; |
| } |
|
|
| } |
|
|