18 #include "hazelcast/client/serialization/serialization.h"
19 #include "hazelcast/util/Bits.h"
22 namespace serialization {
24 compact_writer::compact_writer(
25 pimpl::default_compact_writer* default_compact_writer)
26 : default_compact_writer(default_compact_writer)
27 , schema_writer(nullptr)
29 compact_writer::compact_writer(pimpl::schema_writer* schema_writer)
30 : default_compact_writer(nullptr)
31 , schema_writer(schema_writer)
35 compact_writer::write_boolean(
const std::string& field_name,
bool value)
37 if (default_compact_writer) {
38 default_compact_writer->write_boolean(field_name, value);
40 schema_writer->add_field(field_name, pimpl::field_kind::BOOLEAN);
44 compact_writer::write_int8(
const std::string& field_name, int8_t value)
46 if (default_compact_writer) {
47 default_compact_writer->write_int8(field_name, value);
49 schema_writer->add_field(field_name, pimpl::field_kind::INT8);
54 compact_writer::write_int16(
const std::string& field_name, int16_t value)
56 if (default_compact_writer) {
57 default_compact_writer->write_int16(field_name, value);
59 schema_writer->add_field(field_name, pimpl::field_kind::INT16);
64 compact_writer::write_int32(
const std::string& field_name, int32_t value)
66 if (default_compact_writer !=
nullptr) {
67 default_compact_writer->write_int32(field_name, value);
69 schema_writer->add_field(field_name, pimpl::field_kind::INT32);
74 compact_writer::write_int64(
const std::string& field_name, int64_t value)
76 if (default_compact_writer !=
nullptr) {
77 default_compact_writer->write_int64(field_name, value);
79 schema_writer->add_field(field_name, pimpl::field_kind::INT64);
84 compact_writer::write_float32(
const std::string& field_name,
float value)
86 if (default_compact_writer !=
nullptr) {
87 default_compact_writer->write_float32(field_name, value);
89 schema_writer->add_field(field_name, pimpl::field_kind::FLOAT32);
94 compact_writer::write_float64(
const std::string& field_name,
double value)
96 if (default_compact_writer !=
nullptr) {
97 default_compact_writer->write_float64(field_name, value);
99 schema_writer->add_field(field_name, pimpl::field_kind::FLOAT64);
104 compact_writer::write_string(
const std::string& field_name,
105 const boost::optional<std::string>& value)
107 if (default_compact_writer !=
nullptr) {
108 default_compact_writer->write_string(field_name, value);
110 schema_writer->add_field(field_name, pimpl::field_kind::STRING);
115 compact_writer::write_decimal(
const std::string& field_name,
116 const boost::optional<big_decimal>& value)
118 if (default_compact_writer !=
nullptr) {
119 default_compact_writer->write_decimal(field_name, value);
121 schema_writer->add_field(field_name, pimpl::field_kind::DECIMAL);
126 compact_writer::write_time(
127 const std::string& field_name,
128 const boost::optional<hazelcast::client::local_time>& value)
130 if (default_compact_writer !=
nullptr) {
131 default_compact_writer->write_time(field_name, value);
133 schema_writer->add_field(field_name, pimpl::field_kind::TIME);
138 compact_writer::write_date(
139 const std::string& field_name,
140 const boost::optional<hazelcast::client::local_date>& value)
142 if (default_compact_writer !=
nullptr) {
143 default_compact_writer->write_date(field_name, value);
145 schema_writer->add_field(field_name, pimpl::field_kind::DATE);
150 compact_writer::write_timestamp(
151 const std::string& field_name,
152 const boost::optional<hazelcast::client::local_date_time>& value)
154 if (default_compact_writer !=
nullptr) {
155 default_compact_writer->write_timestamp(field_name, value);
157 schema_writer->add_field(field_name, pimpl::field_kind::TIMESTAMP);
162 compact_writer::write_timestamp_with_timezone(
163 const std::string& field_name,
164 const boost::optional<hazelcast::client::offset_date_time>& value)
166 if (default_compact_writer !=
nullptr) {
167 default_compact_writer->write_timestamp_with_timezone(field_name,
170 schema_writer->add_field(field_name,
171 pimpl::field_kind::TIMESTAMP_WITH_TIMEZONE);
176 compact_writer::write_array_of_boolean(
177 const std::string& field_name,
178 const boost::optional<std::vector<bool>>& value)
180 if (default_compact_writer !=
nullptr) {
181 default_compact_writer->write_array_of_boolean(field_name, value);
183 schema_writer->add_field(field_name,
184 pimpl::field_kind::ARRAY_OF_BOOLEAN);
189 compact_writer::write_array_of_int8(
190 const std::string& field_name,
191 const boost::optional<std::vector<int8_t>>& value)
193 if (default_compact_writer !=
nullptr) {
194 default_compact_writer->write_array_of_int8(field_name, value);
196 schema_writer->add_field(field_name, pimpl::field_kind::ARRAY_OF_INT8);
201 compact_writer::write_array_of_int16(
202 const std::string& field_name,
203 const boost::optional<std::vector<int16_t>>& value)
205 if (default_compact_writer !=
nullptr) {
206 default_compact_writer->write_array_of_int16(field_name, value);
208 schema_writer->add_field(field_name, pimpl::field_kind::ARRAY_OF_INT16);
213 compact_writer::write_array_of_int32(
214 const std::string& field_name,
215 const boost::optional<std::vector<int32_t>>& value)
217 if (default_compact_writer !=
nullptr) {
218 default_compact_writer->write_array_of_int32(field_name, value);
220 schema_writer->add_field(field_name, pimpl::field_kind::ARRAY_OF_INT32);
225 compact_writer::write_array_of_int64(
226 const std::string& field_name,
227 const boost::optional<std::vector<int64_t>>& value)
229 if (default_compact_writer !=
nullptr) {
230 default_compact_writer->write_array_of_int64(field_name, value);
232 schema_writer->add_field(field_name, pimpl::field_kind::ARRAY_OF_INT64);
237 compact_writer::write_array_of_float32(
238 const std::string& field_name,
239 const boost::optional<std::vector<float>>& value)
241 if (default_compact_writer !=
nullptr) {
242 default_compact_writer->write_array_of_float32(field_name, value);
244 schema_writer->add_field(field_name,
245 pimpl::field_kind::ARRAY_OF_FLOAT32);
250 compact_writer::write_array_of_float64(
251 const std::string& field_name,
252 const boost::optional<std::vector<double>>& value)
254 if (default_compact_writer !=
nullptr) {
255 default_compact_writer->write_array_of_float64(field_name, value);
257 schema_writer->add_field(field_name,
258 pimpl::field_kind::ARRAY_OF_FLOAT64);
263 compact_writer::write_array_of_string(
264 const std::string& field_name,
265 const boost::optional<std::vector<boost::optional<std::string>>>& value)
267 if (default_compact_writer !=
nullptr) {
268 default_compact_writer->write_array_of_string(field_name, value);
270 schema_writer->add_field(field_name,
271 pimpl::field_kind::ARRAY_OF_STRING);
276 compact_writer::write_array_of_decimal(
277 const std::string& field_name,
278 const boost::optional<std::vector<boost::optional<big_decimal>>>& value)
280 if (default_compact_writer !=
nullptr) {
281 default_compact_writer->write_array_of_decimal(field_name, value);
283 schema_writer->add_field(field_name,
284 pimpl::field_kind::ARRAY_OF_DECIMAL);
289 compact_writer::write_array_of_time(
290 const std::string& field_name,
291 const boost::optional<std::vector<boost::optional<local_time>>>& value)
293 if (default_compact_writer !=
nullptr) {
294 default_compact_writer->write_array_of_time(field_name, value);
296 schema_writer->add_field(field_name, pimpl::field_kind::ARRAY_OF_TIME);
301 compact_writer::write_array_of_date(
302 const std::string& field_name,
303 const boost::optional<std::vector<boost::optional<local_date>>>& value)
305 if (default_compact_writer !=
nullptr) {
306 default_compact_writer->write_array_of_date(field_name, value);
308 schema_writer->add_field(field_name, pimpl::field_kind::ARRAY_OF_DATE);
313 compact_writer::write_array_of_timestamp(
314 const std::string& field_name,
315 const boost::optional<std::vector<boost::optional<local_date_time>>>& value)
317 if (default_compact_writer !=
nullptr) {
318 default_compact_writer->write_array_of_timestamp(field_name, value);
320 schema_writer->add_field(field_name,
321 pimpl::field_kind::ARRAY_OF_TIMESTAMP);
326 compact_writer::write_array_of_timestamp_with_timezone(
327 const std::string& field_name,
328 const boost::optional<std::vector<boost::optional<offset_date_time>>>& value)
330 if (default_compact_writer !=
nullptr) {
331 default_compact_writer->write_array_of_timestamp_with_timezone(
334 schema_writer->add_field(
335 field_name, pimpl::field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE);
340 compact_writer::write_nullable_boolean(
const std::string& field_name,
341 const boost::optional<bool>& value)
343 if (default_compact_writer !=
nullptr) {
344 default_compact_writer->write_nullable_boolean(field_name, value);
346 schema_writer->add_field(field_name,
347 pimpl::field_kind::NULLABLE_BOOLEAN);
352 compact_writer::write_nullable_int8(
const std::string& field_name,
353 const boost::optional<int8_t>& value)
355 if (default_compact_writer !=
nullptr) {
356 default_compact_writer->write_nullable_int8(field_name, value);
358 schema_writer->add_field(field_name, pimpl::field_kind::NULLABLE_INT8);
363 compact_writer::write_nullable_int16(
const std::string& field_name,
364 const boost::optional<int16_t>& value)
366 if (default_compact_writer !=
nullptr) {
367 default_compact_writer->write_nullable_int16(field_name, value);
369 schema_writer->add_field(field_name, pimpl::field_kind::NULLABLE_INT16);
374 compact_writer::write_nullable_int32(
const std::string& field_name,
375 const boost::optional<int32_t>& value)
377 if (default_compact_writer !=
nullptr) {
378 default_compact_writer->write_nullable_int32(field_name, value);
380 schema_writer->add_field(field_name, pimpl::field_kind::NULLABLE_INT32);
385 compact_writer::write_nullable_int64(
const std::string& field_name,
386 const boost::optional<int64_t>& value)
388 if (default_compact_writer !=
nullptr) {
389 default_compact_writer->write_nullable_int64(field_name, value);
391 schema_writer->add_field(field_name, pimpl::field_kind::NULLABLE_INT64);
396 compact_writer::write_nullable_float32(
const std::string& field_name,
397 const boost::optional<float>& value)
399 if (default_compact_writer !=
nullptr) {
400 default_compact_writer->write_nullable_float32(field_name, value);
402 schema_writer->add_field(field_name,
403 pimpl::field_kind::NULLABLE_FLOAT32);
408 compact_writer::write_nullable_float64(
const std::string& field_name,
409 const boost::optional<double>& value)
411 if (default_compact_writer !=
nullptr) {
412 default_compact_writer->write_nullable_float64(field_name, value);
414 schema_writer->add_field(field_name,
415 pimpl::field_kind::NULLABLE_FLOAT64);
420 compact_writer::write_array_of_nullable_boolean(
421 const std::string& field_name,
422 const boost::optional<std::vector<boost::optional<bool>>>& value)
424 if (default_compact_writer !=
nullptr) {
425 default_compact_writer->write_array_of_nullable_boolean(field_name,
428 schema_writer->add_field(field_name,
429 pimpl::field_kind::ARRAY_OF_NULLABLE_BOOLEAN);
434 compact_writer::write_array_of_nullable_int8(
435 const std::string& field_name,
436 const boost::optional<std::vector<boost::optional<int8_t>>>& value)
438 if (default_compact_writer !=
nullptr) {
439 default_compact_writer->write_array_of_nullable_int8(field_name, value);
441 schema_writer->add_field(field_name,
442 pimpl::field_kind::ARRAY_OF_NULLABLE_INT8);
447 compact_writer::write_array_of_nullable_int16(
448 const std::string& field_name,
449 const boost::optional<std::vector<boost::optional<int16_t>>>& value)
451 if (default_compact_writer !=
nullptr) {
452 default_compact_writer->write_array_of_nullable_int16(field_name,
455 schema_writer->add_field(field_name,
456 pimpl::field_kind::ARRAY_OF_NULLABLE_INT16);
461 compact_writer::write_array_of_nullable_int32(
462 const std::string& field_name,
463 const boost::optional<std::vector<boost::optional<int32_t>>>& value)
465 if (default_compact_writer !=
nullptr) {
466 default_compact_writer->write_array_of_nullable_int32(field_name,
469 schema_writer->add_field(field_name,
470 pimpl::field_kind::ARRAY_OF_NULLABLE_INT32);
475 compact_writer::write_array_of_nullable_int64(
476 const std::string& field_name,
477 const boost::optional<std::vector<boost::optional<int64_t>>>& value)
479 if (default_compact_writer !=
nullptr) {
480 default_compact_writer->write_array_of_nullable_int64(field_name,
483 schema_writer->add_field(field_name,
484 pimpl::field_kind::ARRAY_OF_NULLABLE_INT64);
489 compact_writer::write_array_of_nullable_float32(
490 const std::string& field_name,
491 const boost::optional<std::vector<boost::optional<float>>>& value)
493 if (default_compact_writer !=
nullptr) {
494 default_compact_writer->write_array_of_nullable_float32(field_name,
497 schema_writer->add_field(field_name,
498 pimpl::field_kind::ARRAY_OF_NULLABLE_FLOAT32);
503 compact_writer::write_array_of_nullable_float64(
504 const std::string& field_name,
505 const boost::optional<std::vector<boost::optional<double>>>& value)
507 if (default_compact_writer !=
nullptr) {
508 default_compact_writer->write_array_of_nullable_float64(field_name,
511 schema_writer->add_field(field_name,
512 pimpl::field_kind::ARRAY_OF_NULLABLE_FLOAT64);
518 create_compact_reader(
519 pimpl::compact_stream_serializer& compact_stream_serializer,
520 object_data_input& object_data_input,
521 const pimpl::schema& schema)
523 return compact_reader{ compact_stream_serializer,
529 const compact_reader::offset_func compact_reader::BYTE_OFFSET_READER =
530 pimpl::offset_reader::get_offset<int8_t>;
531 const compact_reader::offset_func compact_reader::SHORT_OFFSET_READER =
532 pimpl::offset_reader::get_offset<int16_t>;
533 const compact_reader::offset_func compact_reader::INT_OFFSET_READER =
534 pimpl::offset_reader::get_offset<int32_t>;
536 compact_reader::compact_reader(
537 pimpl::compact_stream_serializer& compact_stream_serializer,
538 serialization::object_data_input& object_data_input,
539 const pimpl::schema& schema)
540 : compact_stream_serializer(compact_stream_serializer)
541 , object_data_input(object_data_input)
544 size_t final_position;
545 size_t number_of_var_size_fields = schema.number_of_var_size_fields();
546 if (number_of_var_size_fields != 0) {
547 uint32_t data_length = object_data_input.read<int32_t>();
548 data_start_position = object_data_input.position();
549 variable_offsets_position = data_start_position + data_length;
550 if (data_length < pimpl::offset_reader::BYTE_OFFSET_READER_RANGE) {
551 get_offset = BYTE_OFFSET_READER;
553 variable_offsets_position + number_of_var_size_fields;
554 }
else if (data_length <
555 pimpl::offset_reader::SHORT_OFFSET_READER_RANGE) {
556 get_offset = SHORT_OFFSET_READER;
558 variable_offsets_position +
559 (number_of_var_size_fields * util::Bits::SHORT_SIZE_IN_BYTES);
561 get_offset = INT_OFFSET_READER;
563 variable_offsets_position +
564 (number_of_var_size_fields * util::Bits::INT_SIZE_IN_BYTES);
567 get_offset = INT_OFFSET_READER;
568 variable_offsets_position = 0;
569 data_start_position = object_data_input.position();
571 data_start_position + schema.fixed_size_fields_length();
575 object_data_input.position(
static_cast<int>(final_position));
579 compact_reader::is_field_exists(
const std::string& field_name,
580 enum pimpl::field_kind kind)
const
582 const auto& fields = schema.fields();
583 const auto& field_descriptor = fields.find(field_name);
584 if (field_descriptor == fields.end()) {
587 return field_descriptor->second.field_kind == kind;
590 const pimpl::field_descriptor&
591 compact_reader::get_field_descriptor(
const std::string& field_name)
const
593 const auto& fields = schema.fields();
594 const auto& field_descriptor = fields.find(field_name);
595 if (field_descriptor == fields.end()) {
596 BOOST_THROW_EXCEPTION(unknown_field(field_name));
598 return field_descriptor->second;
601 const pimpl::field_descriptor&
602 compact_reader::get_field_descriptor(
const std::string& field_name,
603 enum pimpl::field_kind kind)
const
605 const auto& field_descriptor = get_field_descriptor(field_name);
606 if (field_descriptor.field_kind != kind) {
607 BOOST_THROW_EXCEPTION(
608 unexpected_field_kind(field_descriptor.field_kind, field_name));
610 return field_descriptor;
613 std::function<int32_t(serialization::object_data_input&, uint32_t, uint32_t)>
614 compact_reader::get_offset_reader(int32_t data_length)
616 if (data_length < pimpl::offset_reader::BYTE_OFFSET_READER_RANGE) {
617 return BYTE_OFFSET_READER;
618 }
else if (data_length < pimpl::offset_reader::SHORT_OFFSET_READER_RANGE) {
619 return SHORT_OFFSET_READER;
621 return INT_OFFSET_READER;
625 exception::hazelcast_serialization
626 compact_reader::unexpected_null_value_in_array(
const std::string& field_name,
627 const std::string& method_suffix)
632 "Error while reading %1%. Array with null items can not be read via "
633 "read_array_of_%2% methods. Use read_array_of_nullable_%2% "
635 field_name % method_suffix)
639 exception::hazelcast_serialization
640 compact_reader::unknown_field(
const std::string& field_name)
const
642 return {
"compact_reader",
643 (boost::format(
"Unknown field name %1% on %2% ") % field_name %
648 exception::hazelcast_serialization
649 compact_reader::unexpected_field_kind(
enum pimpl::field_kind field_kind,
650 const std::string& field_name)
const
652 return {
"compact_reader",
653 (boost::format(
"Unexpected fieldKind %1% for %2% on %3%") %
654 field_kind % field_name % schema)
658 exception::hazelcast_serialization
659 compact_reader::unexpected_null_value(
const std::string& field_name,
660 const std::string& method_suffix)
662 return {
"compact_reader",
664 "Error while reading %1%. null value can not be read via "
665 "read_%2% methods. Use read_nullable_%2% instead.") %
666 field_name % method_suffix)
671 compact_reader::read_fixed_size_position(
672 const pimpl::field_descriptor& field_descriptor)
const
674 int32_t primitive_offset = field_descriptor.offset;
675 return primitive_offset + data_start_position;
679 compact_reader::read_var_size_position(
680 const pimpl::field_descriptor& field_descriptor)
const
682 int32_t index = field_descriptor.index;
684 get_offset(object_data_input, variable_offsets_position, index);
685 return offset == pimpl::offset_reader::NULL_OFFSET
686 ? pimpl::offset_reader::NULL_OFFSET
687 : offset + data_start_position;
691 compact_reader::read_boolean(
const std::string& fieldName)
693 return read_primitive<bool>(fieldName,
694 pimpl::field_kind::BOOLEAN,
695 pimpl::field_kind::NULLABLE_BOOLEAN,
700 compact_reader::read_int8(
const std::string& fieldName)
702 return read_primitive<int8_t>(fieldName,
703 pimpl::field_kind::INT8,
704 pimpl::field_kind::NULLABLE_INT8,
709 compact_reader::read_int16(
const std::string& field_name)
711 return read_primitive<int16_t>(field_name,
712 pimpl::field_kind::INT16,
713 pimpl::field_kind::NULLABLE_INT16,
718 compact_reader::read_int32(
const std::string& field_name)
720 return read_primitive<int32_t>(field_name,
721 pimpl::field_kind::INT32,
722 pimpl::field_kind::NULLABLE_INT32,
727 compact_reader::read_int64(
const std::string& field_name)
729 return read_primitive<int64_t>(field_name,
730 pimpl::field_kind::INT64,
731 pimpl::field_kind::NULLABLE_INT64,
736 compact_reader::read_float32(
const std::string& field_name)
738 return read_primitive<float>(field_name,
739 pimpl::field_kind::FLOAT32,
740 pimpl::field_kind::NULLABLE_FLOAT32,
745 compact_reader::read_float64(
const std::string& field_name)
747 return read_primitive<double>(field_name,
748 pimpl::field_kind::FLOAT64,
749 pimpl::field_kind::NULLABLE_FLOAT64,
753 boost::optional<std::string>
754 compact_reader::read_string(
const std::string& field_name)
756 return read_variable_size<std::string>(field_name,
757 pimpl::field_kind::STRING);
760 boost::optional<big_decimal>
761 compact_reader::read_decimal(
const std::string& field_name)
763 return read_variable_size<big_decimal>(field_name,
764 pimpl::field_kind::DECIMAL);
767 boost::optional<hazelcast::client::local_time>
768 compact_reader::read_time(
const std::string& field_name)
770 return read_variable_size<hazelcast::client::local_time>(
771 field_name, pimpl::field_kind::TIME);
774 boost::optional<hazelcast::client::local_date>
775 compact_reader::read_date(
const std::string& field_name)
777 return read_variable_size<hazelcast::client::local_date>(
778 field_name, pimpl::field_kind::DATE);
781 boost::optional<hazelcast::client::local_date_time>
782 compact_reader::read_timestamp(
const std::string& field_name)
784 return read_variable_size<hazelcast::client::local_date_time>(
785 field_name, pimpl::field_kind::TIMESTAMP);
788 boost::optional<hazelcast::client::offset_date_time>
789 compact_reader::read_timestamp_with_timezone(
const std::string& field_name)
791 return read_variable_size<hazelcast::client::offset_date_time>(
792 field_name, pimpl::field_kind::TIMESTAMP_WITH_TIMEZONE);
795 boost::optional<std::vector<bool>>
796 compact_reader::read_array_of_boolean(
const std::string& field_name)
798 return read_array_of_primitive<std::vector<bool>>(
800 pimpl::field_kind::ARRAY_OF_BOOLEAN,
801 pimpl::ARRAY_OF_NULLABLE_BOOLEAN,
805 boost::optional<std::vector<int8_t>>
806 compact_reader::read_array_of_int8(
const std::string& field_name)
808 return read_array_of_primitive<std::vector<int8_t>>(
810 pimpl::field_kind::ARRAY_OF_INT8,
811 pimpl::ARRAY_OF_NULLABLE_INT8,
815 boost::optional<std::vector<int16_t>>
816 compact_reader::read_array_of_int16(
const std::string& field_name)
818 return read_array_of_primitive<std::vector<int16_t>>(
820 pimpl::field_kind::ARRAY_OF_INT16,
821 pimpl::ARRAY_OF_NULLABLE_INT16,
825 boost::optional<std::vector<int32_t>>
826 compact_reader::read_array_of_int32(
const std::string& field_name)
828 return read_array_of_primitive<std::vector<int32_t>>(
830 pimpl::field_kind::ARRAY_OF_INT32,
831 pimpl::ARRAY_OF_NULLABLE_INT32,
834 boost::optional<std::vector<int64_t>>
835 compact_reader::read_array_of_int64(
const std::string& field_name)
837 return read_array_of_primitive<std::vector<int64_t>>(
839 pimpl::field_kind::ARRAY_OF_INT64,
840 pimpl::ARRAY_OF_NULLABLE_INT64,
844 boost::optional<std::vector<float>>
845 compact_reader::read_array_of_float32(
const std::string& field_name)
847 return read_array_of_primitive<std::vector<float>>(
849 pimpl::field_kind::ARRAY_OF_FLOAT32,
850 pimpl::ARRAY_OF_NULLABLE_FLOAT32,
854 boost::optional<std::vector<double>>
855 compact_reader::read_array_of_float64(
const std::string& field_name)
857 return read_array_of_primitive<std::vector<double>>(
859 pimpl::field_kind::ARRAY_OF_FLOAT64,
860 pimpl::ARRAY_OF_NULLABLE_FLOAT64,
864 boost::optional<std::vector<boost::optional<std::string>>>
865 compact_reader::read_array_of_string(
const std::string& field_name)
867 const auto& descriptor =
868 get_field_descriptor(field_name, pimpl::field_kind::ARRAY_OF_STRING);
869 return read_array_of_variable_size<std::string>(descriptor);
872 boost::optional<std::vector<boost::optional<big_decimal>>>
873 compact_reader::read_array_of_decimal(
const std::string& field_name)
875 const auto& descriptor =
876 get_field_descriptor(field_name, pimpl::field_kind::ARRAY_OF_DECIMAL);
877 return read_array_of_variable_size<big_decimal>(descriptor);
880 boost::optional<std::vector<boost::optional<local_time>>>
881 compact_reader::read_array_of_time(
const std::string& field_name)
883 const auto& descriptor =
884 get_field_descriptor(field_name, pimpl::field_kind::ARRAY_OF_TIME);
885 return read_array_of_variable_size<local_time>(descriptor);
888 boost::optional<std::vector<boost::optional<local_date>>>
889 compact_reader::read_array_of_date(
const std::string& field_name)
891 const auto& descriptor =
892 get_field_descriptor(field_name, pimpl::field_kind::ARRAY_OF_DATE);
893 return read_array_of_variable_size<local_date>(descriptor);
896 boost::optional<std::vector<boost::optional<local_date_time>>>
897 compact_reader::read_array_of_timestamp(
const std::string& field_name)
899 const auto& descriptor =
900 get_field_descriptor(field_name, pimpl::field_kind::ARRAY_OF_TIMESTAMP);
901 return read_array_of_variable_size<local_date_time>(descriptor);
904 boost::optional<std::vector<boost::optional<offset_date_time>>>
905 compact_reader::read_array_of_timestamp_with_timezone(
906 const std::string& field_name)
908 const auto& descriptor = get_field_descriptor(
909 field_name, pimpl::field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE);
910 return read_array_of_variable_size<offset_date_time>(descriptor);
913 boost::optional<bool>
914 compact_reader::read_nullable_boolean(
const std::string& field_name)
916 return read_nullable_primitive<bool>(field_name,
917 pimpl::field_kind::BOOLEAN,
918 pimpl::field_kind::NULLABLE_BOOLEAN);
921 boost::optional<int8_t>
922 compact_reader::read_nullable_int8(
const std::string& field_name)
924 return read_nullable_primitive<int8_t>(
925 field_name, pimpl::field_kind::INT8, pimpl::field_kind::NULLABLE_INT8);
928 boost::optional<int16_t>
929 compact_reader::read_nullable_int16(
const std::string& field_name)
931 return read_nullable_primitive<int16_t>(
932 field_name, pimpl::field_kind::INT16, pimpl::field_kind::NULLABLE_INT16);
935 boost::optional<int32_t>
936 compact_reader::read_nullable_int32(
const std::string& field_name)
938 return read_nullable_primitive<int32_t>(
939 field_name, pimpl::field_kind::INT32, pimpl::field_kind::NULLABLE_INT32);
942 boost::optional<int64_t>
943 compact_reader::read_nullable_int64(
const std::string& field_name)
945 return read_nullable_primitive<int64_t>(
946 field_name, pimpl::field_kind::INT64, pimpl::field_kind::NULLABLE_INT64);
949 boost::optional<float>
950 compact_reader::read_nullable_float32(
const std::string& field_name)
952 return read_nullable_primitive<float>(field_name,
953 pimpl::field_kind::FLOAT32,
954 pimpl::field_kind::NULLABLE_FLOAT32);
957 boost::optional<double>
958 compact_reader::read_nullable_float64(
const std::string& field_name)
960 return read_nullable_primitive<double>(field_name,
961 pimpl::field_kind::FLOAT64,
962 pimpl::field_kind::NULLABLE_FLOAT64);
965 boost::optional<std::vector<boost::optional<bool>>>
966 compact_reader::read_array_of_nullable_boolean(
const std::string& field_name)
968 return read_array_of_nullable<bool>(field_name,
969 pimpl::field_kind::ARRAY_OF_BOOLEAN,
970 pimpl::ARRAY_OF_NULLABLE_BOOLEAN);
973 boost::optional<std::vector<boost::optional<int8_t>>>
974 compact_reader::read_array_of_nullable_int8(
const std::string& field_name)
976 return read_array_of_nullable<int8_t>(field_name,
977 pimpl::field_kind::ARRAY_OF_INT8,
978 pimpl::ARRAY_OF_NULLABLE_INT8);
981 boost::optional<std::vector<boost::optional<int16_t>>>
982 compact_reader::read_array_of_nullable_int16(
const std::string& field_name)
984 return read_array_of_nullable<int16_t>(field_name,
985 pimpl::field_kind::ARRAY_OF_INT16,
986 pimpl::ARRAY_OF_NULLABLE_INT16);
989 boost::optional<std::vector<boost::optional<int32_t>>>
990 compact_reader::read_array_of_nullable_int32(
const std::string& field_name)
992 return read_array_of_nullable<int32_t>(field_name,
993 pimpl::field_kind::ARRAY_OF_INT32,
994 pimpl::ARRAY_OF_NULLABLE_INT32);
997 boost::optional<std::vector<boost::optional<int64_t>>>
998 compact_reader::read_array_of_nullable_int64(
const std::string& field_name)
1000 return read_array_of_nullable<int64_t>(field_name,
1001 pimpl::field_kind::ARRAY_OF_INT64,
1002 pimpl::ARRAY_OF_NULLABLE_INT64);
1005 boost::optional<std::vector<boost::optional<float>>>
1006 compact_reader::read_array_of_nullable_float32(
const std::string& field_name)
1008 return read_array_of_nullable<float>(field_name,
1009 pimpl::field_kind::ARRAY_OF_FLOAT32,
1010 pimpl::ARRAY_OF_NULLABLE_FLOAT32);
1013 boost::optional<std::vector<boost::optional<double>>>
1014 compact_reader::read_array_of_nullable_float64(
const std::string& field_name)
1016 return read_array_of_nullable<double>(field_name,
1017 pimpl::field_kind::ARRAY_OF_FLOAT64,
1018 pimpl::ARRAY_OF_NULLABLE_FLOAT64);
1024 create_compact_writer(pimpl::default_compact_writer* default_compact_writer)
1026 return compact_writer{ default_compact_writer };
1029 create_compact_writer(pimpl::schema_writer* schema_writer)
1031 return compact_writer{ schema_writer };
1034 default_compact_writer::default_compact_writer(
1035 compact_stream_serializer& compact_stream_serializer,
1036 object_data_output& object_data_output,
1037 const schema& schema)
1038 : compact_stream_serializer_(compact_stream_serializer)
1039 , object_data_output_(object_data_output)
1041 , field_offsets(schema.number_of_var_size_fields())
1043 if (schema.number_of_var_size_fields() != 0) {
1044 data_start_position =
1045 object_data_output_.position() + util::Bits::INT_SIZE_IN_BYTES;
1047 object_data_output_.write_zero_bytes(schema.fixed_size_fields_length() +
1048 util::Bits::INT_SIZE_IN_BYTES);
1050 data_start_position = object_data_output_.position();
1053 object_data_output_.write_zero_bytes(schema.fixed_size_fields_length());
1058 default_compact_writer::write_boolean(
const std::string& field_name,
bool value)
1060 field_descriptor descriptor =
1061 check_field_definition(field_name, field_kind::BOOLEAN);
1062 int32_t offset_in_bytes = descriptor.offset;
1063 int8_t offset_in_bits = descriptor.bit_offset;
1064 size_t write_offset = offset_in_bytes + data_start_position;
1065 object_data_output_.write_boolean_bit_at(
1066 write_offset, offset_in_bits, value);
1070 default_compact_writer::write_int8(
const std::string& field_name, int8_t value)
1073 get_fixed_size_field_position(field_name, field_kind::INT8);
1074 object_data_output_.write_at(position, value);
1078 default_compact_writer::write_int16(
const std::string& field_name,
1082 get_fixed_size_field_position(field_name, field_kind::INT16);
1083 object_data_output_.write_at(position, value);
1087 default_compact_writer::write_int32(
const std::string& field_name,
1091 get_fixed_size_field_position(field_name, field_kind::INT32);
1092 object_data_output_.write_at(position, value);
1096 default_compact_writer::write_int64(
const std::string& field_name,
1100 get_fixed_size_field_position(field_name, field_kind::INT64);
1101 object_data_output_.write_at(position, value);
1105 default_compact_writer::write_float32(
const std::string& field_name,
1109 get_fixed_size_field_position(field_name, field_kind::FLOAT32);
1110 object_data_output_.write_at(position, value);
1114 default_compact_writer::write_float64(
const std::string& field_name,
1118 get_fixed_size_field_position(field_name, field_kind::FLOAT64);
1119 object_data_output_.write_at(position, value);
1123 default_compact_writer::write_string(
const std::string& field_name,
1124 const boost::optional<std::string>& value)
1126 write_variable_size_field(field_name, field_kind::STRING, value);
1130 default_compact_writer::write_decimal(
const std::string& field_name,
1131 const boost::optional<big_decimal>& value)
1133 write_variable_size_field(field_name, field_kind::DECIMAL, value);
1137 default_compact_writer::write_time(
1138 const std::string& field_name,
1139 const boost::optional<hazelcast::client::local_time>& value)
1141 write_variable_size_field(field_name, field_kind::TIME, value);
1144 default_compact_writer::write_date(
1145 const std::string& field_name,
1146 const boost::optional<hazelcast::client::local_date>& value)
1148 write_variable_size_field(field_name, field_kind::DATE, value);
1152 default_compact_writer::write_timestamp(
1153 const std::string& field_name,
1154 const boost::optional<hazelcast::client::local_date_time>& value)
1156 write_variable_size_field(field_name, field_kind::TIMESTAMP, value);
1160 default_compact_writer::write_timestamp_with_timezone(
1161 const std::string& field_name,
1162 const boost::optional<hazelcast::client::offset_date_time>& value)
1164 write_variable_size_field(
1165 field_name, field_kind::TIMESTAMP_WITH_TIMEZONE, value);
1169 default_compact_writer::write_array_of_boolean(
1170 const std::string& field_name,
1171 const boost::optional<std::vector<bool>>& value)
1173 write_variable_size_field(field_name, field_kind::ARRAY_OF_BOOLEAN, value);
1177 default_compact_writer::write_array_of_int8(
1178 const std::string& field_name,
1179 const boost::optional<std::vector<int8_t>>& value)
1181 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT8, value);
1185 default_compact_writer::write_array_of_int16(
1186 const std::string& field_name,
1187 const boost::optional<std::vector<int16_t>>& value)
1189 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT16, value);
1193 default_compact_writer::write_array_of_int32(
1194 const std::string& field_name,
1195 const boost::optional<std::vector<int32_t>>& value)
1197 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT32, value);
1201 default_compact_writer::write_array_of_int64(
1202 const std::string& field_name,
1203 const boost::optional<std::vector<int64_t>>& value)
1205 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT64, value);
1209 default_compact_writer::write_array_of_float32(
1210 const std::string& field_name,
1211 const boost::optional<std::vector<float>>& value)
1213 write_variable_size_field(field_name, field_kind::ARRAY_OF_FLOAT32, value);
1217 default_compact_writer::write_array_of_float64(
1218 const std::string& field_name,
1219 const boost::optional<std::vector<double>>& value)
1221 write_variable_size_field(field_name, field_kind::ARRAY_OF_FLOAT64, value);
1225 default_compact_writer::write_array_of_string(
1226 const std::string& field_name,
1227 const boost::optional<std::vector<boost::optional<std::string>>>& value)
1229 write_array_of_variable_size(
1230 field_name, field_kind::ARRAY_OF_STRING, value);
1234 default_compact_writer::write_array_of_decimal(
1235 const std::string& field_name,
1236 const boost::optional<std::vector<boost::optional<big_decimal>>>& value)
1238 write_array_of_variable_size(
1239 field_name, field_kind::ARRAY_OF_DECIMAL, value);
1243 default_compact_writer::write_array_of_time(
1244 const std::string& field_name,
1245 const boost::optional<std::vector<boost::optional<local_time>>>& value)
1247 write_array_of_variable_size(field_name, field_kind::ARRAY_OF_TIME, value);
1251 default_compact_writer::write_array_of_date(
1252 const std::string& field_name,
1253 const boost::optional<std::vector<boost::optional<local_date>>>& value)
1255 write_array_of_variable_size(field_name, field_kind::ARRAY_OF_DATE, value);
1259 default_compact_writer::write_array_of_timestamp(
1260 const std::string& field_name,
1261 const boost::optional<std::vector<boost::optional<local_date_time>>>& value)
1263 write_array_of_variable_size(
1264 field_name, field_kind::ARRAY_OF_TIMESTAMP, value);
1268 default_compact_writer::write_array_of_timestamp_with_timezone(
1269 const std::string& field_name,
1270 const boost::optional<std::vector<boost::optional<offset_date_time>>>& value)
1272 write_array_of_variable_size(
1273 field_name, field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE, value);
1277 default_compact_writer::write_nullable_boolean(
1278 const std::string& field_name,
1279 const boost::optional<bool>& value)
1281 write_variable_size_field(field_name, field_kind::NULLABLE_BOOLEAN, value);
1284 default_compact_writer::write_nullable_int8(
1285 const std::string& field_name,
1286 const boost::optional<int8_t>& value)
1288 write_variable_size_field(field_name, field_kind::NULLABLE_INT8, value);
1291 default_compact_writer::write_nullable_int16(
1292 const std::string& field_name,
1293 const boost::optional<int16_t>& value)
1295 write_variable_size_field(field_name, field_kind::NULLABLE_INT16, value);
1298 default_compact_writer::write_nullable_int32(
1299 const std::string& field_name,
1300 const boost::optional<int32_t>& value)
1302 write_variable_size_field(field_name, field_kind::NULLABLE_INT32, value);
1305 default_compact_writer::write_nullable_int64(
1306 const std::string& field_name,
1307 const boost::optional<int64_t>& value)
1309 write_variable_size_field(field_name, field_kind::NULLABLE_INT64, value);
1312 default_compact_writer::write_nullable_float32(
1313 const std::string& field_name,
1314 const boost::optional<float>& value)
1316 write_variable_size_field(field_name, field_kind::NULLABLE_FLOAT32, value);
1319 default_compact_writer::write_nullable_float64(
1320 const std::string& field_name,
1321 const boost::optional<double>& value)
1323 write_variable_size_field(field_name, field_kind::NULLABLE_FLOAT64, value);
1327 default_compact_writer::write_array_of_nullable_boolean(
1328 const std::string& field_name,
1329 const boost::optional<std::vector<boost::optional<bool>>>& value)
1331 write_array_of_variable_size(
1332 field_name, field_kind::ARRAY_OF_NULLABLE_BOOLEAN, value);
1336 default_compact_writer::write_array_of_nullable_int8(
1337 const std::string& field_name,
1338 const boost::optional<std::vector<boost::optional<int8_t>>>& value)
1340 write_array_of_variable_size(
1341 field_name, field_kind::ARRAY_OF_NULLABLE_INT8, value);
1345 default_compact_writer::write_array_of_nullable_int16(
1346 const std::string& field_name,
1347 const boost::optional<std::vector<boost::optional<int16_t>>>& value)
1349 write_array_of_variable_size(
1350 field_name, field_kind::ARRAY_OF_NULLABLE_INT16, value);
1354 default_compact_writer::write_array_of_nullable_int32(
1355 const std::string& field_name,
1356 const boost::optional<std::vector<boost::optional<int32_t>>>& value)
1358 write_array_of_variable_size(
1359 field_name, field_kind::ARRAY_OF_NULLABLE_INT32, value);
1363 default_compact_writer::write_array_of_nullable_int64(
1364 const std::string& field_name,
1365 const boost::optional<std::vector<boost::optional<int64_t>>>& value)
1367 write_array_of_variable_size(
1368 field_name, field_kind::ARRAY_OF_NULLABLE_INT64, value);
1372 default_compact_writer::write_array_of_nullable_float32(
1373 const std::string& field_name,
1374 const boost::optional<std::vector<boost::optional<float>>>& value)
1376 write_array_of_variable_size(
1377 field_name, field_kind::ARRAY_OF_NULLABLE_FLOAT32, value);
1381 default_compact_writer::write_array_of_nullable_float64(
1382 const std::string& field_name,
1383 const boost::optional<std::vector<boost::optional<double>>>& value)
1385 write_array_of_variable_size(
1386 field_name, field_kind::ARRAY_OF_NULLABLE_FLOAT64, value);
1390 default_compact_writer::end()
1392 if (schema_.number_of_var_size_fields() == 0) {
1396 size_t position = object_data_output_.position();
1397 size_t data_length = position - data_start_position;
1398 write_offsets(data_length, field_offsets);
1400 object_data_output_.write_at(data_start_position -
1401 util::Bits::INT_SIZE_IN_BYTES,
1402 (int32_t)data_length);
1406 default_compact_writer::get_fixed_size_field_position(
1407 const std::string& field_name,
1408 enum field_kind field_kind)
const
1410 const field_descriptor& field_descriptor =
1411 check_field_definition(field_name, field_kind);
1412 return field_descriptor.offset + data_start_position;
1415 const field_descriptor&
1416 default_compact_writer::check_field_definition(
const std::string& field_name,
1417 enum field_kind field_kind)
const
1419 auto iterator = schema_.fields().find(field_name);
1420 if (iterator == schema_.fields().end()) {
1421 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1422 "default_compact_writer",
1423 (boost::format(
"Invalid field name %1% for %2%") % field_name %
1427 if (iterator->second.field_kind != field_kind) {
1428 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1429 "default_compact_writer",
1430 (boost::format(
"Invalid field type %1% for %2%") % field_name %
1434 return iterator->second;
1438 default_compact_writer::write_offsets(
size_t data_length,
1439 const std::vector<int32_t>& offsets)
1441 if (data_length < offset_reader::BYTE_OFFSET_READER_RANGE) {
1442 for (int32_t offset : offsets) {
1443 object_data_output_.write<int8_t>(
static_cast<int8_t
>(offset));
1445 }
else if (data_length < offset_reader::SHORT_OFFSET_READER_RANGE) {
1446 for (int32_t offset : offsets) {
1447 object_data_output_.write<int16_t>(
static_cast<int16_t
>(offset));
1450 for (int32_t offset : offsets) {
1451 object_data_output_.write<int32_t>(offset);
1457 default_compact_writer::set_position(
const std::string& field_name,
1458 enum field_kind field_kind)
1460 const auto& field_descriptor =
1461 check_field_definition(field_name, field_kind);
1462 size_t pos = object_data_output_.position();
1463 size_t fieldPosition = pos - data_start_position;
1464 int index = field_descriptor.index;
1465 field_offsets[index] =
static_cast<int32_t
>(fieldPosition);
1469 default_compact_writer::set_position_as_null(
const std::string& field_name,
1470 enum field_kind field_kind)
1472 const auto& field_descriptor =
1473 check_field_definition(field_name, field_kind);
1474 int index = field_descriptor.index;
1475 field_offsets[index] = -1;
1478 namespace rabin_finger_print {
1483 constexpr uint64_t INIT = 0xc15d213aa4d7a795L;
1485 static std::array<uint64_t, 256>
1488 static std::array<uint64_t, 256> FP_TABLE;
1489 for (
int i = 0; i < 256; ++i) {
1491 for (
int j = 0; j < 8; ++j) {
1492 fp = (fp >> 1) ^ (INIT & -(fp & 1L));
1499 FP_TABLE_AT(
int index)
1501 static auto FP_TABLE = init_fp_table();
1502 return FP_TABLE[index];
1506 fingerprint64(uint64_t fp,
byte b)
1508 return (fp >> 8) ^ FP_TABLE_AT((
int)(fp ^ b) & 0xff);
1512 fingerprint64(uint64_t fp,
int v)
1514 fp = fingerprint64(fp, (
byte)((v)&0xFF));
1515 fp = fingerprint64(fp, (
byte)((v >> 8) & 0xFF));
1516 fp = fingerprint64(fp, (
byte)((v >> 16) & 0xFF));
1517 fp = fingerprint64(fp, (
byte)((v >> 24) & 0xFF));
1522 fingerprint64(uint64_t fp,
const std::string& value)
1524 fp = fingerprint64(fp, (
int)value.size());
1525 for (
const auto& item : value) {
1526 fp = fingerprint64(fp, (
byte)item);
1535 fingerprint64(
const std::string& type_name,
1536 std::map<std::string, field_descriptor>& fields)
1538 uint64_t fingerPrint = fingerprint64(INIT, type_name);
1539 fingerPrint = fingerprint64(fingerPrint, (
int)fields.size());
1540 for (
const auto& entry : fields) {
1541 const field_descriptor& descriptor = entry.second;
1542 fingerPrint = fingerprint64(fingerPrint, entry.first);
1543 fingerPrint = fingerprint64(fingerPrint, (
int)descriptor.field_kind);
1545 return static_cast<int64_t
>(fingerPrint);
1551 kind_size_comparator(
const field_descriptor* i,
const field_descriptor* j)
1554 field_operations::get(i->field_kind).kind_size_in_byte_func();
1556 field_operations::get(j->field_kind).kind_size_in_byte_func();
1557 return i_kind_size > j_kind_size;
1561 std::string type_name,
1562 std::unordered_map<std::string, field_descriptor>&& field_definition_map)
1563 : type_name_(std::move(type_name))
1564 , field_definition_map_(std::move(field_definition_map))
1566 std::vector<field_descriptor*> fixed_size_fields;
1567 std::vector<field_descriptor*> boolean_fields;
1568 std::vector<field_descriptor*> variable_size_fields;
1570 std::map<std::string, field_descriptor> sorted_fields(
1571 field_definition_map_.begin(), field_definition_map_.end());
1572 for (
auto& item : sorted_fields) {
1573 field_descriptor& descriptor = item.second;
1574 field_kind kind = descriptor.field_kind;
1575 if (field_operations::get(kind).kind_size_in_byte_func() ==
1576 field_kind_based_operations::VARIABLE_SIZE) {
1577 variable_size_fields.push_back(&descriptor);
1578 }
else if (kind == field_kind::BOOLEAN) {
1579 boolean_fields.push_back(&descriptor);
1581 fixed_size_fields.push_back(&descriptor);
1586 fixed_size_fields.begin(), fixed_size_fields.end(), kind_size_comparator);
1589 for (
auto descriptor : fixed_size_fields) {
1590 descriptor->offset = offset;
1591 offset += field_operations::get(descriptor->field_kind)
1592 .kind_size_in_byte_func();
1595 int8_t bit_offset = 0;
1596 for (
auto descriptor : boolean_fields) {
1597 descriptor->offset = offset;
1598 descriptor->bit_offset =
1599 static_cast<int8_t
>(bit_offset % util::Bits::BITS_IN_BYTE);
1601 if (bit_offset % util::Bits::BITS_IN_BYTE == 0) {
1605 if (bit_offset % util::Bits::BITS_IN_BYTE != 0) {
1609 fixed_size_fields_length_ = offset;
1612 for (
auto descriptor : variable_size_fields) {
1613 descriptor->index = index;
1617 for (
auto& item : sorted_fields) {
1618 field_definition_map_[item.first] = item.second;
1621 number_of_var_size_fields_ = index;
1622 schema_id_ = rabin_finger_print::fingerprint64(type_name_, sorted_fields);
1626 schema::schema_id()
const
1632 schema::number_of_var_size_fields()
const
1634 return number_of_var_size_fields_;
1638 schema::fixed_size_fields_length()
const
1640 return fixed_size_fields_length_;
1644 schema::type_name()
const
1649 const std::unordered_map<std::string, field_descriptor>&
1650 schema::fields()
const
1652 return field_definition_map_;
1656 operator<<(std::ostream& os,
const schema& schema)
1658 os <<
"type name " << schema.type_name() <<
",number of var size fields "
1659 << schema.number_of_var_size_fields() <<
",fixed size fields length "
1660 << schema.fixed_size_fields_length() <<
",fields {";
1661 for (
const auto& item : schema.fields()) {
1662 os << item.first <<
" " << item.second <<
",";
1669 operator<<(std::ostream& os,
const field_descriptor& field_descriptor)
1671 os << field_descriptor.field_kind;
1678 schema_writer::schema_writer(std::string type_name)
1679 : type_name(std::move(type_name))
1682 schema_writer::add_field(std::string field_name,
enum field_kind kind)
1684 field_definition_map[std::move(field_name)] =
1685 field_descriptor{ kind, -1, -1, -1 };
1689 schema_writer::build() &&
1691 return schema{ type_name, std::move(field_definition_map) };
1695 default_schema_service::get(int64_t schemaId)
1697 auto ptr = schemas.get(schemaId);
1698 if (ptr ==
nullptr) {
1704 default_schema_service::put(
const schema& schema_v)
1706 if (schemas.contains_key(schema_v.schema_id())) {
1709 schemas.put(schema_v.schema_id(), std::make_shared<schema>(schema_v));
1713 compact_stream_serializer::put_to_schema_service(
const schema& schema)
1715 schema_service.put(schema);
1718 field_kind_based_operations::field_kind_based_operations()
1719 : kind_size_in_byte_func(DEFAULT_KIND_SIZE_IN_BYTES)
1722 field_kind_based_operations::field_kind_based_operations(
1723 std::function<
int()> kind_size_in_byte_func)
1724 : kind_size_in_byte_func(std::move(kind_size_in_byte_func))
1726 field_kind_based_operations
1727 field_operations::get(
enum field_kind field_kind)
1729 static const field_kind_based_operations ALL[NUMBER_OF_FIELD_KINDS] = {
1730 field_kind_based_operations{ []() {
return 0; } },
1731 field_kind_based_operations{},
1732 field_kind_based_operations{ []() {
return 1; } },
1733 field_kind_based_operations{},
1734 field_kind_based_operations{},
1735 field_kind_based_operations{},
1736 field_kind_based_operations{
1737 []() {
return util::Bits::SHORT_SIZE_IN_BYTES; } },
1738 field_kind_based_operations{},
1739 field_kind_based_operations(
1740 []() {
return util::Bits::INT_SIZE_IN_BYTES; }),
1741 field_kind_based_operations{},
1742 field_kind_based_operations{
1743 []() {
return util::Bits::LONG_SIZE_IN_BYTES; } },
1744 field_kind_based_operations{},
1745 field_kind_based_operations{
1746 []() {
return util::Bits::FLOAT_SIZE_IN_BYTES; } },
1747 field_kind_based_operations{},
1748 field_kind_based_operations{
1749 []() {
return util::Bits::DOUBLE_SIZE_IN_BYTES; } },
1750 field_kind_based_operations{},
1751 field_kind_based_operations{},
1752 field_kind_based_operations{},
1753 field_kind_based_operations{},
1754 field_kind_based_operations{},
1755 field_kind_based_operations{},
1756 field_kind_based_operations{},
1757 field_kind_based_operations{},
1758 field_kind_based_operations{},
1759 field_kind_based_operations{},
1760 field_kind_based_operations{},
1761 field_kind_based_operations{},
1762 field_kind_based_operations{},
1763 field_kind_based_operations{},
1764 field_kind_based_operations{},
1765 field_kind_based_operations{},
1766 field_kind_based_operations{},
1767 field_kind_based_operations{},
1768 field_kind_based_operations{},
1769 field_kind_based_operations{},
1770 field_kind_based_operations{},
1771 field_kind_based_operations{},
1772 field_kind_based_operations{},
1773 field_kind_based_operations{},
1774 field_kind_based_operations{},
1775 field_kind_based_operations{},
1776 field_kind_based_operations{},
1777 field_kind_based_operations{},
1778 field_kind_based_operations{},
1779 field_kind_based_operations{},
1780 field_kind_based_operations{}
1782 return ALL[field_kind];