Spaces:
Running
Running
| 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_; | |
| } | |
| } // namespace ipc | |