SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
CellValueSerialField.h
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 
7 #ifndef swcdb_db_cells_CellValueSerialField_h
8 #define swcdb_db_cells_CellValueSerialField_h
9 
10 #include "swcdb/core/Compat.h"
11 #include "swcdb/core/Buffer.h"
12 #include "swcdb/db/Cells/Cell.h"
13 
14 
15 namespace SWC { namespace DB { namespace Cell {
16 
17 
18 
20 namespace Serial {
21 
22 
23 
25 namespace Value {
26 
27 
28 
29 /* SERIALIZATION:
30  Field[(i8 type, vi24 fid, FieldEnc(dep.type)), .. ]
31 */
32 
33 enum Type : uint8_t {
34  UNKNOWN = 0x00,
35  INT64 = 0x01,
36  DOUBLE = 0x02,
37  BYTES = 0x03,
38  KEY = 0x04,
39  LIST_INT64 = 0x05,
40  LIST_BYTES = 0x06,
41 
42  //LIST_DOUBLE = 0x06,
43  //LIST_ANY = 0x08,
44  //MAP = 0x06,
45 
46 };
47 
48 const char* SWC_CONST_FUNC to_string(Type typ) noexcept;
49 
51 Type read_type(const uint8_t** bufp, size_t* remainp) {
52  return Type(Serialization::decode_i8(bufp, remainp));
53 }
54 
56 uint24_t read_field_id(const uint8_t** bufp, size_t* remainp) {
57  return Serialization::decode_vi24(bufp, remainp);
58 }
59 
61 void skip_type_and_id(const uint8_t** bufp, size_t* remainp) {
62  read_type(bufp, remainp);
63  read_field_id(bufp, remainp);
64 }
65 //
66 
67 
68 
69 // Field-Base
70 struct Field {
71 
73 
75  Field() noexcept: fid() { }
76 
77  constexpr SWC_CAN_INLINE
78  Field(uint24_t a_fid) noexcept : fid(a_fid) { }
79 
81  Field(const uint8_t** bufp, size_t* remainp)
82  : fid(Serialization::decode_vi24(bufp, remainp)) {
83  }
84 
85  virtual ~Field() noexcept { }
86 
87  virtual Type type() const noexcept = 0;
88 
89  virtual size_t encoded_length() const noexcept {
91  }
92 
93  virtual void encode(uint8_t** bufp) const = 0;
94 
96  void encode(uint8_t** bufp, Type type) const {
99  }
100 
102  void decode(const uint8_t** bufp, size_t* remainp) {
103  fid = Serialization::decode_vi24(bufp, remainp);
104  }
105 
106  virtual void print(std::ostream& out) const = 0;
107 
108 };
109 //
110 
111 
112 
113 // Field INT64
114 struct Field_INT64 : Field {
115 
116  int64_t value;
117 
119  Field_INT64() noexcept: value() { }
120 
121  constexpr SWC_CAN_INLINE
122  Field_INT64(uint24_t a_fid, int64_t a_value) noexcept
123  : Field(a_fid), value(a_value) { }
124 
125  Field_INT64(const uint8_t** bufp, size_t* remainp);
126 
127  virtual ~Field_INT64() noexcept { }
128 
129  Type type() const noexcept override { return Type::INT64; };
130 
131  size_t SWC_PURE_FUNC encoded_length() const noexcept override;
132 
133  void encode(uint8_t** bufp) const override;
134 
135  void print(std::ostream& out) const override;
136 
137 };
138 //
139 
140 
141 
142 // Field DOUBLE
143 struct Field_DOUBLE : Field {
144 
145  long double value;
146 
148  Field_DOUBLE() noexcept: value() { }
149 
150  constexpr SWC_CAN_INLINE
151  Field_DOUBLE(uint24_t a_fid, const long double& a_value) noexcept
152  : Field(a_fid), value(a_value) { }
153 
154  Field_DOUBLE(const uint8_t** bufp, size_t* remainp);
155 
156  virtual ~Field_DOUBLE() noexcept { }
157 
158  Type type() const noexcept override { return Type::DOUBLE; };
159 
160  size_t SWC_PURE_FUNC encoded_length() const noexcept override;
161 
162  void encode(uint8_t** bufp) const override;
163 
164  void print(std::ostream& out) const override;
165 
166 };
167 //
168 
169 
170 
171 // Field BYTES
173 
175  Field_BYTES() noexcept { }
176 
177  Field_BYTES(uint24_t fid, const uint8_t* data, uint32_t len,
178  bool take_ownership);
179 
180  Field_BYTES(const uint8_t** bufp, size_t* remainp,
181  bool take_ownership);
182 
183  virtual ~Field_BYTES() noexcept { }
184 
185  Type type() const noexcept override { return Type::BYTES; };
186 
187  size_t SWC_PURE_FUNC encoded_length() const noexcept override;
188 
189  void encode(uint8_t** bufp) const override;
190 
191  template<typename T>
192  void convert_to(T& item) const {
193  if(size) {
194  item.assign(
195  reinterpret_cast<const typename T::value_type*>(base),
196  size
197  );
198  }
199  }
200 
201  void print(std::ostream& out) const override;
202 
203 };
204 //
205 
206 
207 
208 // Field KEY
209 struct Field_KEY : Field {
210 
212  Field_KEY() noexcept: key() { }
213 
214  Field_KEY(uint24_t fid, const Key& key,
215  bool take_ownership);
216 
217  Field_KEY(const uint8_t** bufp, size_t* remainp,
218  bool take_ownership);
219 
220  virtual ~Field_KEY() noexcept { }
221 
222  Type type() const noexcept override { return Type::KEY; };
223 
224  size_t SWC_PURE_FUNC encoded_length() const noexcept override;
225 
226  void encode(uint8_t** bufp) const override;
227 
228  void decode(const uint8_t** bufp, size_t* remainp,
229  bool take_ownership);
230 
231  void print(std::ostream& out) const override;
232 
233  Key key;
234 
235 };
236 //
237 
238 
239 
240 // Field LIST_INT64
242 
244  Field_LIST_INT64() noexcept { }
245 
247  Field_LIST_INT64(uint24_t a_fid) noexcept : Field(a_fid) { }
248 
249  template<typename T>
250  Field_LIST_INT64(uint24_t a_fid, const T& items) : Field(a_fid) {
251  set_from(items);
252  }
253 
254  Field_LIST_INT64(const uint8_t** bufp, size_t* remainp,
255  bool take_ownership);
256 
257  virtual ~Field_LIST_INT64() noexcept { }
258 
259  Type type() const noexcept override { return Type::LIST_INT64; };
260 
261  size_t SWC_PURE_FUNC encoded_length() const noexcept override;
262 
263  void encode(uint8_t** bufp) const override;
264 
265  template<typename T>
266  void set_from(const T& items) {
267  uint32_t len = 0;
268  for(const auto& v : items)
270  reallocate(len);
271  uint8_t* ptr = base;
272  for(const auto& v : items)
274  }
275 
276  template<typename T>
277  void write(DynamicBuffer* buff, const T& items) {
278  uint32_t _size = 0;
279  for(auto& v : items)
281  buff->ensure(
284  );
285  Field::encode(&buff->ptr, type());
286  Serialization::encode_vi64(&buff->ptr, _size);
287  for(auto& v : items)
288  Serialization::encode_vi64(&buff->ptr, v);
289  }
290 
291  template<typename T>
292  void convert_to(T& items) const {
293  if(size) {
294  const uint8_t* ptr = base;
295  for(size_t remain = size; remain;)
296  items.insert(items.cend(), Serialization::decode_vi64(&ptr, &remain));
297  }
298  }
299 
300  template<typename T>
301  uint32_t convert_less_to(T& items, uint32_t pos, uint32_t amt) const {
302  uint32_t count = 0;
303  const uint8_t* ptr = base;
304  for(size_t remain = size; remain; ++count) {
305  int64_t v = Serialization::decode_vi64(&ptr, &remain);
306  if(!amt || count < pos) {
307  items.push_back(v);
308  } else {
309  --amt;
310  }
311  }
312  return count;
313  }
314 
315  void print(std::ostream& out) const override;
316 
317 };
318 //
319 
320 
321 
322 // Field LIST_BYTES
324 
326  Field_LIST_BYTES() noexcept { }
327 
329  Field_LIST_BYTES(uint24_t a_fid) noexcept : Field(a_fid) { }
330 
331  template<typename T>
332  Field_LIST_BYTES(uint24_t a_fid, const T& items) : Field(a_fid) {
333  set_from(items);
334  }
335 
336  Field_LIST_BYTES(const uint8_t** bufp, size_t* remainp,
337  bool take_ownership);
338 
339  virtual ~Field_LIST_BYTES() noexcept { }
340 
341  Type type() const noexcept override { return Type::LIST_BYTES; };
342 
343  size_t SWC_PURE_FUNC encoded_length() const noexcept override;
344 
345  void encode(uint8_t** bufp) const override;
346 
347  template<typename T>
348  void set_from(const T& items) {
349  uint32_t len = 0;
350  for(auto& v : items)
351  len += Serialization::encoded_length_bytes(v.size());
352  reallocate(len);
353  uint8_t* ptr = base;
354  for(auto& v : items)
355  Serialization::encode_bytes(&ptr, v.data(), v.size());
356  }
357 
358  template<typename T>
359  void write(DynamicBuffer* buff, const T& items) {
360  uint32_t _size = 0;
361  for(auto& v : items)
362  _size += Serialization::encoded_length_bytes(v.size());
363  buff->ensure(
366  );
367  Field::encode(&buff->ptr, type());
368  Serialization::encode_vi64(&buff->ptr, _size);
369  for(auto& v : items)
370  Serialization::encode_bytes(&buff->ptr, v.data(), v.size());
371  }
372 
373  template<typename T>
374  void convert_to(T& items) const {
375  if(size) {
376  const uint8_t* ptr = base;
377  for(size_t remain = size; remain;) {
378  size_t len;
379  auto cptr = reinterpret_cast<
380  const typename T::value_type::value_type*>(
381  Serialization::decode_bytes(&ptr, &remain, &len));
382  items.insert(items.cend(), typename T::value_type(cptr, len));
383  }
384  }
385  }
386 
387  template<typename T>
388  uint32_t convert_less_to(T& items, uint32_t pos, uint32_t amt) const {
389  uint32_t count = 0;
390  const uint8_t* ptr = base;
391  for(size_t remain = size; remain; ++count) {
392  size_t len;
393  auto cptr = reinterpret_cast<
394  const typename T::value_type::value_type*>(
395  Serialization::decode_bytes(&ptr, &remain, &len));
396  if(!amt || count < pos) {
397  items.emplace_back(cptr, len);
398  } else {
399  --amt;
400  }
401  }
402  return count;
403  }
404 
405  void print(std::ostream& out) const override;
406 
407 };
408 //
409 
410 
411 
412 }}}}}
413 
414 #ifdef SWC_IMPL_SOURCE
416 #endif
417 
418 #endif // swcdb_db_cells_CellValueSerialField_h
SWC::Core::BufferDyn::ptr
value_type * ptr
Definition: Buffer.h:293
SWC::DB::Cell::Serial::Value::Field_INT64::type
Type type() const noexcept override
Definition: CellValueSerialField.h:129
SWC::DB::Cell::Serial::Value::Field::type
virtual Type type() const noexcept=0
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::Field_LIST_BYTES
SWC_CAN_INLINE Field_LIST_BYTES() noexcept
Definition: CellValueSerialField.h:326
SWC::Serialization::encode_vi24
constexpr SWC_CAN_INLINE void encode_vi24(uint8_t **bufp, uint24_t val)
Definition: Serialization.h:207
Cell.h
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::Field_LIST_INT64
SWC_CAN_INLINE Field_LIST_INT64(uint24_t a_fid) noexcept
Definition: CellValueSerialField.h:247
SWC::Serialization::encoded_length_vi24
constexpr SWC_CAN_INLINE uint8_t encoded_length_vi24(uint24_t val) noexcept
Definition: Serialization.h:199
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::type
Type type() const noexcept override
Definition: CellValueSerialField.h:259
SWC::Serialization::encoded_length_bytes
constexpr SWC_CAN_INLINE size_t encoded_length_bytes(size_t len) noexcept
Definition: Serialization.h:537
SWC::DB::Cell::Serial::Value::Field_BYTES::type
Type type() const noexcept override
Definition: CellValueSerialField.h:185
data
T data
Definition: BitFieldInt.h:1
SWC::DB::Cell::Serial::Value::Field_DOUBLE::Field_DOUBLE
SWC_CAN_INLINE Field_DOUBLE() noexcept
Definition: CellValueSerialField.h:148
SWC::DB::Cell::Serial::Value::Field_KEY
Definition: CellValueSerialField.h:209
SWC::Serialization::decode_bytes
constexpr SWC_CAN_INLINE const uint8_t * decode_bytes(const uint8_t **bufp, size_t *remainp, size_t *lenp)
Definition: Serialization.h:548
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::Field_LIST_BYTES
Field_LIST_BYTES(uint24_t a_fid, const T &items)
Definition: CellValueSerialField.h:332
SWC::DB::Cell::Serial::Value::Field_DOUBLE::type
Type type() const noexcept override
Definition: CellValueSerialField.h:158
SWC::DB::Cell::Serial::Value::Field_INT64::Field_INT64
constexpr SWC_CAN_INLINE Field_INT64(uint24_t a_fid, int64_t a_value) noexcept
Definition: CellValueSerialField.h:122
SWC::DB::Cell::Serial::Value::Type
Type
Definition: CellValueSerialField.h:33
SWC::DB::Cell::Serial::Value::Field::fid
uint24_t fid
Definition: CellValueSerialField.h:72
SWC::DB::Cell::Serial::Value::Field_KEY::~Field_KEY
virtual ~Field_KEY() noexcept
Definition: CellValueSerialField.h:220
SWC::Core::BufferDyn::ensure
SWC_CAN_INLINE void ensure(size_t len)
Definition: Buffer.h:212
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::Field_LIST_BYTES
SWC_CAN_INLINE Field_LIST_BYTES(uint24_t a_fid) noexcept
Definition: CellValueSerialField.h:329
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES
Definition: CellValueSerialField.h:323
SWC::DB::Cell::Serial::Value::Field_BYTES::~Field_BYTES
virtual ~Field_BYTES() noexcept
Definition: CellValueSerialField.h:183
SWC::DB::Cell::Key
Definition: CellKey.h:24
SWC::Serialization::encode_i8
constexpr SWC_CAN_INLINE void encode_i8(uint8_t **bufp, uint8_t val) noexcept
Definition: Serialization.h:85
SWC::DB::Cell::Serial::Value::Field_KEY::type
Type type() const noexcept override
Definition: CellValueSerialField.h:222
SWC::DB::Cell::Serial::Value::Field_INT64::encoded_length
size_t SWC_PURE_FUNC encoded_length() const noexcept override
Definition: CellValueSerialField.cc:49
SWC::Serialization::encode_bytes
SWC_CAN_INLINE void encode_bytes(uint8_t **bufp, const void *data, size_t len)
Definition: Serialization.h:542
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::convert_less_to
uint32_t convert_less_to(T &items, uint32_t pos, uint32_t amt) const
Definition: CellValueSerialField.h:301
SWC::DB::Cell::Serial::Value::DOUBLE
@ DOUBLE
Definition: CellValueSerialField.h:36
SWC::DB::Cell::Serial::Value::Field_INT64::print
void print(std::ostream &out) const override
Definition: CellValueSerialField.cc:59
SWC::DB::Cell::Serial::Value::BYTES
@ BYTES
Definition: CellValueSerialField.h:37
SWC::DB::Cell::Serial::Value::Field_INT64::~Field_INT64
virtual ~Field_INT64() noexcept
Definition: CellValueSerialField.h:127
SWC_CONST_FUNC
#define SWC_CONST_FUNC
Definition: Compat.h:107
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::Field_LIST_INT64
SWC_CAN_INLINE Field_LIST_INT64() noexcept
Definition: CellValueSerialField.h:244
SWC::DB::Cell::Serial::Value::UNKNOWN
@ UNKNOWN
Definition: CellValueSerialField.h:34
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::convert_less_to
uint32_t convert_less_to(T &items, uint32_t pos, uint32_t amt) const
Definition: CellValueSerialField.h:388
CellValueSerialField.cc
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::Serialization::decode_vi24
constexpr SWC_CAN_INLINE uint24_t decode_vi24(const uint8_t **bufp, size_t *remainp)
Definition: Serialization.h:217
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::convert_to
void convert_to(T &items) const
Definition: CellValueSerialField.h:292
SWC::DB::Cell::Serial::Value::INT64
@ INT64
Definition: CellValueSerialField.h:35
SWC::Core::BufferDyn< StaticBuffer >
SWC::Core::Buffer
Definition: Buffer.h:18
size
uint32_t size
Buffer size.
Definition: HeaderBufferInfo.h:47
SWC_PURE_FUNC
#define SWC_PURE_FUNC
Definition: Compat.h:108
Compat.h
SWC::DB::Cell::Serial::Value::Field::print
virtual void print(std::ostream &out) const =0
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::type
Type type() const noexcept override
Definition: CellValueSerialField.h:341
SWC::DB::Cell::Serial::Value::Field_INT64::Field_INT64
SWC_CAN_INLINE Field_INT64() noexcept
Definition: CellValueSerialField.h:119
SWC::DB::Cell::Serial::Value::read_field_id
SWC_CAN_INLINE uint24_t read_field_id(const uint8_t **bufp, size_t *remainp)
Definition: CellValueSerialField.h:56
Buffer.h
SWC::DB::Cell::Serial::Value::Field::decode
SWC_CAN_INLINE void decode(const uint8_t **bufp, size_t *remainp)
Definition: CellValueSerialField.h:102
SWC::DB::Cell::Serial::Value::Field::~Field
virtual ~Field() noexcept
Definition: CellValueSerialField.h:85
SWC::DB::Cell::Serial::Value::Field::Field
constexpr SWC_CAN_INLINE Field(uint24_t a_fid) noexcept
Definition: CellValueSerialField.h:78
SWC::DB::Cell::Serial::Value::Field_DOUBLE::value
long double value
Definition: CellValueSerialField.h:145
SWC::Serialization::encoded_length_vi64
constexpr SWC_CAN_INLINE uint8_t encoded_length_vi64(uint64_t val) noexcept
Definition: Serialization.h:272
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::convert_to
void convert_to(T &items) const
Definition: CellValueSerialField.h:374
SWC::DB::Cell::Serial::Value::LIST_INT64
@ LIST_INT64
Definition: CellValueSerialField.h:39
SWC::DB::Cell::Serial::Value::Field::encoded_length
virtual size_t encoded_length() const noexcept
Definition: CellValueSerialField.h:89
SWC::DB::Cell::Serial::Value::Field_DOUBLE::Field_DOUBLE
constexpr SWC_CAN_INLINE Field_DOUBLE(uint24_t a_fid, const long double &a_value) noexcept
Definition: CellValueSerialField.h:151
SWC::DB::Cell::Serial::Value::read_type
SWC_CAN_INLINE Type read_type(const uint8_t **bufp, size_t *remainp)
Definition: CellValueSerialField.h:51
SWC::DB::Cell::Serial::Value::Field_LIST_INT64
Definition: CellValueSerialField.h:241
SWC::DB::Cell::Serial::Value::Field_INT64::encode
void encode(uint8_t **bufp) const override
Definition: CellValueSerialField.cc:54
SWC::DB::Cell::Serial::Value::Field_DOUBLE
Definition: CellValueSerialField.h:143
SWC::uint24_t
Core::uint24_t uint24_t
Definition: BitFieldInt.h:401
SWC::Config::T
const uint64_t T
Definition: Property.h:27
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::~Field_LIST_INT64
virtual ~Field_LIST_INT64() noexcept
Definition: CellValueSerialField.h:257
SWC::DB::Cell::Serial::Value::Field
Definition: CellValueSerialField.h:70
SWC::DB::Cell::Serial::Value::skip_type_and_id
SWC_CAN_INLINE void skip_type_and_id(const uint8_t **bufp, size_t *remainp)
Definition: CellValueSerialField.h:61
SWC::DB::Cell::Serial::Value::to_string
const char *SWC_CONST_FUNC to_string(Type typ) noexcept
Definition: CellValueSerialField.cc:15
SWC::Serialization::decode_vi64
constexpr SWC_CAN_INLINE uint64_t decode_vi64(const uint8_t **bufp, size_t *remainp)
Definition: Serialization.h:302
SWC::DB::Cell::Serial::Value::Field_BYTES
Definition: CellValueSerialField.h:172
SWC::DB::Cell::Serial::Value::Field::encode
virtual void encode(uint8_t **bufp) const =0
SWC::DB::Cell::Serial::Value::Field::Field
SWC_CAN_INLINE Field() noexcept
Definition: CellValueSerialField.h:75
SWC::Serialization::encode_vi64
constexpr SWC_CAN_INLINE void encode_vi64(uint8_t **bufp, uint64_t val)
Definition: Serialization.h:286
SWC::DB::Cell::Serial::Value::LIST_BYTES
@ LIST_BYTES
Definition: CellValueSerialField.h:40
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::write
void write(DynamicBuffer *buff, const T &items)
Definition: CellValueSerialField.h:277
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::~Field_LIST_BYTES
virtual ~Field_LIST_BYTES() noexcept
Definition: CellValueSerialField.h:339
SWC::DB::Cell::Serial::Value::Field_LIST_INT64::Field_LIST_INT64
Field_LIST_INT64(uint24_t a_fid, const T &items)
Definition: CellValueSerialField.h:250
SWC::DB::Cell::Serial::Value::Field_INT64::value
int64_t value
Definition: CellValueSerialField.h:116
SWC::DB::Cell::Serial::Value::Field_DOUBLE::~Field_DOUBLE
virtual ~Field_DOUBLE() noexcept
Definition: CellValueSerialField.h:156
SWC::Serialization::decode_i8
constexpr SWC_CAN_INLINE uint8_t decode_i8(const uint8_t **bufp, size_t *remainp)
Definition: Serialization.h:91
SWC::DB::Cell::Serial::Value::Field_KEY::Field_KEY
SWC_CAN_INLINE Field_KEY() noexcept
Definition: CellValueSerialField.h:212
SWC::DB::Cell::Serial::Value::Field_BYTES::Field_BYTES
SWC_CAN_INLINE Field_BYTES() noexcept
Definition: CellValueSerialField.h:175
SWC::DB::Cell::Serial::Value::Field_INT64
Definition: CellValueSerialField.h:114
SWC::DB::Cell::Serial::Value::KEY
@ KEY
Definition: CellValueSerialField.h:38
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES::write
void write(DynamicBuffer *buff, const T &items)
Definition: CellValueSerialField.h:359
SWC::DB::Cell::Serial::Value::Field::Field
SWC_CAN_INLINE Field(const uint8_t **bufp, size_t *remainp)
Definition: CellValueSerialField.h:81
SWC::DB::Cell::Serial::Value::Field::encode
SWC_CAN_INLINE void encode(uint8_t **bufp, Type type) const
Definition: CellValueSerialField.h:96