/* * Copyright (C) 2014 Cloudius Systems, Ltd. */ #ifndef SCATTERED_MESSAGE_HH #define SCATTERED_MESSAGE_HH #include "core/reactor.hh" #include "core/deleter.hh" #include "core/temporary_buffer.hh" #include "net/packet.hh" #include #include template class scattered_message { private: using fragment = net::fragment; using packet = net::packet; using char_type = CharType; packet _p; public: scattered_message() {} scattered_message(scattered_message&&) = default; scattered_message(const scattered_message&) = delete; void append_static(const char_type* buf, size_t size) { if (size) { _p = packet(std::move(_p), fragment{(char_type*)buf, size}, deleter()); } } template void append_static(const char_type(&s)[N]) { append_static(s, N - 1); } void append_static(const char_type* s) { append_static(s, strlen(s)); } template void append_static(const basic_sstring& s) { append_static(s.begin(), s.size()); } template void append(basic_sstring s) { if (s.size()) { _p = packet(std::move(_p), std::move(s).release()); } } template void append(const basic_sstring& s, Callback callback) { if (s.size()) { _p = packet(std::move(_p), fragment{s.begin(), s.size()}, make_deleter(std::move(callback))); } } void reserve(int n_frags) { _p.reserve(n_frags); } packet release() && { return std::move(_p); } template void on_delete(Callback callback) { _p = packet(std::move(_p), std::move(callback)); } operator bool() const { return _p.len(); } size_t size() { return _p.len(); } }; #endif