2 #include <score/model/Identifier.hpp>
3 #include <score/serialization/CommonTypes.hpp>
4 #include <score/serialization/StringConstants.hpp>
5 #include <score/serialization/VisitorInterface.hpp>
6 #include <score/serialization/VisitorTags.hpp>
7 #include <score/tools/Debug.hpp>
8 #include <score/tools/ForEach.hpp>
10 #include <ossia/detail/flat_set.hpp>
11 #include <ossia/detail/json.hpp>
12 #include <ossia/detail/small_vector.hpp>
14 #include <boost/container/small_vector.hpp>
15 #include <boost/container/static_vector.hpp>
33 class ApplicationComponents;
35 using JsonWriter = ossia::json_writer;
55 using is_visitor_tag = std::integral_constant<bool, true>;
73 bool empty()
const noexcept {
return this->buffer.GetLength() == 0; }
75 void read(
const QString&)
const noexcept =
delete;
76 void read(
const float&)
const noexcept =
delete;
77 void read(
const char&)
const noexcept =
delete;
78 void read(
const int&)
const noexcept =
delete;
79 void read(
const bool&)
const noexcept =
delete;
80 void read(
const std::string&)
const noexcept =
delete;
81 void read(
const unsigned int&)
const noexcept =
delete;
82 void read(
const unsigned char&)
const noexcept =
delete;
92 void readFrom(
const QString& obj) noexcept { readFrom(obj.toUtf8()); }
93 void readFrom(
const QByteArray& t) noexcept { stream.String(t.data(), t.size()); }
94 void readFrom(
const std::string& t) noexcept { stream.String(t.data(), t.size()); }
95 void readFrom(int64_t t) noexcept { stream.Int64(t); }
96 void readFrom(int32_t t) noexcept { stream.Int(t); }
97 void readFrom(uint64_t t) noexcept { stream.Uint64(t); }
98 void readFrom(uint32_t t) noexcept { stream.Uint(t); }
99 void readFrom(
float t) noexcept { stream.Double(t); }
100 void readFrom(
double t) noexcept { stream.Double(t); }
101 void readFrom(
bool t) noexcept { stream.Bool(t); }
102 void readFrom(
char t) noexcept { stream.String(&t, 1); }
103 void readFrom(
const void*) noexcept =
delete;
105 template <
typename T>
112 readFrom((
const typename T::score_base_type&)obj);
114 else if constexpr(std::is_enum_v<T>)
118 stream.Int(
static_cast<int32_t
>(obj));
123 (is_template<T>::value && !abstract_base<T> && !identified_object<T>)
124 || is_custom_serialized<T>::value)
129 identified_object<T> && !identified_entity<T> && !abstract_base<T>
130 && !is_custom_serialized<T>::value)
132 stream.StartObject();
135 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
143 identified_entity<T> && !abstract_base<T> && !is_custom_serialized<T>::value)
145 stream.StartObject();
148 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
155 !identified_object<T> && abstract_base<T> && !is_custom_serialized<T>::value)
157 stream.StartObject();
158 readFromAbstract(obj, [](
JSONReader& sub,
const T& obj) {
165 identified_object<T> && !identified_entity<T> && abstract_base<T>
166 && !is_custom_serialized<T>::value)
168 stream.StartObject();
169 readFromAbstract(obj, [](
JSONReader& sub,
const T& obj) {
172 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
180 identified_entity<T> && abstract_base<T> && !is_custom_serialized<T>::value)
182 stream.StartObject();
183 readFromAbstract(obj, [](
JSONReader& sub,
const T& obj) {
186 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
202 rapidjson::StringBuffer buffer;
203 JsonWriter stream{buffer};
208 assigner operator[](std::string_view str)
const noexcept;
209 template <std::
size_t N>
210 assigner operator[](
const char (&str)[N])
const noexcept;
211 assigner operator[](
const QString& str)
const noexcept;
217 QByteArray toByteArray()
const
219 SCORE_ASSERT(stream.IsComplete());
220 return QByteArray{buffer.GetString(), (int)buffer.GetLength()};
222 std::string toStdString()
const
224 SCORE_ASSERT(stream.IsComplete());
225 return std::string{buffer.GetString(), buffer.GetLength()};
227 QString toString()
const
229 SCORE_ASSERT(stream.IsComplete());
230 return QString::fromUtf8(buffer.GetString(), buffer.GetLength());
235 template <
typename T>
239 template <
typename T,
typename Fun>
240 void readFromAbstract(
const T& in, Fun f);
247 void operator=(int64_t t)
const noexcept {
self.stream.Int64(t); }
248 void operator=(int32_t t)
const noexcept {
self.stream.Int(t); }
249 void operator=(uint64_t t)
const noexcept {
self.stream.Uint64(t); }
250 void operator=(uint32_t t)
const noexcept {
self.stream.Uint(t); }
251 void operator=(
float t)
const noexcept {
self.stream.Double(t); }
252 void operator=(
double t)
const noexcept {
self.stream.Double(t); }
253 void operator=(
bool t)
const noexcept {
self.stream.Bool(t); }
254 void operator=(
char t)
const noexcept {
self.stream.String(&t, 1); }
255 void operator=(QPoint t)
const noexcept
257 self.stream.StartArray();
258 self.stream.Int(t.x());
259 self.stream.Int(t.y());
260 self.stream.EndArray();
262 void operator=(QPointF t)
const noexcept
264 self.stream.StartArray();
265 self.stream.Double(t.x());
266 self.stream.Double(t.y());
267 self.stream.EndArray();
269 void operator=(QSize t)
const noexcept
271 self.stream.StartArray();
272 self.stream.Int(t.width());
273 self.stream.Int(t.height());
274 self.stream.EndArray();
276 void operator=(QSizeF t)
const noexcept
278 self.stream.StartArray();
279 self.stream.Double(t.width());
280 self.stream.Double(t.height());
281 self.stream.EndArray();
283 void operator=(QRect t)
const noexcept
285 self.stream.StartArray();
286 self.stream.Int(t.x());
287 self.stream.Int(t.y());
288 self.stream.Int(t.width());
289 self.stream.Int(t.height());
290 self.stream.EndArray();
292 void operator=(QRectF t)
const noexcept
294 self.stream.StartArray();
295 self.stream.Double(t.x());
296 self.stream.Double(t.y());
297 self.stream.Double(t.width());
298 self.stream.Double(t.height());
299 self.stream.EndArray();
301 void operator=(
const QString& t)
const noexcept { *
this = t.toUtf8(); }
302 void operator=(
const QStringList& t)
const noexcept
304 self.stream.StartArray();
305 for(
const auto& str : t)
306 *
this = str.toUtf8();
307 self.stream.EndArray();
309 void operator=(
const QLatin1String& t)
const noexcept
311 self.stream.String(t.data(), t.size());
313 void operator=(
const std::string& t)
const noexcept
315 self.stream.String(t.data(), t.length());
317 void operator=(
const std::string_view& t)
const noexcept
319 self.stream.String(t.data(), t.length());
321 void operator=(
const QByteArray& t)
const noexcept
323 self.stream.String(t.data(), t.length());
325 void operator=(
const QVariantMap& t)
const noexcept { SCORE_ABORT; }
327 template <
typename T>
328 void operator=(
const T& t)
const noexcept
330 if constexpr(std::is_enum_v<T>)
334 self.stream.Int(
static_cast<int32_t
>(t));
344 JSONReader::fake_obj::operator[](std::string_view str)
const noexcept
346 self.stream.Key(str.data(), str.length());
350 JSONReader::fake_obj::operator[](
const QString& str)
const noexcept
352 const std::string& s = str.toStdString();
353 self.stream.Key(s.data(), s.length());
354 return assigner{
self};
356 template <std::
size_t N>
358 JSONReader::fake_obj::operator[](
const char (&str)[N])
const noexcept
360 return (*
this)[std::string_view(str, N - 1)];
363 template <
typename T,
typename Fun>
364 void JSONReader::readFromAbstract(
const T& in, Fun f)
366 obj[strings.uuid] = in.concreteKey().impl();
368 in.serialize_impl(this->toVariant());
373 const rapidjson::Value& obj;
374 QString toString()
const noexcept
376 return QString::fromUtf8(obj.GetString(), obj.GetStringLength());
378 std::string toStdString()
const noexcept
380 return std::string(obj.GetString(), obj.GetStringLength());
382 QByteArray toByteArray()
const noexcept
384 return QByteArray(obj.GetString(), obj.GetStringLength());
387 int32_t toInt()
const noexcept {
return obj.GetInt(); }
388 bool toBool()
const noexcept {
return obj.GetBool(); }
389 double toDouble()
const noexcept {
return obj.GetDouble(); }
390 int64_t toInt64()
const noexcept {
return obj.GetInt64(); }
391 uint64_t toUInt64()
const noexcept {
return obj.GetUint64(); }
392 bool isDouble()
const noexcept {
return obj.IsDouble(); }
393 auto toArray()
const noexcept {
return obj.GetArray(); }
394 auto toObject()
const noexcept {
return obj.GetObject(); }
395 bool isString()
const noexcept {
return obj.IsString(); }
397 template <std::
size_t N>
398 JsonValue operator[](
const char (&str)[N])
const noexcept
402 JsonValue operator[](
const std::string& str)
const noexcept
406 JsonValue operator[](
const QString& str)
const noexcept
408 return (*
this)[str.toStdString()];
410 template <
typename T>
411 friend void operator<<=(T& t,
const JsonValue&
self);
413 template <
typename T>
414 T to()
const noexcept
426 using is_visitor_tag = std::integral_constant<bool, true>;
427 using is_deserializer_tag = std::integral_constant<bool, true>;
429 VisitorVariant toVariant() {
return {*
this, JSONObject::type()}; }
435 explicit JSONWriter(
const rapidjson::Value& obj);
438 template <
typename T>
439 static auto unmarshall(
const rapidjson::Value& obj)
447 template <
typename T>
450 void write(QString&) =
delete;
451 void write(
float&) =
delete;
452 void write(
char&) =
delete;
453 void write(
int&) =
delete;
454 void write(
bool&) =
delete;
455 void write(std::string&) =
delete;
457 template <
typename T>
461 (is_template<T>::value && !abstract_base<T> && !identified_object<T>)
462 || is_custom_serialized<T>::value)
466 else if constexpr(std::is_enum<T>::value)
468 obj =
static_cast<T
>(base.GetInt());
476 const rapidjson::Value& base;
480 const rapidjson::Value& ref;
481 template <std::
size_t N>
482 JsonValue operator[](
const char (&str)[N])
const noexcept
486 JsonValue operator[](
const std::string& str)
const noexcept
490 JsonValue operator[](
const QString& str)
const noexcept
492 return (*
this)[str.toStdString()];
494 template <std::
size_t N>
495 std::optional<JsonValue> tryGet(
const char (&str)[N])
const noexcept
497 if(
auto it = ref.FindMember(str); it != ref.MemberEnd())
501 std::optional<JsonValue> tryGet(
const std::string& str)
const noexcept
503 if(
auto it = ref.FindMember(str); it != ref.MemberEnd())
507 std::optional<JsonValue> tryGet(
const QString& str)
const noexcept
509 return tryGet(str.toStdString());
511 std::optional<JsonValue> constFind(
const std::string& str)
const noexcept
515 std::optional<JsonValue> constFind(
const QString& str)
const noexcept
517 return tryGet(str.toStdString());
526 template <
typename T>
527 inline void operator<<=(T& t,
const JsonValue&
self)
533 inline void operator<<=(QString& t,
const JsonValue&
self)
537 inline void operator<<=(
float& t,
const JsonValue&
self)
539 t =
self.obj.GetFloat();
541 inline void operator<<=(
double& t,
const JsonValue&
self)
543 t =
self.obj.GetDouble();
545 inline void operator<<=(
int& t,
const JsonValue&
self)
547 t =
self.obj.GetInt();
549 inline void operator<<=(int64_t& t,
const JsonValue&
self)
551 t =
self.obj.GetInt();
553 inline void operator<<=(std::string& t,
const JsonValue&
self)
555 t =
self.toStdString();
557 inline void operator<<=(QByteArray& t,
const JsonValue&
self)
559 t =
self.toByteArray();
561 inline void operator<<=(
bool& t,
const JsonValue&
self)
565 inline void operator<<=(
char& t,
const JsonValue&
self)
567 t =
self.obj.GetStringLength() > 0 ?
self.obj.GetString()[0] :
'\0';
570 template <
typename T>
573 template <
typename U>
576 s.obj[s.strings.ObjectName] = obj.objectName();
577 s.obj[s.strings.id] = obj.id().val();
580 template <
typename U>
583 obj.setObjectName(s.obj[s.strings.ObjectName].toString());
584 obj.setId(
Id<T>{s.obj[s.strings.id].toInt()});
595 template <
typename T>
598 s.stream.StartArray();
599 for(
const auto& elt : vec)
604 template <
typename T>
607 const auto& array = s.base.GetArray();
610 vec.reserve(array.Size());
611 for(
const auto& elt : array)
613 typename T::value_type v;
616 vec.push_back(std::move(v));
620 template <
typename Arg, std::
size_t N>
623 s.stream.StartArray();
624 for(
const auto& elt : vec)
629 template <
typename Arg, std::
size_t N>
632 const auto& array = s.base.GetArray();
633 SCORE_ASSERT(N >= array.Size());
635 auto it = vec.begin();
636 for(
const auto& elt : array)
644 template <std::
size_t N>
647 s.stream.StartArray();
649 s.stream.Double(elt);
653 template <std::
size_t N>
656 const auto& array = s.base.GetArray();
657 SCORE_ASSERT(N >= array.Size());
659 auto it = vec.begin();
660 for(
const auto& elt : array)
662 *it = elt.GetFloat();
667 template <
typename T>
670 s.stream.StartArray();
671 for(
const auto& elt : vec)
676 template <
typename T>
681 const auto& array = s.base.GetArray();
682 for(
const auto& elt : array)
687 vec.push_back(std::move(v));
692 template <
typename T>
695 s.stream.StartArray();
696 for(
const auto& elt : vec)
701 template <
typename T>
704 const auto& array = s.base.GetArray();
706 vec.reserve(array.Size());
708 for(
const auto& elt : array)
713 vec.push_back(std::move(v));
717 template <
template <
typename... Args>
typename T,
typename... Args>
720 s.stream.StartArray();
721 for(
const auto& elt : vec)
722 s.stream.String(elt.data(), elt.size());
726 template <
template <
typename... Args>
typename T,
typename... Args>
729 const auto& array = s.base.GetArray();
731 vec.reserve(array.Size());
732 for(
const auto& elt : array)
734 vec.push_back(std::string{elt.GetString(), elt.GetStringLength()});
738 template <
template <
typename... Args>
typename T,
typename... Args>
741 s.stream.StartArray();
742 for(
const auto& elt : vec)
744 const QByteArray& b = elt.toUtf8();
745 s.stream.String(b.data(), b.size());
750 template <
template <
typename... Args>
typename T,
typename... Args>
753 const auto& array = s.base.GetArray();
755 vec.reserve(array.Size());
756 for(
const auto& elt : array)
758 vec.push_back(QString::fromUtf8(elt.GetString(), elt.GetStringLength()));
762 template <
template <
typename... Args>
typename T,
typename... Args>
765 s.stream.StartArray();
771 template <
template <
typename... Args>
typename T,
typename... Args>
774 const auto& array = s.base.GetArray();
776 vec.resize(array.Size());
777 auto it = vec.begin();
778 for(
const auto& elt : array)
785 template <
template <
typename... Args>
typename T,
typename... Args>
788 s.stream.StartArray();
790 s.stream.String(&elt, 1);
794 template <
template <
typename... Args>
typename T,
typename... Args>
797 const auto& array = s.base.GetArray();
799 vec.resize(array.Size());
800 auto it = vec.begin();
801 for(
const auto& elt : array)
803 *it = elt.GetString()[0];
808 template <
template <
typename... Args>
typename T,
typename... Args>
811 s.stream.StartArray();
817 template <
template <
typename... Args>
typename T,
typename... Args>
820 const auto& array = s.base.GetArray();
822 vec.resize(array.Size());
823 auto it = vec.begin();
824 for(
const auto& elt : array)
826 *it = elt.GetInt64();
831 template <
template <
typename... Args>
typename T,
typename... Args>
834 s.stream.StartArray();
836 s.stream.Double(elt);
840 template <
template <
typename... Args>
typename T,
typename... Args>
843 const auto& array = s.base.GetArray();
845 vec.resize(array.Size());
846 auto it = vec.begin();
847 for(
const auto& elt : array)
849 *it = elt.GetFloat();
854 template <
template <
typename... Args>
typename T,
typename... Args>
857 s.stream.StartArray();
859 s.stream.Double(elt);
863 template <
template <
typename... Args>
typename T,
typename... Args>
866 const auto& array = s.base.GetArray();
868 vec.resize(array.Size());
869 auto it = vec.begin();
870 for(
const auto& elt : array)
872 *it = elt.GetDouble();
880 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
884 s.stream.StartArray();
891 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
895 const auto& array = s.base.GetArray();
897 vec.resize(array.Size());
898 auto it = vec.begin();
899 for(
const auto& elt : array)
907 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
911 s.stream.StartArray();
913 s.stream.String(&elt, 1);
918 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
922 const auto& array = s.base.GetArray();
924 vec.resize(array.Size());
925 auto it = vec.begin();
926 for(
const auto& elt : array)
928 *it = elt.GetString()[0];
934 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
938 s.stream.StartArray();
945 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
949 const auto& array = s.base.GetArray();
951 vec.resize(array.Size());
952 auto it = vec.begin();
953 for(
const auto& elt : array)
955 *it = elt.GetInt64();
961 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
965 s.stream.StartArray();
967 s.stream.Double(elt);
972 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
976 const auto& array = s.base.GetArray();
978 vec.resize(array.Size());
979 auto it = vec.begin();
980 for(
const auto& elt : array)
982 *it = elt.GetFloat();
988 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
992 s.stream.StartArray();
994 s.stream.Double(elt);
999 template <
typename, std::size_t,
typename...>
typename T, std::size_t N,
1003 const auto& array = s.base.GetArray();
1005 vec.resize(array.Size());
1006 auto it = vec.begin();
1007 for(
const auto& elt : array)
1009 *it = elt.GetDouble();
1015 template <
typename... Args>
1020 template <
typename... Args>
1025 template <
typename... Args>
1030 template <
typename... Args>
1035 template <
typename T, std::
size_t N,
typename Alloc>
1041 template <
typename T, std::
size_t N>
1046 template <
typename T, std::
size_t N>
1051 template <std::
size_t N>
1056 template <
typename T,
typename U,
bool O>
1061 template <
typename T>
1087 template <
typename T,
typename U>
1090 using type = std::pair<T, U>;
1093 s.stream.StartArray();
1094 s.readFrom(obj.first);
1095 s.readFrom(obj.second);
1096 s.stream.EndArray();
1101 const auto& arr = s.base.GetArray();
1110 using type = QVariantMap;
1133 template <
typename T>
1136 using type = ossia::flat_set<T>;
1139 ArraySerializer::readFrom(s, obj.tree().get_sequence_cref());
1144 ArraySerializer::writeTo(s, obj.tree().get_sequence_ref());
1153 const auto col = c.rgba64();
1154 s.stream.StartArray();
1155 s.stream.Int(col.red());
1156 s.stream.Int(col.green());
1157 s.stream.Int(col.blue());
1158 s.stream.Int(col.alpha());
1159 s.stream.EndArray();
1164 const auto& array = s.base.GetArray();
1166 col.setRed(array[0].GetInt());
1167 col.setGreen(array[1].GetInt());
1168 col.setBlue(array[2].GetInt());
1169 col.setAlpha(array[3].GetInt());
1179 s.stream.StartArray();
1180 s.stream.Int(c.x());
1181 s.stream.Int(c.y());
1182 s.stream.EndArray();
1187 const auto& array = s.base.GetArray();
1188 c.setX(array[0].GetInt());
1189 c.setY(array[1].GetInt());
1198 s.stream.StartArray();
1199 s.stream.Double(c.x());
1200 s.stream.Double(c.y());
1201 s.stream.EndArray();
1206 const auto& array = s.base.GetArray();
1207 c.setX(array[0].GetDouble());
1208 c.setY(array[1].GetDouble());
1217 s.stream.StartArray();
1218 s.stream.Int(c.width());
1219 s.stream.Int(c.height());
1220 s.stream.EndArray();
1225 const auto& array = s.base.GetArray();
1226 c.setWidth(array[0].GetInt());
1227 c.setHeight(array[1].GetInt());
1236 s.stream.StartArray();
1237 s.stream.Double(c.width());
1238 s.stream.Double(c.height());
1239 s.stream.EndArray();
1244 const auto& array = s.base.GetArray();
1245 c.setWidth(array[0].GetDouble());
1246 c.setHeight(array[1].GetDouble());
1255 s.stream.StartArray();
1256 s.stream.Int(c.x());
1257 s.stream.Int(c.y());
1258 s.stream.Int(c.width());
1259 s.stream.Int(c.height());
1260 s.stream.EndArray();
1265 const auto& array = s.base.GetArray();
1266 c.setX(array[0].GetInt());
1267 c.setY(array[1].GetInt());
1268 c.setWidth(array[2].GetInt());
1269 c.setHeight(array[3].GetInt());
1278 s.stream.StartArray();
1279 s.stream.Double(c.x());
1280 s.stream.Double(c.y());
1281 s.stream.Double(c.width());
1282 s.stream.Double(c.height());
1283 s.stream.EndArray();
1288 const auto& array = s.base.GetArray();
1289 c.setX(array[0].GetDouble());
1290 c.setY(array[1].GetDouble());
1291 c.setWidth(array[2].GetDouble());
1292 c.setHeight(array[3].GetDouble());
1295 template <
typename T>
1301 s.stream.Int64(obj.val());
1306 obj.setVal(s.base.GetInt64());
1328 void JSONReader::read<Process::Inlet*>(
Process::Inlet*
const&) =
delete;
1330 SCORE_LIB_BASE_EXPORT
1331 rapidjson::Document clone(
const rapidjson::Value& val) noexcept;
1333 SCORE_LIB_BASE_EXPORT
1334 rapidjson::Document readJson(
const QByteArray& arr);
1336 inline QByteArray jsonToByteArray(
const rapidjson::Value& arr) noexcept
1338 rapidjson::StringBuffer buf;
1342 return QByteArray(buf.GetString(), buf.GetSize());
1345 SCORE_LIB_BASE_EXPORT
1346 rapidjson::Document toValue(
const JSONReader&) noexcept;
1348 template <
typename T>
1349 T fromJson(
const QByteArray& rawData)
1351 const rapidjson::Document doc = readJson(rawData);
1358 template <
typename T>
1359 QByteArray toJson(
const T& t)
1363 return reader.toByteArray();
1369 template <
typename Object>
1373 const auto doc = toValue(obj);
1408 #define assign_with_default(member, optional, alt_value) \
1411 if(auto it = optional) \
1414 member = alt_value; \
Definition: VisitorInterface.hpp:10
Definition: VisitorInterface.hpp:53
Definition: DataStreamVisitor.hpp:27
Definition: DataStreamVisitor.hpp:202
A map to access child objects through their id.
Definition: IdentifiedObjectMap.hpp:16
The IdentifiedObject class.
Definition: IdentifiedObject.hpp:19
Definition: VisitorInterface.hpp:61
Definition: JSONVisitor.hpp:52
void readFrom(const T &obj)
Definition: JSONVisitor.hpp:106
void readFrom(const score::Entity< T > &obj)
Definition: EntitySerialization.hpp:7
Definition: JSONVisitor.hpp:423
The id_base_t class.
Definition: Identifier.hpp:57
Definition: ApplicationComponents.hpp:68
Base for complex model objects.
Definition: EntityBase.hpp:24
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
Base toolkit upon which the software is built.
Definition: Application.cpp:90
auto marshall(const Object &obj)
marshall Serializes a single object
Definition: VisitorCommon.hpp:129
Definition: JSONVisitor.hpp:594
Definition: JSONVisitor.hpp:244
Definition: JSONVisitor.hpp:206
Definition: JSONVisitor.hpp:479
Definition: JSONVisitor.hpp:372
Definition: JSONVisitor.hpp:37
Definition: VisitorInterface.hpp:13
The VisitorVariant struct.
Definition: VisitorInterface.hpp:26
Definition: VisitorTags.hpp:29
Definition: VisitorTags.hpp:152
Definition: VisitorTags.hpp:24
Definition: StringConstants.hpp:10