SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
Buffers.cc
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 
8 #include "swcdb/core/Checksum.h"
9 
10 namespace SWC { namespace Comm {
11 
12 namespace {
13 static const uint16_t BUFFER_CHUNK_SZ = 4096;
14 }
15 
16 Buffers::~Buffers() noexcept {
17  buf_data.free();
18  buf_ext.free();
19 }
20 
21 void Buffers::set_data(uint32_t sz) {
22  if(buf_data.size)
23  header.data.reset();
24 
25  buf_data.reallocate(sz);
27 }
28 
29 void Buffers::set_data(const Serializable& params, uint32_t reserve) {
30  set_data(reserve + params.encoded_length());
31 
32  data_ptr = buf_data.base + reserve;
33  params.encode(&data_ptr);
35 }
36 
38  uint8_t buf_header_len = header.encoded_length();
39  {
40  uint8_t* buf = buf_header;
41  header.encode(&buf); // write_header
42  }
43 
44  size_t nchunks = 1;
45 
46  size_t buf_data_chunks = 0;
47  bool buf_data_not_aligned = false;
48  if(buf_data.size)
49  nchunks += (buf_data_chunks += buf_data.size / BUFFER_CHUNK_SZ)
50  + (buf_data_not_aligned = buf_data.size % BUFFER_CHUNK_SZ);
51 
52  size_t buf_ext_chunks = 0;
53  bool buf_ext_not_aligned = false;
54  if(buf_ext.size)
55  nchunks += (buf_ext_chunks += buf_ext.size / BUFFER_CHUNK_SZ)
56  + (buf_ext_not_aligned = buf_ext.size % BUFFER_CHUNK_SZ);
57 
59  buffers.reserve(nchunks);
60  buffers.emplace_back(buf_header, buf_header_len);
61 
62  if(buf_data.size) {
63  auto p = buf_data.base;
64  for(size_t i = 0; i<buf_data_chunks; ++i, p+=BUFFER_CHUNK_SZ)
65  buffers.emplace_back(p, BUFFER_CHUNK_SZ);
66  if(buf_data_not_aligned)
67  buffers.emplace_back(p, (buf_data.base + buf_data.size) - p);
68  }
69  if(buf_ext.size) {
70  auto p = buf_ext.base;
71  for(size_t i = 0; i<buf_ext_chunks; ++i, p+=BUFFER_CHUNK_SZ)
72  buffers.emplace_back(p, BUFFER_CHUNK_SZ);
73  if(buf_ext_not_aligned)
74  buffers.emplace_back(p, (buf_ext.base + buf_ext.size) - p);
75  }
76  return buffers;
77 }
78 
79 
80 }} // namespace SWC::Comm
SWC::Comm::Serializable::encoded_length
size_t encoded_length() const
Definition: Serializable.h:45
SWC::Comm::Buffers::set_data
void set_data(uint32_t sz)
Definition: Buffers.cc:21
SWC::Core::Buffer::reallocate
SWC_CAN_INLINE void reallocate(size_t len)
Definition: Buffer.h:92
SWC::Comm::Buffers::data_ptr
uint8_t * data_ptr
Definition: Buffers.h:165
SWC::Comm::Header::data
BufferInfo data
Data Buffer.
Definition: Header.h:81
SWC::Comm::BufferInfo::reset
SWC_CAN_INLINE void reset() noexcept
Definition: HeaderBufferInfo.h:30
SWC::Comm::Buffers::get_buffers
Core::Vector< asio::const_buffer > get_buffers()
Definition: Buffers.cc:37
Buffers.h
SWC::Comm::Serializable::encode
void encode(uint8_t **bufp) const
Definition: Serializable.h:52
SWC::Comm::Buffers::header
Header header
Definition: Buffers.h:163
SWC::Core::Buffer::base
value_type * base
Definition: Buffer.h:131
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::Core::Buffer::size
size_t size
Definition: Buffer.h:130
SWC::Comm::Header::encode
void encode(uint8_t **bufp) const
Definition: Header.h:118
SWC::Comm::Header::encoded_length
uint8_t encoded_length() noexcept
Definition: Header.h:103
SWC::Comm::Serializable
Definition: Serializable.h:18
SWC::Comm::Buffers::buf_header
uint8_t buf_header[Header::MAX_LENGTH]
Definition: Buffers.h:169
buffers
uint8_t buffers
number of buffers from 0 to 2 (data+data_ext)
Definition: Header.h:56
SWC::Core::Buffer::free
SWC_CAN_INLINE void free() noexcept
Definition: Buffer.h:85
Checksum.h
SWC::Core::Vector
Definition: Vector.h:14
SWC::Comm::Buffers::buf_data
StaticBuffer buf_data
Definition: Buffers.h:170
SWC::Comm::Buffers::~Buffers
~Buffers() noexcept
Definition: Buffers.cc:16
SWC::Comm::Buffers::buf_ext
StaticBuffer buf_ext
Definition: Buffers.h:171