| | |
| | | }; |
| | | OffsetType offset_; |
| | | SharedMemory *pshm_; |
| | | void *Alloc(const size_t size) |
| | | |
| | | void *Alloc(const size_t size, const void *src = nullptr) |
| | | { |
| | | void *p = shm().Alloc(sizeof(Meta) + size); |
| | | if (p) { |
| | | auto pmeta = new (p) Meta(size); |
| | | p = pmeta + 1; |
| | | if (src) { |
| | | memcpy(p, src, size); |
| | | } |
| | | } |
| | | return p; |
| | | } |
| | |
| | | } |
| | | return addr; |
| | | } |
| | | |
| | | void *Pack(const std::string &content) |
| | | void *Pack(const BHMsgHead &head, const uint32_t head_len, const std::string &body_content) |
| | | { |
| | | void *addr = get(); |
| | | if (addr) { |
| | | memcpy(addr, content.data(), content.size()); |
| | | meta()->size_ = content.size(); |
| | | auto p = static_cast<char *>(addr); |
| | | auto Pack1 = [&p](uint32_t len, auto &&writer) { |
| | | Put32(p, len); |
| | | p += sizeof(len); |
| | | writer(p, len); |
| | | p += len; |
| | | }; |
| | | Pack1(head_len, [&](void *p, int len) { head.SerializeToArray(p, len); }); |
| | | Pack1(body_content.size(), [&](void *p, int len) { memcpy(p, body_content.data(), len); }); |
| | | meta()->size_ = 4 + head_len + 4 + body_content.size(); |
| | | } |
| | | return addr; |
| | | } |
| | | |
| | | void *Pack(const void *src, const size_t size) |
| | | { |
| | | void *addr = get(); |
| | | if (addr && src) { |
| | | memcpy(addr, src, size); |
| | | meta()->size_ = size; |
| | | } |
| | | return addr; |
| | | } |
| | | |
| | | void *Pack(const std::string &content) { return Pack(content.data(), content.size()); } |
| | | |
| | | bool Make(void *addr) |
| | | { |
| | |
| | | uint32_t size = sizeof(head_len) + head_len + sizeof(body_len) + body_len; |
| | | return Make(size) && Pack(head, head_len, body, body_len); |
| | | } |
| | | inline bool Make(const BHMsgHead &head, const std::string &body_content) |
| | | { |
| | | uint32_t head_len = head.ByteSizeLong(); |
| | | uint32_t size = sizeof(head_len) + head_len + sizeof(uint32_t) + body_content.size(); |
| | | return Make(size) && Pack(head, head_len, body_content); |
| | | } |
| | | |
| | | template <class Body> |
| | | inline bool Fill(const BHMsgHead &head, const Body &body) |
| | | { |
| | |
| | | return valid() && (meta()->capacity_ >= size) && Pack(head, head_len, body, body_len); |
| | | } |
| | | |
| | | inline bool Make(const std::string &content) { return Make(content.size()) && Pack(content); } |
| | | inline bool Fill(const std::string &content) { return valid() && (meta()->capacity_ >= content.size()) && Pack(content); } |
| | | inline bool Make(const void *src, const size_t size) { return Make(Alloc(size, src)); } |
| | | inline bool Fill(const void *src, const size_t size) { return valid() && (meta()->capacity_ >= size) && Pack(src, size); } |
| | | |
| | | inline bool Make(const std::string &content) { return Make(content.data(), content.size()); } |
| | | inline bool Fill(const std::string &content) { return Fill(content.data(), content.size()); } |
| | | |
| | | inline bool Make(const size_t size) { return Make(Alloc(size)); } |
| | | |