Hazelcast C++ Client
Hazelcast C++ Client Library
Loading...
Searching...
No Matches
generic_record.h
1/*
2 * Copyright (c) 2008-2025, Hazelcast, Inc. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <unordered_set>
20
21#include <boost/any.hpp>
22#include <boost/algorithm/string.hpp>
23#include <boost/property_tree/ptree.hpp>
24
25#include "hazelcast/client/serialization/field_kind.h"
26#include "hazelcast/client/serialization/pimpl/compact/compact_util.h"
27#include "hazelcast/client/big_decimal.h"
28#include "hazelcast/client/local_time.h"
29#include "hazelcast/client/local_date.h"
30#include "hazelcast/client/local_date_time.h"
31#include "hazelcast/client/offset_date_time.h"
32#include "hazelcast/util/export.h"
33#include "hazelcast/util/byte.h"
34
35namespace hazelcast {
36namespace client {
37namespace serialization {
38namespace pimpl {
39class compact_stream_serializer;
40}
41namespace generic_record {
43
59class HAZELCAST_API generic_record
60{
61public:
84 generic_record_builder new_builder() const;
85
108 generic_record_builder new_builder_with_clone() const;
109
113 std::unordered_set<std::string> get_field_names() const;
114
127 field_kind get_field_kind(const std::string& field_name) const;
128
134 bool has_field(std::string field_name) const;
135
143 bool get_boolean(const std::string& field_name) const;
144
152 bool& get_boolean(const std::string& field_name);
153
161 int8_t get_int8(const std::string& field_name) const;
162
170 int8_t& get_int8(const std::string& field_name);
171
179 int16_t get_int16(const std::string& field_name) const;
180
188 int16_t& get_int16(const std::string& field_name);
189
197 int32_t get_int32(const std::string& field_name) const;
198
206 int32_t& get_int32(const std::string& field_name);
207
215 int64_t get_int64(const std::string& field_name) const;
216
224 int64_t& get_int64(const std::string& field_name);
225
233 float get_float32(const std::string& field_name) const;
234
242 float& get_float32(const std::string& field_name);
243
251 double get_float64(const std::string& field_name) const;
252
260 double& get_float64(const std::string& field_name);
261
269 const boost::optional<std::string>& get_string(
270 const std::string& field_name) const;
271
280 boost::optional<std::string>& get_string(const std::string& field_name);
281
290 const boost::optional<big_decimal>& get_decimal(
291 const std::string& field_name) const;
292
301 boost::optional<big_decimal>& get_decimal(const std::string& field_name);
302
311 const boost::optional<local_time>& get_time(
312 const std::string& field_name) const;
313
322 boost::optional<local_time>& get_time(const std::string& field_name);
323
332 const boost::optional<local_date>& get_date(
333 const std::string& field_name) const;
334
343 boost::optional<local_date>& get_date(const std::string& field_name);
344
353 const boost::optional<local_date_time>& get_timestamp(
354 const std::string& field_name) const;
355
364 boost::optional<local_date_time>& get_timestamp(
365 const std::string& field_name);
366
376 const boost::optional<offset_date_time>& get_timestamp_with_timezone(
377 const std::string& field_name) const;
378
388 boost::optional<offset_date_time>& get_timestamp_with_timezone(
389 const std::string& field_name);
390
398 const boost::optional<generic_record>& get_generic_record(
399 const std::string& field_name) const;
400
408 boost::optional<generic_record>& get_generic_record(
409 const std::string& field_name);
410
418 const boost::optional<std::vector<bool>>& get_array_of_boolean(
419 const std::string& field_name) const;
420
428 boost::optional<std::vector<bool>>& get_array_of_boolean(
429 const std::string& field_name);
430
438 const boost::optional<std::vector<int8_t>>& get_array_of_int8(
439 const std::string& field_name) const;
440
448 boost::optional<std::vector<int8_t>>& get_array_of_int8(
449 const std::string& field_name);
450
458 const boost::optional<std::vector<int16_t>>& get_array_of_int16(
459 const std::string& field_name) const;
460
468 boost::optional<std::vector<int16_t>>& get_array_of_int16(
469 const std::string& field_name);
470
478 const boost::optional<std::vector<int32_t>>& get_array_of_int32(
479 const std::string& field_name) const;
480
488 boost::optional<std::vector<int32_t>>& get_array_of_int32(
489 const std::string& field_name);
490
498 const boost::optional<std::vector<int64_t>>& get_array_of_int64(
499 const std::string& field_name) const;
500
508 boost::optional<std::vector<int64_t>>& get_array_of_int64(
509 const std::string& field_name);
510
518 const boost::optional<std::vector<float>>& get_array_of_float32(
519 const std::string& field_name) const;
520
528 boost::optional<std::vector<float>>& get_array_of_float32(
529 const std::string& field_name);
530
538 const boost::optional<std::vector<double>>& get_array_of_float64(
539 const std::string& field_name) const;
540
548 boost::optional<std::vector<double>>& get_array_of_float64(
549 const std::string& field_name);
550
558 const boost::optional<std::vector<boost::optional<std::string>>>&
559 get_array_of_string(const std::string& field_name) const;
560
568 boost::optional<std::vector<boost::optional<std::string>>>&
569 get_array_of_string(const std::string& field_name);
570
579 const boost::optional<std::vector<boost::optional<big_decimal>>>&
580 get_array_of_decimal(const std::string& field_name) const;
581
590 boost::optional<std::vector<boost::optional<big_decimal>>>&
591 get_array_of_decimal(const std::string& field_name);
592
601 const boost::optional<std::vector<boost::optional<local_time>>>&
602 get_array_of_time(const std::string& field_name) const;
603
612 boost::optional<std::vector<boost::optional<local_time>>>&
613 get_array_of_time(const std::string& field_name);
614
623 const boost::optional<std::vector<boost::optional<local_date>>>&
624 get_array_of_date(const std::string& field_name) const;
625
634 boost::optional<std::vector<boost::optional<local_date>>>&
635 get_array_of_date(const std::string& field_name);
636
645 const boost::optional<std::vector<boost::optional<local_date_time>>>&
646 get_array_of_timestamp(const std::string& field_name) const;
647
656 boost::optional<std::vector<boost::optional<local_date_time>>>&
657 get_array_of_timestamp(const std::string& field_name);
658
667 const boost::optional<std::vector<boost::optional<offset_date_time>>>&
668 get_array_of_timestamp_with_timezone(const std::string& field_name) const;
669
678 boost::optional<std::vector<boost::optional<offset_date_time>>>&
679 get_array_of_timestamp_with_timezone(const std::string& field_name);
680
688 const boost::optional<std::vector<boost::optional<generic_record>>>&
689 get_array_of_generic_record(const std::string& field_name) const;
690
698 boost::optional<std::vector<boost::optional<generic_record>>>&
699 get_array_of_generic_record(const std::string& field_name);
700
710 boost::optional<bool> get_nullable_boolean(
711 const std::string& field_name) const;
712
722 boost::optional<bool>& get_nullable_boolean(const std::string& field_name);
723
733 boost::optional<int8_t> get_nullable_int8(
734 const std::string& field_name) const;
735
745 boost::optional<int8_t>& get_nullable_int8(const std::string& field_name);
746
756 boost::optional<int16_t> get_nullable_int16(
757 const std::string& field_name) const;
758
768 boost::optional<int16_t>& get_nullable_int16(const std::string& field_name);
769
779 boost::optional<int32_t> get_nullable_int32(
780 const std::string& field_name) const;
781
791 boost::optional<int32_t>& get_nullable_int32(const std::string& field_name);
792
802 boost::optional<int64_t> get_nullable_int64(
803 const std::string& field_name) const;
804
814 boost::optional<int64_t>& get_nullable_int64(const std::string& field_name);
815
825 boost::optional<float> get_nullable_float32(
826 const std::string& field_name) const;
827
837 boost::optional<float>& get_nullable_float32(const std::string& field_name);
838
848 boost::optional<double> get_nullable_float64(
849 const std::string& field_name) const;
850
860 boost::optional<double>& get_nullable_float64(
861 const std::string& field_name);
862
872 const boost::optional<std::vector<boost::optional<bool>>>&
873 get_array_of_nullable_boolean(const std::string& field_name) const;
874
884 boost::optional<std::vector<boost::optional<bool>>>&
885 get_array_of_nullable_boolean(const std::string& field_name);
886
896 const boost::optional<std::vector<boost::optional<int8_t>>>&
897 get_array_of_nullable_int8(const std::string& field_name) const;
898
908 boost::optional<std::vector<boost::optional<int8_t>>>&
909 get_array_of_nullable_int8(const std::string& field_name);
910
920 const boost::optional<std::vector<boost::optional<int16_t>>>&
921 get_array_of_nullable_int16(const std::string& field_name) const;
922
932 boost::optional<std::vector<boost::optional<int16_t>>>&
933 get_array_of_nullable_int16(const std::string& field_name);
934
944 const boost::optional<std::vector<boost::optional<int32_t>>>&
945 get_array_of_nullable_int32(const std::string& field_name) const;
946
956 boost::optional<std::vector<boost::optional<int32_t>>>&
957 get_array_of_nullable_int32(const std::string& field_name);
958
968 const boost::optional<std::vector<boost::optional<int64_t>>>&
969 get_array_of_nullable_int64(const std::string& field_name) const;
970
980 boost::optional<std::vector<boost::optional<int64_t>>>&
981 get_array_of_nullable_int64(const std::string& field_name);
982
992 const boost::optional<std::vector<boost::optional<float>>>&
993 get_array_of_nullable_float32(const std::string& field_name) const;
994
1004 boost::optional<std::vector<boost::optional<float>>>&
1005 get_array_of_nullable_float32(const std::string& field_name);
1006
1016 const boost::optional<std::vector<boost::optional<double>>>&
1017 get_array_of_nullable_float64(const std::string& field_name) const;
1018
1028 boost::optional<std::vector<boost::optional<double>>>&
1029 get_array_of_nullable_float64(const std::string& field_name);
1030
1031private:
1032 static constexpr const char* METHOD_PREFIX_FOR_ERROR_MESSAGES = "get";
1033
1034 friend class generic_record_builder;
1035 friend class pimpl::compact_stream_serializer;
1036
1037 friend std::ostream HAZELCAST_API& operator<<(std::ostream& os,
1038 const generic_record&);
1039 friend bool HAZELCAST_API operator==(const generic_record&,
1040 const generic_record&);
1041 friend bool HAZELCAST_API operator!=(const generic_record&,
1042 const generic_record&);
1043
1044 generic_record(std::shared_ptr<pimpl::schema>, std::unordered_map<std::string, boost::any>);
1045
1046 const pimpl::schema& get_schema() const;
1047 friend boost::property_tree::ptree write_generic_record(
1048 const generic_record&);
1049
1050 template<typename... Kinds>
1051 field_kind check(const std::string& field_name, Kinds... kinds_ts) const
1052 {
1053 field_kind kinds[] = { kinds_ts... };
1054 boost::optional<pimpl::field_descriptor> desc =
1055 schema_->get_field(field_name);
1056
1057 if (!desc) {
1058 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{
1059 boost::str(boost::format("Invalid field name : '%1%' for %2%") %
1060 field_name % schema_) });
1061 }
1062
1063 field_kind current_kind = desc->kind;
1064 bool valid = false;
1065 for (field_kind kind : kinds) {
1066 valid |= current_kind == kind;
1067 }
1068
1069 if (!valid) {
1070 std::vector<std::string> kinds_str;
1071 kinds_str.reserve(sizeof...(Kinds));
1072
1073 transform(std::begin(kinds),
1074 std::end(kinds),
1075 back_inserter(kinds_str),
1076 [](field_kind kind) {
1077 return boost::str(boost::format("%1%") % kind);
1078 });
1079
1080 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{
1081 boost::str(boost::format("Invalid field kind: '%1%' for %2%, "
1082 "valid field kinds : %3%, found : %4%") %
1083 field_name % schema_ %
1084 boost::algorithm::join(kinds_str, ",") %
1085 current_kind) });
1086 }
1087
1088 return current_kind;
1089 }
1090
1091 template<typename T>
1092 const T& get(const std::string& field_name, field_kind kind) const
1093 {
1094 check(field_name, kind);
1095 return boost::any_cast<const T&>(objects_.at(field_name));
1096 }
1097
1098 template<typename T>
1099 T& get(const std::string& field_name, field_kind kind)
1100 {
1101 check(field_name, kind);
1102 return boost::any_cast<T&>(objects_.at(field_name));
1103 }
1104
1105 template<typename T>
1106 const T& get_non_null(const std::string& field_name,
1107 field_kind primitive_field_kind,
1108 field_kind nullable_field_kind,
1109 const std::string& method_suffix) const
1110 {
1111 auto kind =
1112 check(field_name, primitive_field_kind, nullable_field_kind);
1113
1114 if (kind == nullable_field_kind) {
1115 const auto& val_opt = boost::any_cast<const boost::optional<T>&>(
1116 objects_.at(field_name));
1117
1118 if (!val_opt) {
1119 BOOST_THROW_EXCEPTION(
1120 pimpl::compact_util::exception_for_unexpected_null_value(
1121 field_name,
1122 METHOD_PREFIX_FOR_ERROR_MESSAGES,
1123 method_suffix));
1124 }
1125
1126 return *val_opt;
1127 }
1128
1129 return boost::any_cast<const T&>(objects_.at(field_name));
1130 }
1131
1132 template<typename T>
1133 T& get_non_null(const std::string& field_name,
1134 field_kind primitive_field_kind,
1135 field_kind nullable_field_kind,
1136 const std::string& method_suffix)
1137 {
1138 return const_cast<T&>(
1139 static_cast<const generic_record*>(this)->get_non_null<T>(
1140 field_name,
1141 primitive_field_kind,
1142 nullable_field_kind,
1143 method_suffix));
1144 }
1145
1146 template<typename T>
1147 const boost::optional<std::vector<T>>& get_array_of_primitive(
1148 const std::string& field_name,
1149 field_kind primitive_field_kind,
1150 field_kind nullable_field_kind,
1151 const std::string& method_suffix) const
1152 {
1153 using optional_nullable_array_t =
1154 boost::optional<std::vector<boost::optional<T>>>;
1155 using optional_primitive_array_t = boost::optional<std::vector<T>>;
1156 using primitive_array_t = std::vector<T>;
1157
1158 auto kind =
1159 check(field_name, primitive_field_kind, nullable_field_kind);
1160
1161 if (kind == nullable_field_kind) {
1162 auto primitive_array_itr = adopteds_.find(field_name);
1163
1164 if (primitive_array_itr != end(adopteds_)) {
1165 return boost::any_cast<const optional_primitive_array_t&>(
1166 primitive_array_itr->second);
1167 }
1168
1169 const auto& optional_nullable_array =
1170 boost::any_cast<const optional_nullable_array_t&>(
1171 objects_.at(field_name));
1172
1173 if (!optional_nullable_array) {
1174 (void)adopteds_.emplace(field_name,
1175 optional_primitive_array_t{});
1176 return boost::any_cast<const optional_primitive_array_t&>(
1177 adopteds_.at(field_name));
1178 }
1179
1180 const auto& array_of_nullable = optional_nullable_array.value();
1181 optional_primitive_array_t primitive_array{ primitive_array_t(
1182 array_of_nullable.size()) };
1183
1184 for (std::size_t i = 0; i < array_of_nullable.size(); ++i) {
1185 if (!array_of_nullable[i]) {
1186 BOOST_THROW_EXCEPTION(
1187 pimpl::compact_util::
1188 exception_for_unexpected_null_value_in_array(
1189 field_name,
1190 METHOD_PREFIX_FOR_ERROR_MESSAGES,
1191 method_suffix));
1192 }
1193
1194 primitive_array.value()[i] = *array_of_nullable[i];
1195 }
1196
1197 (void)adopteds_.emplace(field_name, std::move(primitive_array));
1198 return boost::any_cast<const optional_primitive_array_t&>(
1199 adopteds_.at(field_name));
1200 }
1201
1202 return boost::any_cast<const optional_primitive_array_t&>(
1203 objects_.at(field_name));
1204 }
1205
1206 template<typename T>
1207 boost::optional<std::vector<T>>& get_array_of_primitive(
1208 const std::string& field_name,
1209 field_kind primitive,
1210 field_kind nullable,
1211 const std::string& method_suffix)
1212 {
1213 return const_cast<boost::optional<std::vector<T>>&>(
1214 static_cast<const generic_record*>(this)->get_array_of_primitive<T>(
1215 field_name, primitive, nullable, method_suffix));
1216 }
1217
1218 template<typename T>
1219 const boost::optional<std::vector<boost::optional<T>>>&
1220 get_array_of_nullable(const std::string& field_name,
1221 field_kind primitive,
1222 field_kind nullable,
1223 const std::string& method_suffix) const
1224 {
1225 (void)method_suffix;
1226 using optional_nullable_array_t =
1227 boost::optional<std::vector<boost::optional<T>>>;
1228 using optional_primitive_array_t = boost::optional<std::vector<T>>;
1229 using optional_array_t = std::vector<boost::optional<T>>;
1230
1231 auto kind = check(field_name, primitive, nullable);
1232
1233 if (kind == primitive) {
1234 auto primitive_array_itr = adopteds_.find(field_name);
1235
1236 if (primitive_array_itr != end(adopteds_)) {
1237 return boost::any_cast<const optional_nullable_array_t&>(
1238 primitive_array_itr->second);
1239 }
1240
1241 const auto& optional_primitive_array =
1242 boost::any_cast<const optional_primitive_array_t&>(
1243 objects_.at(field_name));
1244
1245 if (!optional_primitive_array) {
1246 (void)adopteds_.emplace(field_name,
1247 optional_nullable_array_t{});
1248 return boost::any_cast<const optional_nullable_array_t&>(
1249 adopteds_.at(field_name));
1250 }
1251
1252 const auto& array_of_primitive = optional_primitive_array.value();
1253 optional_nullable_array_t array_of_nullable{ optional_array_t(
1254 array_of_primitive.size()) };
1255
1256 for (std::size_t i = 0; i < array_of_primitive.size(); ++i) {
1257 array_of_nullable.value()[i] = array_of_primitive[i];
1258 }
1259
1260 (void)adopteds_.emplace(field_name, std::move(array_of_nullable));
1261 return boost::any_cast<const optional_nullable_array_t&>(
1262 adopteds_.at(field_name));
1263 }
1264
1265 return boost::any_cast<const optional_nullable_array_t&>(
1266 objects_.at(field_name));
1267 }
1268
1269 template<typename T>
1270 boost::optional<std::vector<boost::optional<T>>>& get_array_of_nullable(
1271 const std::string& field_name,
1272 field_kind primitive,
1273 field_kind nullable,
1274 const std::string& method_suffix)
1275 {
1276 return const_cast<boost::optional<std::vector<boost::optional<T>>>&>(
1277 static_cast<const generic_record*>(this)->get_array_of_nullable<T>(
1278 field_name, primitive, nullable, method_suffix));
1279 }
1280
1281 std::shared_ptr<pimpl::schema> schema_;
1282 std::unordered_map<std::string, boost::any> objects_;
1283
1292 mutable std::unordered_map<std::string, boost::any> adopteds_;
1293};
1294
1295} // namespace generic_record
1296} // namespace serialization
1297} // namespace client
1298} // namespace hazelcast
int64_t get_int64(const std::string &field_name) const
Definition compact.cpp:849
boost::optional< int8_t > get_nullable_int8(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:903
boost::optional< float > get_nullable_float32(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:957
boost::optional< double > get_nullable_float64(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:971
const boost::optional< std::vector< boost::optional< float > > > & get_array_of_nullable_float32(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:1292
const boost::optional< generic_record > & get_generic_record(const std::string &field_name) const
Definition compact.cpp:997
const boost::optional< std::vector< boost::optional< int64_t > > > & get_array_of_nullable_int64(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:1274
double get_float64(const std::string &field_name) const
Definition compact.cpp:877
int16_t get_int16(const std::string &field_name) const
Definition compact.cpp:821
const boost::optional< std::vector< int64_t > > & get_array_of_int64(const std::string &field_name) const
Definition compact.cpp:1147
generic_record_builder new_builder() const
Creates a generic_record_builder allows to create a new object.
Definition compact.cpp:746
const boost::optional< std::vector< boost::optional< generic_record > > > & get_array_of_generic_record(const std::string &field_name) const
Definition compact.cpp:1416
const boost::optional< std::vector< boost::optional< local_date > > > & get_array_of_date(const std::string &field_name) const
Definition compact.cpp:1372
const boost::optional< offset_date_time > & get_timestamp_with_timezone(const std::string &field_name) const
Definition compact.cpp:1061
bool get_boolean(const std::string &field_name) const
Definition compact.cpp:793
boost::optional< int64_t > get_nullable_int64(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:943
const boost::optional< local_date_time > & get_timestamp(const std::string &field_name) const
Definition compact.cpp:1047
const boost::optional< std::vector< double > > & get_array_of_float64(const std::string &field_name) const
Definition compact.cpp:1183
int8_t get_int8(const std::string &field_name) const
Definition compact.cpp:807
generic_record_builder new_builder_with_clone() const
Returned generic_record_builder can be used to have exact copy and also just to update a couple of fi...
Definition compact.cpp:752
const boost::optional< std::vector< boost::optional< local_date_time > > > & get_array_of_timestamp(const std::string &field_name) const
Definition compact.cpp:1386
const boost::optional< std::string > & get_string(const std::string &field_name) const
Definition compact.cpp:985
const boost::optional< std::vector< boost::optional< int8_t > > > & get_array_of_nullable_int8(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:1220
const boost::optional< std::vector< bool > > & get_array_of_boolean(const std::string &field_name) const
Definition compact.cpp:1075
const boost::optional< std::vector< int16_t > > & get_array_of_int16(const std::string &field_name) const
Definition compact.cpp:1111
const boost::optional< std::vector< boost::optional< double > > > & get_array_of_nullable_float64(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:1311
int32_t get_int32(const std::string &field_name) const
Definition compact.cpp:835
float get_float32(const std::string &field_name) const
Definition compact.cpp:863
const boost::optional< local_date > & get_date(const std::string &field_name) const
Definition compact.cpp:1035
std::unordered_set< std::string > get_field_names() const
Definition compact.cpp:758
const boost::optional< std::vector< boost::optional< int32_t > > > & get_array_of_nullable_int32(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:1256
boost::optional< int16_t > get_nullable_int16(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:915
const boost::optional< big_decimal > & get_decimal(const std::string &field_name) const
Definition compact.cpp:1011
boost::optional< bool > get_nullable_boolean(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:891
field_kind get_field_kind(const std::string &field_name) const
Returns the kind of the field for the given field name.
Definition compact.cpp:775
const boost::optional< std::vector< boost::optional< std::string > > > & get_array_of_string(const std::string &field_name) const
Definition compact.cpp:1330
const boost::optional< std::vector< boost::optional< big_decimal > > > & get_array_of_decimal(const std::string &field_name) const
Definition compact.cpp:1344
const boost::optional< std::vector< boost::optional< int16_t > > > & get_array_of_nullable_int16(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:1238
const boost::optional< std::vector< boost::optional< offset_date_time > > > & get_array_of_timestamp_with_timezone(const std::string &field_name) const
Definition compact.cpp:1400
const boost::optional< std::vector< float > > & get_array_of_float32(const std::string &field_name) const
Definition compact.cpp:1165
const boost::optional< std::vector< int32_t > > & get_array_of_int32(const std::string &field_name) const
Definition compact.cpp:1129
const boost::optional< std::vector< boost::optional< local_time > > > & get_array_of_time(const std::string &field_name) const
Definition compact.cpp:1358
const boost::optional< local_time > & get_time(const std::string &field_name) const
Definition compact.cpp:1023
const boost::optional< std::vector< boost::optional< bool > > > & get_array_of_nullable_boolean(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:1201
boost::optional< int32_t > get_nullable_int32(const std::string &field_name) const
Supported only for Compact.
Definition compact.cpp:929
const boost::optional< std::vector< int8_t > > & get_array_of_int8(const std::string &field_name) const
Definition compact.cpp:1093