SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
SpecsValueSerialFields.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 
9 
10 
11 namespace SWC { namespace DB { namespace Specs {
12 namespace Serial { namespace Value {
13 
14 
15 
16 // Field INT64
18  Condition::Comp a_comp, int64_t a_value)
19  : Field(a_fid), comp(a_comp), value(a_value) {
20 }
21 
22 Field_INT64::Field_INT64(const uint8_t** bufp, size_t* remainp)
23  : Field(bufp, remainp),
24  comp(Condition::Comp(Serialization::decode_i8(bufp, remainp))),
25  value(Serialization::decode_vi64(bufp, remainp)) {
26 }
27 
28 size_t Field_INT64::encoded_length() const noexcept {
29  return Field::encoded_length()
31 }
32 
33 void Field_INT64::encode(uint8_t** bufp) const {
37 }
38 
41  comp, value,
42  static_cast<Cell::Serial::Value::Field_INT64*>(vfieldp)->value);
43 }
44 
45 void Field_INT64::print(std::ostream& out) const {
46  out << fid << ':' << 'I' << ':'
48 }
49 //
50 
51 
52 
53 // Field DOUBLE
55  const long double& a_value)
56  : Field(a_fid), comp(a_comp), value(a_value) {
57 }
58 
59 Field_DOUBLE::Field_DOUBLE(const uint8_t** bufp, size_t* remainp)
60  : Field(bufp, remainp),
61  comp(Condition::Comp(Serialization::decode_i8(bufp, remainp))),
62  value(Serialization::decode_double(bufp, remainp)) {
63 }
64 
65 size_t Field_DOUBLE::encoded_length() const noexcept {
66  return Field::encoded_length()
68 }
69 
70 void Field_DOUBLE::encode(uint8_t** bufp) const {
74 }
75 
78  comp, value,
79  static_cast<Cell::Serial::Value::Field_DOUBLE*>(vfieldp)->value);
80 }
81 
82 void Field_DOUBLE::print(std::ostream& out) const {
83  out << fid << ':' << 'D' << ':'
85 }
86 //
87 
88 
89 
90 // Field BYTES
92  const uint8_t* ptr, size_t len,
93  bool take_ownership)
94  : Field(a_fid), comp(a_comp), value() {
95  take_ownership
96  ? value.assign(ptr, len)
97  : value.set(const_cast<uint8_t*>(ptr), len, false);
98 }
99 
100 Field_BYTES::Field_BYTES(const uint8_t** bufp, size_t* remainp,
101  bool take_ownership)
102  : Field(bufp, remainp),
103  comp(Condition::Comp(Serialization::decode_i8(bufp, remainp))),
104  value() {
105  size_t len;
106  const uint8_t* ptr = Serialization::decode_bytes(bufp, remainp, &len);
107  take_ownership
108  ? value.assign(ptr, len)
109  : value.set(const_cast<uint8_t*>(ptr), len, false);
110 }
111 
112 size_t Field_BYTES::encoded_length() const noexcept {
113  return Field::encoded_length()
115 }
116 
117 void Field_BYTES::encode(uint8_t** bufp) const {
118  Field::encode(bufp, Type::BYTES);
121 }
122 
124  auto vfield = static_cast<Cell::Serial::Value::Field_BYTES*>(vfieldp);
125  // compiled RE
127  comp, value.base, value.size, vfield->base, vfield->size);
128 }
129 
130 void Field_BYTES::print(std::ostream& out) const {
131  out << fid << ':' << 'B' << ':'
132  << Condition::to_string(comp) << '"';
133  char hex[5];
134  hex[4] = '\0';
135  const uint8_t* end = value.base + value.size;
136  for(const uint8_t* ptr = value.base; ptr < end; ++ptr) {
137  if(*ptr == '"')
138  out << '\\';
139  if(31 < *ptr && *ptr < 127) {
140  out << *ptr;
141  } else {
142  sprintf(hex, "0x%X", *ptr);
143  out << hex;
144  }
145  }
146  out << '"';
147 }
148 //
149 
150 
151 
152 // Field KEY
153 
155  : Field(a_fid), seq(a_seq), key() {
156 }
157 
158 Field_KEY::Field_KEY(uint24_t a_fid, Types::KeySeq a_seq, const Key& a_key)
159  : Field(a_fid), seq(a_seq), key(a_key) {
160 }
161 
162 Field_KEY::Field_KEY(const uint8_t** bufp, size_t* remainp)
163  : Field(bufp, remainp),
164  seq(Types::KeySeq(Serialization::decode_i8(bufp, remainp))),
165  key(bufp, remainp) {
166 }
167 
168 size_t Field_KEY::encoded_length() const noexcept {
169  return Field::encoded_length() + 1 + key.encoded_length();
170 }
171 
172 void Field_KEY::encode(uint8_t** bufp) const {
173  Field::encode(bufp, Type::KEY);
174  Serialization::encode_i8(bufp, uint8_t(seq));
175  key.encode(bufp);
176 }
177 
179  return key.is_matching(
180  seq, static_cast<Cell::Serial::Value::Field_KEY*>(vfieldp)->key);
181 }
182 
183 void Field_KEY::print(std::ostream& out) const {
184  out << fid << ':' << 'K' << ':';
185  key.display(out);
186 }
187 //
188 
189 
190 
191 // Field LIST_INT64
193  : Field(a_fid), comp(a_comp),
194  items(), _found() {
195 }
196 
198  const Field_LIST_INT64::Vec& a_items)
199  : Field(a_fid),
200  comp(a_comp), items(a_items), _found() {
201 }
202 
203 Field_LIST_INT64::Field_LIST_INT64(const uint8_t** bufp, size_t* remainp)
204  : Field(bufp, remainp),
205  comp(Condition::Comp(Serialization::decode_i8(bufp, remainp))),
206  items(), _found() {
207  size_t len;
208  const uint8_t* ptr = Serialization::decode_bytes(bufp, remainp, &len);
209  while(len) {
210  auto vcomp = Condition::Comp(Serialization::decode_i8(&ptr, &len));
211  items.emplace_back(vcomp, Serialization::decode_vi64(&ptr, &len));
212  }
214  _found.resize(items.size());
215 }
216 
217 size_t Field_LIST_INT64::encoded_length() const noexcept {
218  size_t len = items.size();
219  for(const Item& item : items)
220  len += Serialization::encoded_length_vi64(item.value);
221  return Field::encoded_length()
223 }
224 
225 void Field_LIST_INT64::encode(uint8_t** bufp) const {
228 
229  size_t len = items.size();
230  for(const Item& item : items)
231  len += Serialization::encoded_length_vi64(item.value);
232 
233  StaticBuffer value(len);
234  uint8_t* ptr = value.base;
235  for(const Item& item : items) {
236  Serialization::encode_i8(&ptr, item.comp);
237  Serialization::encode_vi64(&ptr, item.value);
238  }
239  Serialization::encode_bytes(bufp, value.base, value.size);
240 }
241 
243  auto vfield = static_cast<Cell::Serial::Value::Field_LIST_INT64*>(vfieldp);
244 
245  const uint8_t* ptr = vfield->base;
246  size_t remain = vfield->size;
247  switch(comp) {
248 
249  case Condition::NE: {
250  auto it = items.cbegin();
251  for(; remain && it != items.cend(); ++it) {
253  it->comp, it->value,
254  int64_t(Serialization::decode_vi64(&ptr, &remain))))
255  return true;
256  }
257  return remain || it != items.cend();
258  }
259 
260  case Condition::GT:
261  case Condition::LT:
262  case Condition::GE:
263  case Condition::LE:
264  case Condition::EQ: {
265  auto it = items.cbegin();
266  for(; remain && it != items.cend(); ++it) {
268  it->comp, it->value,
269  int64_t(Serialization::decode_vi64(&ptr, &remain))))
270  break;
271  }
272  return remain
273  ? it == items.cend() &&
275  : (it == items.cend()
276  ? (comp == Condition::EQ ||
278  : (comp == Condition::LT || comp == Condition::LE));
279  }
280 
281  case Condition::SBS: {
282  uint32_t sz = items.size();
283  if(!sz)
284  return true;
285  if(!remain)
286  return false;
287  uint32_t count = sz;
288  for(auto& f : _found)
289  f = false;
290  while(remain) {
291  int64_t v = Serialization::decode_vi64(&ptr, &remain);
292  for(uint32_t i = 0; i < sz; ++i) {
293  if(!_found[i] &&
294  Condition::is_matching(items[i].comp, items[i].value, v)) {
295  if(!--count)
296  return true;
297  _found[i] = true;
298  break;
299  }
300  }
301  }
302  return false;
303  }
304 
305  case Condition::SPS: {
306  if(!remain)
307  return true;
308  uint32_t sz = items.size();
309  if(!sz)
310  return false;
311  for(auto& f : _found)
312  f = false;
313  while(remain) {
314  int64_t v = Serialization::decode_vi64(&ptr, &remain);
315  for(uint32_t i = 0; ;) {
316  if(!_found[i] &&
317  Condition::is_matching(items[i].comp, items[i].value, v)) {
318  _found[i] = true;
319  break;
320  }
321  if(++i == sz)
322  return false;
323  }
324  }
325  return true;
326  }
327 
328  case Condition::POSBS: {
329  auto it = items.cbegin();
330  for(; remain && it != items.cend(); ) {
332  it->comp, it->value,
333  int64_t(Serialization::decode_vi64(&ptr, &remain))))
334  ++it;
335  }
336  return it == items.cend();
337  }
338 
339  case Condition::FOSBS: {
340  auto it = items.cbegin();
341  for(bool start = false; remain && it != items.cend(); ) {
343  it->comp, it->value,
344  int64_t(Serialization::decode_vi64(&ptr, &remain)))) {
345  start = true;
346  ++it;
347  } else if(start) {
348  return false;
349  }
350  }
351  return it == items.cend();
352  }
353 
354  case Condition::POSPS: {
355  for(auto ord = items.cbegin(); remain && ord != items.cend(); ) {
356  int64_t v = Serialization::decode_vi64(&ptr, &remain);
357  for(auto it = ord; ;) {
358  if(Condition::is_matching(it->comp, it->value, v)) {
359  ++ord;
360  break;
361  }
362  if(++it == items.cend())
363  return false;
364  }
365  }
366  return !remain;
367  }
368 
369  case Condition::FOSPS: {
370  bool start = false;
371  for(auto ord = items.cbegin(); remain && ord != items.cend(); ) {
372  int64_t v = Serialization::decode_vi64(&ptr, &remain);
373  for(auto it = ord; ;) {
374  if(Condition::is_matching(it->comp, it->value, v)) {
375  start = true;
376  ord = ++it;
377  break;
378  } else if(start) {
379  return false;
380  }
381  if(++it == items.cend())
382  return false;
383  }
384  }
385  return !remain;
386  }
387 
388  default:
389  break;
390  }
391  return false;
392 }
393 
394 void Field_LIST_INT64::print(std::ostream& out) const {
395  out << fid << ":LI:" << Condition::to_string(comp) << '[';
396  if(!items.empty()) for(auto it = items.cbegin(); ;) {
397  out << Condition::to_string(it->comp) << it->value;
398  if(++it == items.cend())
399  break;
400  out << ',';
401  }
402  out << ']';
403 }
404 //
405 
406 
407 
408 // Field LIST_BYTES
410  : Field(a_fid), comp(a_comp),
411  items(), _found() {
412 }
413 
415  const Field_LIST_BYTES::Vec& a_items)
416  : Field(a_fid),
417  comp(a_comp), items(a_items), _found() {
418 }
419 
420 Field_LIST_BYTES::Field_LIST_BYTES(const uint8_t** bufp, size_t* remainp)
421  : Field(bufp, remainp),
422  comp(Condition::Comp(Serialization::decode_i8(bufp, remainp))),
423  items(), _found() {
424  size_t len;
425  const uint8_t* ptr = Serialization::decode_bytes(bufp, remainp, &len);
426  while(len) {
427  auto& item = items.emplace_back();
428  item.comp = Condition::Comp(Serialization::decode_i8(&ptr, &len));
429  size_t vlen;
430  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &len, &vlen);
431  item.value.append(reinterpret_cast<const char*>(vptr), vlen);
432  }
434  _found.resize(items.size());
435 }
436 
437 size_t Field_LIST_BYTES::encoded_length() const noexcept {
438  size_t len = items.size();
439  for(const Item& item : items)
440  len += Serialization::encoded_length_bytes(item.value.size());
441  return Field::encoded_length()
443 }
444 
445 void Field_LIST_BYTES::encode(uint8_t** bufp) const {
448 
449  size_t len = items.size();
450  for(const Item& item : items)
451  len += Serialization::encoded_length_bytes(item.value.size());
452 
453  StaticBuffer value(len);
454  uint8_t* ptr = value.base;
455  for(const Item& item : items) {
456  Serialization::encode_i8(&ptr, item.comp);
457  Serialization::encode_bytes(&ptr, item.value.data(), item.value.size());
458  }
459  Serialization::encode_bytes(bufp, value.base, value.size);
460 }
461 
463  auto vfield = static_cast<Cell::Serial::Value::Field_LIST_BYTES*>(vfieldp);
464 
465  const uint8_t* ptr = vfield->base;
466  size_t remain = vfield->size;
467  switch(comp) {
468 
469  case Condition::NE: {
470  auto it = items.cbegin();
471  for(; remain && it != items.cend(); ++it) {
472  size_t vlen;
473  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &remain, &vlen);
475  it->comp,
476  reinterpret_cast<const uint8_t*>(it->value.c_str()),
477  it->value.size(),
478  vptr, vlen))
479  return true;
480  }
481  return remain || it != items.cend();
482  }
483 
484  case Condition::GT:
485  case Condition::LT:
486  case Condition::GE:
487  case Condition::LE:
488  case Condition::EQ: {
489  auto it = items.cbegin();
490  for(; remain && it != items.cend(); ++it) {
491  size_t vlen;
492  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &remain, &vlen);
494  it->comp,
495  reinterpret_cast<const uint8_t*>(it->value.c_str()),
496  it->value.size(),
497  vptr, vlen))
498  break;
499  }
500  return remain
501  ? it == items.cend() &&
503  : (it == items.cend()
504  ? (comp == Condition::EQ ||
506  : (comp == Condition::LT || comp == Condition::LE));
507  }
508 
509  case Condition::SBS: {
510  uint32_t sz = items.size();
511  if(!sz)
512  return true;
513  if(!remain)
514  return false;
515  uint32_t count = sz;
516  for(auto& f : _found)
517  f = false;
518  while(remain) {
519  size_t vlen;
520  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &remain, &vlen);
521  for(uint32_t i = 0; i < sz; ++i) {
522  if(!_found[i] &&
524  items[i].comp,
525  reinterpret_cast<const uint8_t*>(items[i].value.c_str()),
526  items[i].value.size(),
527  vptr, vlen)) {
528  if(!--count)
529  return true;
530  _found[i] = true;
531  break;
532  }
533  }
534  }
535  return false;
536  }
537 
538  case Condition::SPS: {
539  if(!remain)
540  return true;
541  uint32_t sz = items.size();
542  if(!sz)
543  return false;
544  for(auto& f : _found)
545  f = false;
546  while(remain) {
547  size_t vlen;
548  const uint8_t* vptr = Serialization::decode_bytes(
549  &ptr, &remain, &vlen);
550  for(uint32_t i = 0; ;) {
551  if(!_found[i] &&
553  items[i].comp,
554  reinterpret_cast<const uint8_t*>(items[i].value.c_str()),
555  items[i].value.size(),
556  vptr, vlen)) {
557  _found[i] = true;
558  break;
559  }
560  if(++i == sz)
561  return false;
562  }
563  }
564  return true;
565  }
566 
567  case Condition::POSBS: {
568  auto it = items.cbegin();
569  for(; remain && it != items.cend(); ) {
570  size_t vlen;
571  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &remain, &vlen);
573  it->comp,
574  reinterpret_cast<const uint8_t*>(it->value.c_str()),
575  it->value.size(),
576  vptr, vlen))
577  ++it;
578  }
579  return it == items.cend();
580  }
581 
582  case Condition::FOSBS: {
583  auto it = items.cbegin();
584  for(bool start = false; remain && it != items.cend(); ) {
585  size_t vlen;
586  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &remain, &vlen);
588  it->comp,
589  reinterpret_cast<const uint8_t*>(it->value.c_str()),
590  it->value.size(),
591  vptr, vlen)) {
592  start = true;
593  ++it;
594  } else if(start) {
595  return false;
596  }
597  }
598  return it == items.cend();
599  }
600 
601  case Condition::POSPS: {
602  for(auto ord = items.cbegin(); remain && ord != items.cend(); ) {
603  size_t vlen;
604  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &remain, &vlen);
605  for(auto it = ord; ;) {
607  it->comp,
608  reinterpret_cast<const uint8_t*>(it->value.c_str()),
609  it->value.size(),
610  vptr, vlen)) {
611  ++ord;
612  break;
613  }
614  if(++it == items.cend())
615  return false;
616  }
617  }
618  return !remain;
619  }
620 
621  case Condition::FOSPS: {
622  bool start = false;
623  for(auto ord = items.cbegin(); remain && ord != items.cend(); ) {
624  size_t vlen;
625  const uint8_t* vptr = Serialization::decode_bytes(&ptr, &remain, &vlen);
626  for(auto it = ord; ;) {
628  it->comp,
629  reinterpret_cast<const uint8_t*>(it->value.c_str()),
630  it->value.size(),
631  vptr, vlen)) {
632  start = true;
633  ord = ++it;
634  break;
635  } else if(start) {
636  return false;
637  }
638  if(++it == items.cend())
639  return false;
640  }
641  }
642  return !remain;
643  }
644 
645  default:
646  break;
647  }
648  return false;
649 }
650 
651 void Field_LIST_BYTES::print(std::ostream& out) const {
652  out << fid << ":LB:" << Condition::to_string(comp) << '[';
653  if(!items.empty()) for(auto it = items.cbegin(); ;) {
654  out << Condition::to_string(it->comp) << '\'';
655  char hex[5];
656  hex[4] = '\0';
657  const uint8_t* cptr = reinterpret_cast<const uint8_t*>(it->value.c_str());
658  const uint8_t* end = cptr + it->value.size();
659  for(; cptr < end; ++cptr) {
660  if(*cptr == '"')
661  out << '\\';
662  if(31 < *cptr && *cptr < 127) {
663  out << *cptr;
664  } else {
665  sprintf(hex, "0x%X", *cptr);
666  out << hex;
667  }
668  }
669  out << '\'';
670  if(++it == items.cend())
671  break;
672  out << ',';
673  }
674  out << ']';
675 }
676 //
677 
678 
679 
680 //
681 Fields::Fields(const uint8_t* ptr, size_t len, bool own)
682  : fields(), _fields_ptr() {
683  while(len) {
684  switch(Cell::Serial::Value::read_type(&ptr, &len)) {
685  case Type::INT64: {
686  fields.emplace_back(new Field_INT64(&ptr, &len));
687  break;
688  }
689  case Type::DOUBLE: {
690  fields.emplace_back(new Field_DOUBLE(&ptr, &len));
691  break;
692  }
693  case Type::BYTES: {
694  fields.emplace_back(new Field_BYTES(&ptr, &len, own));
695  break;
696  }
697  case Type::KEY: {
698  fields.emplace_back(new Field_KEY(&ptr, &len));
699  break;
700  }
701  case Type::LIST_INT64: {
702  fields.emplace_back(new Field_LIST_INT64(&ptr, &len));
703  break;
704  }
705  case Type::LIST_BYTES: {
706  fields.emplace_back(new Field_LIST_BYTES(&ptr, &len));
707  break;
708  }
709  default:
710  break;
711  }
712  }
713  _fields_ptr.resize(fields.size());
714 }
715 
716 bool Fields::has_field_id(uint24_t fid) const noexcept {
717  for(auto& field : fields) {
718  if(field->fid == fid)
719  return true;
720  }
721  return false;
722 }
723 
724 void Fields::add(Field::Ptr&& field) {
725  fields.push_back(std::move(field));
726 }
727 
728 size_t Fields::encoded_length() const noexcept {
729  size_t sz = 0;
730  for(auto& field : fields)
731  sz += field->encoded_length();
732  return sz;
733 }
734 
735 void Fields::encode(Specs::Value& value) const {
736  size_t len = encoded_length();
737  if(len) {
738  StaticBuffer buffer(len);
739  uint8_t* ptr = buffer.base;
740  encode(&ptr);
741  value.set(buffer.base, buffer.size, value.comp, false);
742  buffer.own = false;
743  value.own = true;
744  } else {
745  value.free();
746  }
747 }
748 
749 void Fields::encode(uint8_t** bufp) const {
750  for(auto& field : fields)
751  field->encode(bufp);
752 }
753 
754 template<Type TypeT>
756 bool
759  bool* more) {
760  for(auto it = fields_ptr.begin(); it != fields_ptr.cend(); ++it) {
761  if(*it) {
762  if((*it)->type() == TypeT && vfieldp->fid == (*it)->fid) {
763  if(!(*it)->is_matching(vfieldp))
764  return false;
765  *it = nullptr;
766  } else {
767  *more = true;
768  }
769  }
770  }
771  return true;
772 }
773 
774 bool Fields::is_matching(const Cells::Cell& cell) {
775 
776  StaticBuffer v;
777  cell.get_value(v, false);
778  if(!v.size)
779  return false;
780 
781  const uint8_t* ptr = v.base;
782  size_t remain = v.size;
783  for(size_t i = 0; i < fields.size(); ++i)
784  _fields_ptr[i] = fields[i].get();
785 
786  while(remain) {
787 
788  bool more = false;
789  switch(Cell::Serial::Value::read_type(&ptr, &remain)) {
790 
791  case Type::INT64: {
792  Cell::Serial::Value::Field_INT64 vfield(&ptr, &remain);
793  if(!Value::is_matching<Type::INT64>(_fields_ptr, &vfield, &more))
794  return false;
795  break;
796  }
797 
798  case Type::DOUBLE: {
799  Cell::Serial::Value::Field_DOUBLE vfield(&ptr, &remain);
800  if(!Value::is_matching<Type::DOUBLE>(_fields_ptr, &vfield, &more))
801  return false;
802  break;
803  }
804 
805  case Type::BYTES: {
806  Cell::Serial::Value::Field_BYTES vfield(&ptr, &remain, false);
807  if(!Value::is_matching<Type::BYTES>(_fields_ptr, &vfield, &more))
808  return false;
809  break;
810  }
811 
812  case Type::KEY: {
813  Cell::Serial::Value::Field_KEY vfield(&ptr, &remain, false);
814  if(!Value::is_matching<Type::KEY>(_fields_ptr, &vfield, &more))
815  return false;
816  break;
817  }
818 
819  case Type::LIST_INT64: {
820  Cell::Serial::Value::Field_LIST_INT64 vfield(&ptr, &remain, false);
821  if(!Value::is_matching<Type::LIST_INT64>(_fields_ptr, &vfield, &more))
822  return false;
823  break;
824  }
825 
826  case Type::LIST_BYTES: {
827  Cell::Serial::Value::Field_LIST_BYTES vfield(&ptr, &remain, false);
828  if(!Value::is_matching<Type::LIST_BYTES>(_fields_ptr, &vfield, &more))
829  return false;
830  break;
831  }
832 
833  default:
834  return false;
835  }
836  if(!more)
837  return true;
838  }
839  return false;
840 }
841 
842 void Fields::print(std::ostream& out) const {
843  out << "SerialFields(size=" << fields.size() << " [";
844  if(!fields.empty()) for(size_t i = 0; ; ) {
845  fields[i]->print(out << '(');
846  out << ')';
847  if(++i != fields.size())
848  out << ',';
849  else
850  break;
851  }
852  out << "])";
853 }
854 //
855 
856 
857 
858 }}}}}
SWC::DB::Specs::Serial::Value::Field_DOUBLE::is_matching
bool is_matching(Cell::Serial::Value::Field *vfieldp) override
Definition: SpecsValueSerialFields.cc:76
SWC::DB::Specs::Serial::Value::Field_BYTES::value
StaticBuffer value
Definition: SpecsValueSerialFields.h:175
SWC::Condition::LE
@ LE
Definition: Comparators.h:33
SWC::Condition::POSPS
@ POSPS
Definition: Comparators.h:48
SWC::DB::Specs::Serial::Value::Field_KEY::print
void print(std::ostream &out) const override
Definition: SpecsValueSerialFields.cc:183
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::print
void print(std::ostream &out) const override
Definition: SpecsValueSerialFields.cc:394
SWC::Condition::FOSPS
@ FOSPS
Definition: Comparators.h:50
SWC::Condition::is_matching_extended
SWC_CAN_INLINE bool is_matching_extended(uint8_t comp, const uint8_t *p1, uint32_t p1_len, const uint8_t *p2, uint32_t p2_len)
Definition: Comparators.h:459
SWC::Serialization::encoded_length_double
constexpr SWC_CAN_INLINE uint8_t encoded_length_double() noexcept
Definition: Serialization.h:517
SWC::DB::Specs::Serial::Value::Fields::print
void print(std::ostream &out) const
Definition: SpecsValueSerialFields.cc:842
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::_found
Core::Vector< bool > _found
Definition: SpecsValueSerialFields.h:268
SWC::Core::Vector::resize
SWC_CAN_INLINE void resize(size_type sz, ArgsT &&... args)
Definition: Vector.h:308
SWC::DB::Specs::Serial::Value::Field_BYTES
Definition: SpecsValueSerialFields.h:141
SWC::Condition::GE
@ GE
Definition: Comparators.h:31
SWC::DB::Specs::Serial::Value::Fields::add
void add(Field::Ptr &&field)
Definition: SpecsValueSerialFields.cc:724
SWC::DB::Specs::Key::encoded_length
SWC_CAN_INLINE uint32_t encoded_length() const noexcept
Definition: SpecsKey.h:269
SWC::DB::Specs::Serial::Value::Field::encode
virtual void encode(uint8_t **bufp) const =0
SWC::Serialization::encoded_length_bytes
constexpr SWC_CAN_INLINE size_t encoded_length_bytes(size_t len) noexcept
Definition: Serialization.h:537
SWC::DB::Specs::Value::set
SWC_CAN_INLINE void set(const char *data_n, Condition::Comp comp_n, bool owner)
Definition: SpecsValue.h:124
SWC::DB::Specs::Serial::Value::Field_INT64::value
int64_t value
Definition: SpecsValueSerialFields.h:102
SWC::DB::Specs::Serial::Value::Field_KEY::encode
void encode(uint8_t **bufp) const override
Definition: SpecsValueSerialFields.cc:172
SWC::DB::Cell::Serial::Value::Field_KEY
Definition: CellValueSerialField.h:209
SpecsValueSerialFields.h
SWC::DB::Specs::Serial::Value::Fields::_fields_ptr
Core::Vector< Field * > _fields_ptr
Definition: SpecsValueSerialFields.h:370
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::Condition::GT
@ GT
Definition: Comparators.h:30
SWC::DB::Cell::Serial::Value::Field::fid
uint24_t fid
Definition: CellValueSerialField.h:72
SWC::Serialization::encode_double
SWC_CAN_INLINE void encode_double(uint8_t **bufp, long double val) noexcept
Definition: Serialization.h:522
SWC::DB::Specs::Serial::Value::Field_BYTES::encoded_length
size_t SWC_PURE_FUNC encoded_length() const noexcept override
Definition: SpecsValueSerialFields.cc:112
SWC::DB::Specs::Serial::Value::Field_KEY::is_matching
bool is_matching(Cell::Serial::Value::Field *vfieldp) override
Definition: SpecsValueSerialFields.cc:178
SWC::DB::Specs::Serial::Value::Field_DOUBLE::encode
void encode(uint8_t **bufp) const override
Definition: SpecsValueSerialFields.cc:70
SWC::Condition::LT
@ LT
Definition: Comparators.h:34
SWC::DB::Specs::Serial::Value::Field_KEY::seq
Types::KeySeq seq
Definition: SpecsValueSerialFields.h:214
SWC::DB::Specs::Serial::Value::Field_BYTES::Field_BYTES
Field_BYTES(uint24_t fid, Condition::Comp comp, const uint8_t *ptr, size_t len, bool take_ownership)
Definition: SpecsValueSerialFields.cc:91
SWC::DB::Specs::Serial::Value::Field::encoded_length
virtual size_t encoded_length() const noexcept
Definition: SpecsValueSerialFields.h:56
SWC::DB::Cells::Cell
Definition: Cell.h:92
SWC::DB::Cell::Serial::Value::Field_LIST_BYTES
Definition: CellValueSerialField.h:323
SWC::DB::Specs::Serial::Value::Field_BYTES::print
void print(std::ostream &out) const override
Definition: SpecsValueSerialFields.cc:130
SWC::DB::Specs::Key
Definition: SpecsKey.h:136
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::encoded_length
size_t SWC_PURE_FUNC encoded_length() const noexcept override
Definition: SpecsValueSerialFields.cc:217
SWC::Serialization::encode_i8
constexpr SWC_CAN_INLINE void encode_i8(uint8_t **bufp, uint8_t val) noexcept
Definition: Serialization.h:85
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES
Definition: SpecsValueSerialFields.h:276
SWC::DB::Specs::Serial::Value::Field
Definition: SpecsValueSerialFields.h:39
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::Specs::Serial::Value::Field_KEY::encoded_length
size_t SWC_PURE_FUNC encoded_length() const noexcept override
Definition: SpecsValueSerialFields.cc:168
SWC::DB::Specs::Value::free
SWC_CAN_INLINE void free() noexcept
Definition: SpecsValue.h:158
SWC::DB::Cell::Serial::Value::DOUBLE
@ DOUBLE
Definition: CellValueSerialField.h:36
SWC::DB::Specs::Serial::Value::Field_BYTES::comp
Condition::Comp comp
Definition: SpecsValueSerialFields.h:174
SWC::DB::Types::KeySeq
KeySeq
Definition: KeySeq.h:13
SWC::DB::Specs::Serial::Value::Fields::is_matching
bool is_matching(const Cells::Cell &cell)
Definition: SpecsValueSerialFields.cc:774
SWC::DB::Cell::Serial::Value::BYTES
@ BYTES
Definition: CellValueSerialField.h:37
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::encode
void encode(uint8_t **bufp) const override
Definition: SpecsValueSerialFields.cc:445
SWC::Condition::Comp
Comp
Definition: Comparators.h:27
SWC::Core::Vector::empty
constexpr SWC_CAN_INLINE bool empty() const noexcept
Definition: Vector.h:168
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::Core::Buffer::base
value_type * base
Definition: Buffer.h:131
SWC::DB::Specs::Serial::Value::Field_BYTES::encode
void encode(uint8_t **bufp) const override
Definition: SpecsValueSerialFields.cc:117
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::DB::Specs::Serial::Value::Field_INT64::print
void print(std::ostream &out) const override
Definition: SpecsValueSerialFields.cc:45
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::comp
Condition::Comp comp
Definition: SpecsValueSerialFields.h:325
SWC::DB::Cell::Serial::Value::INT64
@ INT64
Definition: CellValueSerialField.h:35
SWC::DB::Specs::Serial::Value::is_matching
SWC_CAN_INLINE bool is_matching(Core::Vector< Field * > &fields_ptr, Cell::Serial::Value::Field *vfieldp, bool *more)
Definition: SpecsValueSerialFields.cc:757
SWC::Core::Buffer
Definition: Buffer.h:18
SWC::Core::Buffer::size
size_t size
Definition: Buffer.h:130
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::encode
void encode(uint8_t **bufp) const override
Definition: SpecsValueSerialFields.cc:225
SWC::Condition::EQ
@ EQ
Definition: Comparators.h:32
SWC::DB::Specs::Serial::Value::Field_DOUBLE::comp
Condition::Comp comp
Definition: SpecsValueSerialFields.h:133
SWC::DB::Specs::Serial::Value::Field_DOUBLE
Definition: SpecsValueSerialFields.h:109
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::comp
Condition::Comp comp
Definition: SpecsValueSerialFields.h:266
SWC::DB::Specs::Serial::Value::Field_KEY::Field_KEY
Field_KEY(uint24_t fid, Types::KeySeq seq)
Definition: SpecsValueSerialFields.cc:154
SWC::DB::Cells::Cell::get_value
Types::Encoder get_value(StaticBuffer &v, bool owner) const
Definition: Cell.cc:77
SWC::DB::Specs::Serial::Value::Fields::Fields
SWC_CAN_INLINE Fields() noexcept
Definition: SpecsValueSerialFields.h:338
SWC::Condition::NE
@ NE
Definition: Comparators.h:35
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::_found
Core::Vector< bool > _found
Definition: SpecsValueSerialFields.h:327
Serialization.h
SWC::DB::Specs::Serial::Value::Field_INT64::encode
void encode(uint8_t **bufp) const override
Definition: SpecsValueSerialFields.cc:33
SWC::DB::Specs::Serial::Value::Field::Ptr
std::unique_ptr< Field > Ptr
Definition: SpecsValueSerialFields.h:40
SWC::DB::Specs::Serial::Value::Field_DOUBLE::encoded_length
size_t SWC_PURE_FUNC encoded_length() const noexcept override
Definition: SpecsValueSerialFields.cc:65
SWC::Serialization::encoded_length_vi64
constexpr SWC_CAN_INLINE uint8_t encoded_length_vi64(uint64_t val) noexcept
Definition: Serialization.h:272
SWC::Condition::is_matching
SWC_CAN_INLINE bool is_matching(bool volumetric, uint8_t comp, const uint8_t *p1, uint32_t p1_len, const uint8_t *p2, uint32_t p2_len)
Definition: Comparators.h:439
SWC::DB::Cell::Serial::Value::LIST_INT64
@ LIST_INT64
Definition: CellValueSerialField.h:39
SWC::DB::Specs::Serial::Value::Field_BYTES::is_matching
bool is_matching(Cell::Serial::Value::Field *vfieldp) override
Definition: SpecsValueSerialFields.cc:123
SWC::DB::Specs::Value
Definition: SpecsValue.h:17
SWC::DB::Specs::Serial::Value::Field_INT64::comp
Condition::Comp comp
Definition: SpecsValueSerialFields.h:101
SWC::DB::Specs::Serial::Value::Field::fid
uint24_t fid
Definition: SpecsValueSerialFields.h:42
SWC::Condition::SPS
@ SPS
Definition: Comparators.h:46
SWC::DB::Specs::Key::is_matching
SWC_CAN_INLINE bool is_matching(const Types::KeySeq seq, const Cell::Key &key) const
Definition: SpecsKey.h:293
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::Specs::Serial::Value::Field_INT64::encoded_length
size_t SWC_PURE_FUNC encoded_length() const noexcept override
Definition: SpecsValueSerialFields.cc:28
SWC::DB::Cell::Serial::Value::Field_LIST_INT64
Definition: CellValueSerialField.h:241
SWC::DB::Specs::Serial::Value::Field_DOUBLE::Field_DOUBLE
Field_DOUBLE(uint24_t fid, Condition::Comp comp, const long double &value)
Definition: SpecsValueSerialFields.cc:54
SWC::DB::Specs::Serial::Value::Fields::fields
Core::Vector< Field::Ptr > fields
Definition: SpecsValueSerialFields.h:369
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::Field_LIST_INT64
Field_LIST_INT64(uint24_t fid, Condition::Comp comp)
Definition: SpecsValueSerialFields.cc:192
SWC::Condition::POSBS
@ POSBS
Definition: Comparators.h:47
SWC::Core::Vector< Item >
SWC::DB::Cell::Serial::Value::Field_DOUBLE
Definition: CellValueSerialField.h:143
SWC::DB::Specs::Serial::Value::Field_DOUBLE::value
long double value
Definition: SpecsValueSerialFields.h:134
SWC::DB::Specs::Serial::Value::Field_KEY
Definition: SpecsValueSerialFields.h:182
SWC::DB::Specs::Serial::Value::Field_INT64
Definition: SpecsValueSerialFields.h:78
SWC::uint24_t
Core::uint24_t uint24_t
Definition: BitFieldInt.h:401
SWC::DB::Specs::Key::encode
SWC_CAN_INLINE void encode(uint8_t **bufp) const
Definition: SpecsKey.h:277
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::Specs::Serial::Value::Field_LIST_BYTES::is_matching
bool is_matching(Cell::Serial::Value::Field *vfieldp) override
Definition: SpecsValueSerialFields.cc:462
SWC::DB::Specs::Serial::Value::Field_KEY::key
Key key
Definition: SpecsValueSerialFields.h:215
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::Item
Definition: SpecsValueSerialFields.h:278
SWC::DB::Specs::Serial::Value::Fields::has_field_id
bool SWC_PURE_FUNC has_field_id(uint24_t fid) const noexcept
Definition: SpecsValueSerialFields.cc:716
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::Condition::to_string
const char *SWC_CONST_FUNC to_string(Comp comp) noexcept
Definition: Comparators.cc:174
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::items
Vec items
Definition: SpecsValueSerialFields.h:326
SWC::Serialization::encode_vi64
constexpr SWC_CAN_INLINE void encode_vi64(uint8_t **bufp, uint64_t val)
Definition: Serialization.h:286
SWC::DB::Specs::Key::display
void display(std::ostream &out, bool pretty=true) const
Definition: SpecsKey.cc:112
SWC::DB::Cell::Serial::Value::LIST_BYTES
@ LIST_BYTES
Definition: CellValueSerialField.h:40
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::is_matching
bool is_matching(Cell::Serial::Value::Field *vfieldp) override
Definition: SpecsValueSerialFields.cc:242
SWC::DB::Specs::Serial::Value::Field_INT64::Field_INT64
Field_INT64(uint24_t fid, Condition::Comp comp, int64_t value)
Definition: SpecsValueSerialFields.cc:17
SWC::Condition::SBS
@ SBS
Definition: Comparators.h:45
SWC::Condition::FOSBS
@ FOSBS
Definition: Comparators.h:49
SWC::Core::Vector::push_back
SWC_CAN_INLINE void push_back(ArgsT &&... args)
Definition: Vector.h:331
SWC::Serialization::decode_double
SWC_CAN_INLINE long double decode_double(const uint8_t **bufp, size_t *remainp)
Definition: Serialization.h:527
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::encoded_length
size_t SWC_PURE_FUNC encoded_length() const noexcept override
Definition: SpecsValueSerialFields.cc:437
SWC::DB::Specs::Serial::Value::Fields::encoded_length
size_t encoded_length() const noexcept
Definition: SpecsValueSerialFields.cc:728
SWC::DB::Specs::Serial::Value::Field_LIST_INT64
Definition: SpecsValueSerialFields.h:223
SWC::DB::Specs::Value::own
bool own
Definition: SpecsValue.h:249
SWC::Core::Vector::cbegin
constexpr SWC_CAN_INLINE const_iterator cbegin() const noexcept
Definition: Vector.h:216
SWC::DB::Specs::Serial::Value::Field_INT64::is_matching
bool SWC_PURE_FUNC is_matching(Cell::Serial::Value::Field *vfieldp) override
Definition: SpecsValueSerialFields.cc:39
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::Specs::Serial::Value::Field_LIST_INT64::items
Vec items
Definition: SpecsValueSerialFields.h:267
SWC::Core::Vector::size
constexpr SWC_CAN_INLINE size_type size() const noexcept
Definition: Vector.h:189
SWC::DB::Specs::Serial::Value::Field_LIST_INT64::Item
Definition: SpecsValueSerialFields.h:225
SWC::Core::Vector::emplace_back
SWC_CAN_INLINE reference emplace_back(ArgsT &&... args)
Definition: Vector.h:349
SWC::Core::Buffer::own
bool own
Definition: Buffer.h:129
SWC::DB::Cell::Serial::Value::Field_INT64
Definition: CellValueSerialField.h:114
SWC::DB::Cell::Serial::Value::KEY
@ KEY
Definition: CellValueSerialField.h:38
SWC::DB::Specs::Serial::Value::Field_DOUBLE::print
void print(std::ostream &out) const override
Definition: SpecsValueSerialFields.cc:82
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::print
void print(std::ostream &out) const override
Definition: SpecsValueSerialFields.cc:651
SWC::DB::Specs::Serial::Value::Field_LIST_BYTES::Field_LIST_BYTES
Field_LIST_BYTES(uint24_t fid, Condition::Comp comp)
Definition: SpecsValueSerialFields.cc:409
SWC::DB::Specs::Value::comp
Condition::Comp comp
Definition: SpecsValue.h:250
SWC::Core::Vector::begin
constexpr SWC_CAN_INLINE iterator begin() noexcept
Definition: Vector.h:211
SWC::Core::Buffer::assign
SWC_CAN_INLINE void assign(const value_type *data, size_t len)
Definition: Buffer.h:103
SWC::Core::Buffer::set
void set(value_type *data, size_t len, bool take_ownership) noexcept
Definition: Buffer.h:109
SWC::DB::Specs::Serial::Value::Fields::encode
void encode(Specs::Value &value) const
Definition: SpecsValueSerialFields.cc:735