SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
CellValueSerialFields.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_CellValueSerialFields_h
8 #define swcdb_db_cells_CellValueSerialFields_h
9 
11 
12 
13 namespace SWC { namespace DB { namespace Cell {
14 
15 
16 
18 namespace Serial {
19 
20 
21 
23 namespace Value {
24 
25 
26 /*
27 FieldsWriter wfields;
28 wfields.add(123);
29 
30 cell.set_value(wfields.base, wfields.fill(), true);
31 or
32 cell.set_value(encoder, wfields.base, wfields.fill());
33 */
34 struct FieldsWriter final : DynamicBuffer {
35 
36  constexpr SWC_CAN_INLINE
37  FieldsWriter() noexcept : index_count(0) { }
38 
39  ~FieldsWriter() noexcept { }
40 
42  void add(Field* field) {
43  ensure(field->encoded_length());
44  field->encode(&ptr);
45  }
46 
48  void add(FieldUpdate* ufield) {
49  ensure(ufield->encoded_length());
50  ufield->encode(&ptr);
51  }
52 
54  void add(Field* field, FieldUpdate* ufield) {
55  ensure(field->encoded_length() + ufield->encoded_length());
56  field->encode(&ptr);
57  ufield->encode(&ptr);
58  }
59 
60  void add(uint24_t fid, const int64_t& value);
61 
62  void add(uint24_t fid, const long double& value);
63 
64  void add(uint24_t fid, const uint8_t* data, uint32_t len);
65 
66  void add(uint24_t fid, const Key& key);
67 
68  void add(uint24_t fid, const Core::Vector<int64_t>& items);
69 
70  void add(uint24_t fid, const std::vector<int64_t>& items);
71 
72  void add(uint24_t fid, const Core::Vector<std::string>& items);
73 
74  void add(uint24_t fid, const std::vector<std::string>& items);
75 
76 
78  void add(const int64_t& value) {
79  add(index_count++, value);
80  }
81 
83  void add(const long double& value) {
84  add(index_count++, value);
85  }
86 
88  void add(const uint8_t* data, uint32_t len) {
89  add(index_count++, data, len);
90  }
91 
93  void add(const std::string& data) {
94  add(reinterpret_cast<const uint8_t*>(data.c_str()), data.size());
95  }
96 
98  void add(uint24_t fid, const std::string& data) {
99  add(fid, reinterpret_cast<const uint8_t*>(data.c_str()), data.size());
100  }
101 
103  void add(const char* data, uint32_t len) {
104  add(reinterpret_cast<const uint8_t*>(data), len);
105  }
106 
108  void add(uint24_t fid, const char* data, uint32_t len) {
109  add(fid, reinterpret_cast<const uint8_t*>(data), len);
110  }
111 
113  void add(const Key& key) {
114  add(index_count++, key);
115  }
116 
118  void add(const Core::Vector<int64_t>& items) {
119  add(index_count++, items);
120  }
121 
123  void add(const std::vector<int64_t>& items) {
124  add(index_count++, items);
125  }
126 
128  void add(const Core::Vector<std::string>& items) {
129  add(index_count++, items);
130  }
131 
133  void add(const std::vector<std::string>& items) {
134  add(index_count++, items);
135  }
136 
137  void print(std::ostream& out) const;
138 
140 
141 };
142 //
143 
144 
145 
146 //
147 struct Fields {
148 
149  static void print(const uint8_t* ptr, size_t remain, std::ostream& out);
150 
151  static void display(const uint8_t* ptr, size_t remain, std::ostream& out);
152 
153 };
154 //
155 
156 
157 
163  FieldUpdateOP() noexcept : field(nullptr), ufield(nullptr) { }
165  FieldUpdateOP(FieldUpdateOP&& other) noexcept
166  : field(other.field), ufield(other.ufield) {
167  other.field = nullptr;
168  other.ufield = nullptr;
169  }
171  FieldUpdateOP& operator=(FieldUpdateOP&& other) noexcept {
172  delete field;
173  delete ufield;
174  field = nullptr;
175  ufield = nullptr;
176  std::swap(field, other.field);
177  std::swap(ufield, other.ufield);
178  return *this;
179  }
180  FieldUpdateOP(const FieldUpdateOP&) = delete;
182  ~FieldUpdateOP() noexcept {
183  delete field;
184  delete ufield;
185  }
187  operator bool() const noexcept {
188  return ufield;
189  }
190 };
192 
193 
194 
195 struct FieldsUpdaterMap final
196  : private std::array<std::map<uint32_t, FieldUpdateOP>*, 7> {
197  public:
198 
200 
202  FieldsUpdaterMap() noexcept : count(0) {
203  fill(nullptr);
204  }
205 
207  FieldsUpdaterMap(const uint8_t* ptr, size_t remain, bool take_ownership)
208  : count(0) {
209  fill(nullptr);
210  decode(ptr, remain, take_ownership);
211  }
212 
214  ~FieldsUpdaterMap() noexcept {
215  for(auto it_t = cbegin() + 1; it_t != cend(); ++it_t) {
216  delete *it_t;
217  }
218  }
219 
220  void decode(const uint8_t* ptr, size_t remain, bool take_ownership) {
221  while(remain) {
222  FieldUpdateOP opfield;
223  switch(read_type(&ptr, &remain)) {
224  case Type::INT64: {
225  opfield.field = new Field_INT64(&ptr, &remain);
226  opfield.ufield = new FieldUpdate_MATH(&ptr, &remain);
227  break;
228  }
229  case Type::DOUBLE: {
230  opfield.field = new Field_DOUBLE(&ptr, &remain);
231  opfield.ufield = new FieldUpdate_MATH(&ptr, &remain);
232  break;
233  }
234  case Type::BYTES: {
235  opfield.field = new Field_BYTES(&ptr, &remain, take_ownership);
236  opfield.ufield = new FieldUpdate_LIST(&ptr, &remain);
237  break;
238  }
239  case Type::KEY: {
240  opfield.field = new Field_KEY(&ptr, &remain, take_ownership);
241  break;
242  }
243  case Type::LIST_INT64: {
244  opfield.field = new Field_LIST_INT64(&ptr, &remain, take_ownership);
245  opfield.ufield = new FieldUpdate_LIST_INT64(&ptr, &remain);
246  break;
247  }
248  case Type::LIST_BYTES: {
249  opfield.field = new Field_LIST_BYTES(&ptr, &remain, take_ownership);
250  opfield.ufield = new FieldUpdate_LIST_BYTES(&ptr, &remain);
251  break;
252  }
253  default:
254  continue;
255  }
256  if(!opfield)
257  continue;
258 
259  auto& typ_fields = (*this)[opfield.field->type()];
260  if(typ_fields) {
261  count += typ_fields->insert_or_assign(
262  uint32_t(opfield.field->fid),
263  std::move(opfield)
264  ).second;
265  } else {
266  typ_fields = new std::map<uint32_t, FieldUpdateOP>();
267  (*typ_fields)[uint32_t(opfield.field->fid)] = std::move(opfield);
268  ++count;
269  }
270  }
271  }
272 
274  find_matching_type_and_id(const Field* field) const noexcept {
275  auto& typ_fields = (*this)[field->type()];
276  if(typ_fields) {
277  const auto it = typ_fields->find(field->fid);
278  if(it != typ_fields->cend()) {
279  return &it->second;
280  }
281  }
282  return nullptr;
283  }
284 
285  void get_not_in(const FieldUpdateOpPtrs& opfields,
286  FieldUpdateOpPtrs& not_in) const {
287  for(auto it_t = cbegin() + 1; it_t != cend(); ++it_t) {
288  if(!*it_t)
289  continue;
290  for(auto it_f = (*it_t)->cbegin(); it_f != (*it_t)->cend(); ++it_f) {
291  if(std::find(opfields.cbegin(), opfields.cend(), &it_f->second)
292  == opfields.cend()) {
293  not_in.push_back(&it_f->second);
294  }
295  }
296  }
297  }
298 
299 };
300 //
301 
302 
303 
304 }}}}}
305 
306 #ifdef SWC_IMPL_SOURCE
308 #endif
309 
310 #endif // swcdb_db_cells_CellValueSerialFields_h
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const int64_t &value)
Definition: CellValueSerialFields.h:78
CellValueSerialFieldUpdate.h
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(Field *field, FieldUpdate *ufield)
Definition: CellValueSerialFields.h:54
SWC::Core::BufferDyn< StaticBuffer >::ptr
value_type * ptr
Definition: Buffer.h:293
SWC::DB::Cell::Serial::Value::Field::type
virtual Type type() const noexcept=0
SWC::DB::Cell::Serial::Value::FieldUpdate
Definition: CellValueSerialFieldUpdate.h:29
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const Core::Vector< std::string > &items)
Definition: CellValueSerialFields.h:128
SWC::DB::Cell::Serial::Value::FieldsUpdaterMap::get_not_in
void get_not_in(const FieldUpdateOpPtrs &opfields, FieldUpdateOpPtrs &not_in) const
Definition: CellValueSerialFields.h:285
SWC::DB::Cell::Serial::Value::FieldUpdate::encoded_length
virtual SWC_CAN_INLINE uint24_t encoded_length() const noexcept
Definition: CellValueSerialFieldUpdate.h:113
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const Key &key)
Definition: CellValueSerialFields.h:113
SWC::DB::Cell::Serial::Value::FieldUpdateOP::FieldUpdateOP
SWC_CAN_INLINE FieldUpdateOP() noexcept
Definition: CellValueSerialFields.h:163
data
T data
Definition: BitFieldInt.h:1
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const long double &value)
Definition: CellValueSerialFields.h:83
SWC::DB::Cell::Serial::Value::Field_KEY
Definition: CellValueSerialField.h:209
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const std::string &data)
Definition: CellValueSerialFields.h:93
SWC::DB::Cell::Serial::Value::FieldUpdateOP::FieldUpdateOP
SWC_CAN_INLINE FieldUpdateOP(FieldUpdateOP &&other) noexcept
Definition: CellValueSerialFields.h:165
SWC::DB::Cell::Serial::Value::Field::fid
uint24_t fid
Definition: CellValueSerialField.h:72
SWC::DB::Cell::Serial::Value::FieldUpdateOP::~FieldUpdateOP
~FieldUpdateOP() noexcept
Definition: CellValueSerialFields.h:182
SWC::Core::BufferDyn< StaticBuffer >::ensure
SWC_CAN_INLINE void ensure(size_t len)
Definition: Buffer.h:212
SWC::DB::Cell::Serial::Value::FieldsUpdaterMap::find_matching_type_and_id
FieldUpdateOP * find_matching_type_and_id(const Field *field) const noexcept
Definition: CellValueSerialFields.h:274
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(FieldUpdate *ufield)
Definition: CellValueSerialFields.h:48
SWC::DB::Cell::Serial::Value::FieldUpdate_MATH
Definition: CellValueSerialFieldUpdate.h:131
SWC::DB::Cell::Serial::Value::FieldUpdateOpPtrs
Core::Vector< const FieldUpdateOP * > FieldUpdateOpPtrs
Definition: CellValueSerialFields.h:191
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES
Definition: CellValueSerialField.h:323
SWC::DB::Cell::Key
Definition: CellKey.h:24
SWC::DB::Cell::Serial::Value::FieldUpdateOP::ufield
FieldUpdate * ufield
Definition: CellValueSerialFields.h:161
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(uint24_t fid, const char *data, uint32_t len)
Definition: CellValueSerialFields.h:108
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(Field *field)
Definition: CellValueSerialFields.h:42
SWC::DB::Cell::Serial::Value::FieldUpdate_LIST_INT64
FieldUpdate_LIST_ITEMS< FieldUpdate_MATH, int64_t > FieldUpdate_LIST_INT64
Definition: CellValueSerialFieldUpdate.h:761
SWC::DB::Cell::Serial::Value::FieldsUpdaterMap::decode
void decode(const uint8_t *ptr, size_t remain, bool take_ownership)
Definition: CellValueSerialFields.h:220
SWC::DB::Cell::Serial::Value::FieldUpdateOP
Fields Reader with FieldsWriter & FieldUpdate serialization.
Definition: CellValueSerialFields.h:159
SWC::DB::Cell::Serial::Value::FieldUpdate_LIST
Definition: CellValueSerialFieldUpdate.h:243
SWC::DB::Cell::Serial::Value::FieldUpdateOP::operator=
SWC_CAN_INLINE FieldUpdateOP & operator=(FieldUpdateOP &&other) noexcept
Definition: CellValueSerialFields.h:171
SWC::DB::Cell::Serial::Value::DOUBLE
@ DOUBLE
Definition: CellValueSerialField.h:36
SWC::DB::Cell::Serial::Value::BYTES
@ BYTES
Definition: CellValueSerialField.h:37
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const Core::Vector< int64_t > &items)
Definition: CellValueSerialFields.h:118
SWC::DB::Cell::Serial::Value::FieldUpdate_LIST_BYTES
FieldUpdate_LIST_ITEMS< FieldUpdate_LIST, std::string > FieldUpdate_LIST_BYTES
Definition: CellValueSerialFieldUpdate.h:763
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::DB::Cell::Serial::Value::FieldsUpdaterMap
Definition: CellValueSerialFields.h:196
SWC::DB::Cell::Serial::Value::INT64
@ INT64
Definition: CellValueSerialField.h:35
SWC::Core::BufferDyn< StaticBuffer >
SWC::DB::Cell::Serial::Value::FieldUpdate::encode
virtual SWC_CAN_INLINE void encode(uint8_t **bufp) const
Definition: CellValueSerialFieldUpdate.h:117
SWC::DB::Cell::Serial::Value::FieldsWriter::FieldsWriter
constexpr SWC_CAN_INLINE FieldsWriter() noexcept
Definition: CellValueSerialFields.h:37
SWC::DB::Cell::Serial::Value::FieldsWriter::~FieldsWriter
~FieldsWriter() noexcept
Definition: CellValueSerialFields.h:39
SWC::DB::Cell::Serial::Value::FieldUpdateOP::field
Field * field
Definition: CellValueSerialFields.h:160
SWC::DB::Cell::Serial::Value::Fields
Definition: CellValueSerialFields.h:147
SWC::DB::Cell::Serial::Value::LIST_INT64
@ LIST_INT64
Definition: CellValueSerialField.h:39
SWC::DB::Cell::Serial::Value::Fields::display
static void display(const uint8_t *ptr, size_t remain, std::ostream &out)
Definition: CellValueSerialFields.cc:75
SWC::DB::Cell::Serial::Value::Field::encoded_length
virtual size_t encoded_length() const noexcept
Definition: CellValueSerialField.h:89
SWC::DB::Cell::Serial::Value::FieldsWriter::index_count
uint24_t index_count
Definition: CellValueSerialFields.h:139
SWC::DB::Cell::Serial::Value::FieldsWriter
Definition: CellValueSerialFields.h:34
SWC::DB::Cell::Serial::Value::FieldsUpdaterMap::count
uint24_t count
Definition: CellValueSerialFields.h:199
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::Core::Vector< int64_t >
SWC::DB::Cell::Serial::Value::Field_DOUBLE
Definition: CellValueSerialField.h:143
SWC::DB::Cell::Serial::Value::Fields::print
static void print(const uint8_t *ptr, size_t remain, std::ostream &out)
Definition: CellValueSerialFields.cc:69
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const std::vector< std::string > &items)
Definition: CellValueSerialFields.h:133
SWC::uint24_t
Core::uint24_t uint24_t
Definition: BitFieldInt.h:401
SWC::DB::Cell::Serial::Value::Field
Definition: CellValueSerialField.h:70
SWC::Core::Vector::cend
constexpr SWC_CAN_INLINE const_iterator cend() const noexcept
Definition: Vector.h:232
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const char *data, uint32_t len)
Definition: CellValueSerialFields.h:103
SWC::DB::Cell::Serial::Value::FieldsUpdaterMap::~FieldsUpdaterMap
SWC_CAN_INLINE ~FieldsUpdaterMap() noexcept
Definition: CellValueSerialFields.h:214
SWC::DB::Cell::Serial::Value::Field_BYTES
Definition: CellValueSerialField.h:172
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(uint24_t fid, const std::string &data)
Definition: CellValueSerialFields.h:98
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const uint8_t *data, uint32_t len)
Definition: CellValueSerialFields.h:88
SWC::DB::Cell::Serial::Value::Field::encode
virtual void encode(uint8_t **bufp) const =0
CellValueSerialFields.cc
SWC::DB::Cell::Serial::Value::FieldUpdateOP::operator=
FieldUpdateOP & operator=(const FieldUpdateOP &)=delete
SWC::DB::Cell::Serial::Value::LIST_BYTES
@ LIST_BYTES
Definition: CellValueSerialField.h:40
SWC::DB::Cell::Serial::Value::FieldsWriter::add
SWC_CAN_INLINE void add(const std::vector< int64_t > &items)
Definition: CellValueSerialFields.h:123
SWC::Core::Vector::push_back
SWC_CAN_INLINE void push_back(ArgsT &&... args)
Definition: Vector.h:331
SWC::DB::Cell::Serial::Value::FieldsWriter::print
void print(std::ostream &out) const
Definition: CellValueSerialFields.cc:57
SWC::Core::Vector::cbegin
constexpr SWC_CAN_INLINE const_iterator cbegin() const noexcept
Definition: Vector.h:216
SWC::DB::Cell::Serial::Value::FieldsUpdaterMap::FieldsUpdaterMap
SWC_CAN_INLINE FieldsUpdaterMap() noexcept
Definition: CellValueSerialFields.h:202
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::FieldsUpdaterMap::FieldsUpdaterMap
SWC_CAN_INLINE FieldsUpdaterMap(const uint8_t *ptr, size_t remain, bool take_ownership)
Definition: CellValueSerialFields.h:207
SWC::DB::Cell::Serial::Value::FieldUpdateOP::FieldUpdateOP
FieldUpdateOP(const FieldUpdateOP &)=delete