mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Add nlohmann json replacement
This commit is contained in:
parent
6a122a7d34
commit
c58f2c7dbd
4 changed files with 2529 additions and 0 deletions
|
|
@ -2,6 +2,8 @@ target_sources(SRB2SDL2 PRIVATE
|
|||
hash_map.hpp
|
||||
hash_set.cpp
|
||||
hash_set.hpp
|
||||
json.cpp
|
||||
json.hpp
|
||||
memory.cpp
|
||||
memory.h
|
||||
spmc_queue.hpp
|
||||
|
|
|
|||
1809
src/core/json.cpp
Normal file
1809
src/core/json.cpp
Normal file
File diff suppressed because it is too large
Load diff
533
src/core/json.hpp
Normal file
533
src/core/json.hpp
Normal file
|
|
@ -0,0 +1,533 @@
|
|||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
|
||||
// Copyright (C) 2025 by Kart Krew
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
// See the 'LICENSE' file for more details.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef SRB2_CORE_JSON_HPP
|
||||
#define SRB2_CORE_JSON_HPP
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#include <tcb/span.hpp>
|
||||
|
||||
#include "hash_map.hpp"
|
||||
#include "string.h"
|
||||
#include "vector.hpp"
|
||||
|
||||
#include "json_macro.inl"
|
||||
|
||||
namespace srb2
|
||||
{
|
||||
|
||||
class JsonValue;
|
||||
|
||||
using JsonArray = Vector<JsonValue>;
|
||||
using JsonObject = HashMap<String, JsonValue>;
|
||||
|
||||
class JsonError : public std::runtime_error
|
||||
{
|
||||
public:
|
||||
JsonError(const std::string& what);
|
||||
JsonError(const char* what);
|
||||
JsonError(const JsonError&) noexcept;
|
||||
};
|
||||
|
||||
class JsonParseError : public JsonError
|
||||
{
|
||||
public:
|
||||
JsonParseError(const std::string& what);
|
||||
JsonParseError(const char* what);
|
||||
JsonParseError(const JsonParseError&) noexcept;
|
||||
};
|
||||
|
||||
class JsonValue
|
||||
{
|
||||
public:
|
||||
enum class Type : int
|
||||
{
|
||||
kNull,
|
||||
kBoolean,
|
||||
kNumber,
|
||||
kString,
|
||||
kArray,
|
||||
kObject
|
||||
};
|
||||
|
||||
private:
|
||||
Type type_;
|
||||
union {
|
||||
struct {} dummy;
|
||||
bool boolean_;
|
||||
double number_;
|
||||
String string_;
|
||||
JsonArray array_;
|
||||
JsonObject object_;
|
||||
};
|
||||
|
||||
static void value_to_ubjson(srb2::Vector<std::byte>& out);
|
||||
static void value_to_ubjson(srb2::Vector<std::byte>& out, bool value);
|
||||
static void value_to_ubjson(srb2::Vector<std::byte>& out, double value);
|
||||
static void value_to_ubjson(srb2::Vector<std::byte>& out, uint64_t value);
|
||||
static void value_to_ubjson(srb2::Vector<std::byte>& out, const String& value, bool include_type);
|
||||
static void value_to_ubjson(srb2::Vector<std::byte>& out, const JsonArray& value);
|
||||
static void value_to_ubjson(srb2::Vector<std::byte>& out, const JsonObject& value);
|
||||
|
||||
void do_to_ubjson(srb2::Vector<std::byte>& out) const;
|
||||
|
||||
public:
|
||||
JsonValue();
|
||||
JsonValue(const JsonValue&);
|
||||
JsonValue(JsonValue&&) noexcept;
|
||||
~JsonValue();
|
||||
JsonValue& operator=(const JsonValue&);
|
||||
JsonValue& operator=(JsonValue&&) noexcept;
|
||||
|
||||
JsonValue(const String& value);
|
||||
JsonValue(String&& value);
|
||||
JsonValue(const JsonArray& value);
|
||||
JsonValue(JsonArray&& value);
|
||||
JsonValue(const JsonObject& value);
|
||||
JsonValue(JsonObject&& value);
|
||||
JsonValue(float value);
|
||||
JsonValue(double value);
|
||||
JsonValue(int8_t value);
|
||||
JsonValue(int16_t value);
|
||||
JsonValue(int32_t value);
|
||||
JsonValue(int64_t value);
|
||||
JsonValue(uint8_t value);
|
||||
JsonValue(uint16_t value);
|
||||
JsonValue(uint32_t value);
|
||||
JsonValue(uint64_t value);
|
||||
JsonValue(bool value);
|
||||
|
||||
static JsonValue array() { return JsonValue(JsonArray()); }
|
||||
static JsonValue object() { return JsonValue(JsonObject()); }
|
||||
|
||||
bool operator==(const JsonValue& rhs) const;
|
||||
bool operator!=(const JsonValue& rhs) const { return !(*this == rhs); }
|
||||
|
||||
void to_json(JsonValue& to) const;
|
||||
void from_json(const JsonValue& from);
|
||||
String to_json_string() const;
|
||||
static JsonValue from_json_string(const String& str);
|
||||
srb2::Vector<std::byte> to_ubjson() const;
|
||||
static JsonValue from_ubjson(tcb::span<const std::byte> ubjson);
|
||||
constexpr Type type() const noexcept { return type_; }
|
||||
|
||||
template <typename V> V get() const;
|
||||
|
||||
constexpr bool is_null() const noexcept { return type_ == Type::kNull; }
|
||||
constexpr bool is_boolean() const noexcept { return type_ == Type::kBoolean; }
|
||||
constexpr bool is_number() const noexcept { return type_ == Type::kNumber; }
|
||||
constexpr bool is_string() const noexcept { return type_ == Type::kString; }
|
||||
constexpr bool is_array() const noexcept { return type_ == Type::kArray; }
|
||||
constexpr bool is_object() const noexcept { return type_ == Type::kObject; }
|
||||
JsonArray& as_array();
|
||||
JsonObject& as_object();
|
||||
const JsonArray& as_array() const;
|
||||
const JsonObject& as_object() const;
|
||||
|
||||
JsonValue& at(uint32_t i);
|
||||
const JsonValue& at(uint32_t i) const;
|
||||
JsonValue& at(const char* key);
|
||||
JsonValue& at(const String& key);
|
||||
const JsonValue& at(const char* key) const;
|
||||
const JsonValue& at(const String& key) const;
|
||||
|
||||
template <typename V>
|
||||
V value(const char* key, const V& def) const;
|
||||
template <typename V>
|
||||
V value(const String& key, const V& def) const;
|
||||
template <typename V>
|
||||
V value(const char* key, V&& def) const;
|
||||
template <typename V>
|
||||
V value(const String& key, V&& def) const;
|
||||
|
||||
bool contains(const char* key) const;
|
||||
bool contains(const String& key) const;
|
||||
|
||||
JsonValue& operator[](uint32_t i);
|
||||
JsonValue& operator[](const char* key);
|
||||
JsonValue& operator[](const String& key);
|
||||
};
|
||||
|
||||
void to_json(JsonValue& to, bool value);
|
||||
void to_json(JsonValue& to, int8_t value);
|
||||
void to_json(JsonValue& to, int16_t value);
|
||||
void to_json(JsonValue& to, int32_t value);
|
||||
void to_json(JsonValue& to, int64_t value);
|
||||
void to_json(JsonValue& to, uint8_t value);
|
||||
void to_json(JsonValue& to, uint16_t value);
|
||||
void to_json(JsonValue& to, uint32_t value);
|
||||
void to_json(JsonValue& to, uint64_t value);
|
||||
void to_json(JsonValue& to, float value);
|
||||
void to_json(JsonValue& to, double value);
|
||||
void to_json(JsonValue& to, const String& value);
|
||||
void to_json(JsonValue& to, const JsonArray& value);
|
||||
void to_json(JsonValue& to, const JsonObject& value);
|
||||
|
||||
void from_json(const JsonValue& to, bool& value);
|
||||
void from_json(const JsonValue& to, int8_t& value);
|
||||
void from_json(const JsonValue& to, int16_t& value);
|
||||
void from_json(const JsonValue& to, int32_t& value);
|
||||
void from_json(const JsonValue& to, int64_t& value);
|
||||
void from_json(const JsonValue& to, uint8_t& value);
|
||||
void from_json(const JsonValue& to, uint16_t& value);
|
||||
void from_json(const JsonValue& to, uint32_t& value);
|
||||
void from_json(const JsonValue& to, uint64_t& value);
|
||||
void from_json(const JsonValue& to, float& value);
|
||||
void from_json(const JsonValue& to, double& value);
|
||||
void from_json(const JsonValue& to, String& value);
|
||||
void from_json(const JsonValue& to, JsonArray& value);
|
||||
void from_json(const JsonValue& to, JsonObject& value);
|
||||
|
||||
template <typename T, size_t S>
|
||||
inline void to_json(JsonValue& to, const std::array<T, S>& v)
|
||||
{
|
||||
JsonArray arr;
|
||||
for (auto itr = v.begin(); itr != v.end(); itr++)
|
||||
{
|
||||
JsonValue conv;
|
||||
to_json(conv, *itr);
|
||||
arr.push_back(conv);
|
||||
}
|
||||
to = JsonValue(std::move(arr));
|
||||
}
|
||||
|
||||
template <typename T, size_t S>
|
||||
inline void from_json(const JsonValue& to, std::array<T, S>& v)
|
||||
{
|
||||
if (!to.is_array())
|
||||
{
|
||||
throw JsonError("json value must be an array");
|
||||
}
|
||||
const JsonArray& arr = to.as_array();
|
||||
size_t si = 0;
|
||||
for (auto& i : arr)
|
||||
{
|
||||
if (si >= v.size())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
T conv;
|
||||
from_json(i, conv);
|
||||
v[si] = std::move(conv);
|
||||
si++;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename A>
|
||||
inline void to_json(JsonValue& to, const std::vector<T, A>& v)
|
||||
{
|
||||
JsonArray arr;
|
||||
for (auto itr = v.begin(); itr != v.end(); itr++)
|
||||
{
|
||||
JsonValue conv;
|
||||
to_json(conv, *itr);
|
||||
arr.push_back(conv);
|
||||
}
|
||||
to = JsonValue(std::move(arr));
|
||||
}
|
||||
|
||||
template <typename T, typename A>
|
||||
inline void from_json(const JsonValue& to, std::vector<T, A>& v)
|
||||
{
|
||||
if (!to.is_array())
|
||||
{
|
||||
throw JsonError("json value must be an array");
|
||||
}
|
||||
v.clear();
|
||||
const JsonArray& arr = to.as_array();
|
||||
for (auto& i : arr)
|
||||
{
|
||||
T conv;
|
||||
from_json(i, conv);
|
||||
v.push_back(std::move(conv));
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline void to_json(JsonValue& to, const srb2::Vector<T>& v)
|
||||
{
|
||||
JsonArray arr;
|
||||
for (auto itr = v.begin(); itr != v.end(); itr++)
|
||||
{
|
||||
JsonValue conv;
|
||||
to_json(conv, *itr);
|
||||
arr.push_back(conv);
|
||||
}
|
||||
to = JsonValue(std::move(arr));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline void from_json(const JsonValue& to, srb2::Vector<T>& v)
|
||||
{
|
||||
if (!to.is_array())
|
||||
{
|
||||
throw JsonError("json value must be an array");
|
||||
}
|
||||
v.clear();
|
||||
const JsonArray& arr = to.as_array();
|
||||
for (auto& i : arr)
|
||||
{
|
||||
T conv;
|
||||
from_json(i, conv);
|
||||
v.push_back(std::move(conv));
|
||||
}
|
||||
}
|
||||
|
||||
template <typename K, typename V, typename H, typename E, typename A>
|
||||
inline void to_json(JsonValue& to, const std::unordered_map<K, V, H, E, A>& v)
|
||||
{
|
||||
JsonObject obj;
|
||||
for (auto itr = v.begin(); itr != v.end(); itr++)
|
||||
{
|
||||
to_json(obj[itr->first], itr->second);
|
||||
}
|
||||
to = JsonValue(std::move(obj));
|
||||
}
|
||||
|
||||
template <typename K, typename V, typename H, typename E, typename A>
|
||||
inline void from_json(const JsonValue& to, std::unordered_map<K, V, H, E, A>& v)
|
||||
{
|
||||
if (!to.is_object())
|
||||
{
|
||||
throw JsonError("json value must be an object");
|
||||
}
|
||||
v.clear();
|
||||
const JsonObject& obj = to.as_object();
|
||||
for (auto itr = obj.begin(); itr != obj.end(); itr++)
|
||||
{
|
||||
V conv;
|
||||
from_json(itr->second, conv);
|
||||
v[itr->first] = std::move(conv);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
inline void to_json(JsonValue& to, const srb2::HashMap<K, V>& v)
|
||||
{
|
||||
JsonObject obj;
|
||||
for (auto itr = v.begin(); itr != v.end(); itr++)
|
||||
{
|
||||
to_json(obj[itr->first], itr->second);
|
||||
}
|
||||
to = JsonValue(std::move(obj));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
inline void from_json(const JsonValue& to, srb2::HashMap<K, V>& v)
|
||||
{
|
||||
if (!to.is_object())
|
||||
{
|
||||
throw JsonError("json value must be an object");
|
||||
}
|
||||
v.clear();
|
||||
const JsonObject& obj = to.as_object();
|
||||
for (auto itr = obj.begin(); itr != obj.end(); itr++)
|
||||
{
|
||||
V conv;
|
||||
from_json(itr->second, conv);
|
||||
v[itr->first] = std::move(conv);
|
||||
}
|
||||
}
|
||||
|
||||
void from_json(const JsonValue& to, std::string& v);
|
||||
void to_json(JsonValue& to, const std::string& v);
|
||||
|
||||
// template <typename K, typename V>
|
||||
// inline void to_json(JsonValue& to, const srb2::OAHashMap<K, V>& v)
|
||||
// {
|
||||
// JsonObject obj;
|
||||
// for (auto itr = v.begin(); itr != v.end(); itr++)
|
||||
// {
|
||||
// to_json(obj[itr->first], itr->second);
|
||||
// }
|
||||
// to = JsonValue(std::move(obj));
|
||||
// }
|
||||
|
||||
// template <typename K, typename V>
|
||||
// inline void from_json(const JsonValue& to, srb2::OAHashMap<K, V>& v)
|
||||
// {
|
||||
// if (!to.is_object())
|
||||
// {
|
||||
// throw JsonError("json value must be an object");
|
||||
// }
|
||||
// v.clear();
|
||||
// const JsonObject& obj = to.as_object();
|
||||
// for (auto itr = obj.begin(); itr != obj.end(); itr++)
|
||||
// {
|
||||
// V conv;
|
||||
// from_json(itr->second, conv);
|
||||
// v[itr->first] = std::move(conv);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
|
||||
template <typename V>
|
||||
inline V JsonValue::get() const
|
||||
{
|
||||
V v;
|
||||
from_json(*this, v);
|
||||
return v;
|
||||
}
|
||||
|
||||
template <typename V>
|
||||
inline V JsonValue::value(const char* key, const V& def) const
|
||||
{
|
||||
V copy { def };
|
||||
return value(key, std::move(copy));
|
||||
}
|
||||
|
||||
template <typename V>
|
||||
inline V JsonValue::value(const String& key, const V& def) const
|
||||
{
|
||||
return value(key.c_str(), def);
|
||||
}
|
||||
|
||||
template <typename V>
|
||||
inline V JsonValue::value(const char* key, V&& def) const
|
||||
{
|
||||
const JsonObject& obj = as_object();
|
||||
auto itr = obj.find(key);
|
||||
if (itr != obj.end())
|
||||
{
|
||||
return itr->second.get<V>();
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
||||
template <> bool JsonValue::get() const;
|
||||
template <> int8_t JsonValue::get() const;
|
||||
template <> int16_t JsonValue::get() const;
|
||||
template <> int32_t JsonValue::get() const;
|
||||
template <> int64_t JsonValue::get() const;
|
||||
template <> uint8_t JsonValue::get() const;
|
||||
template <> uint16_t JsonValue::get() const;
|
||||
template <> uint32_t JsonValue::get() const;
|
||||
template <> uint64_t JsonValue::get() const;
|
||||
template <> float JsonValue::get() const;
|
||||
template <> double JsonValue::get() const;
|
||||
template <> String JsonValue::get() const;
|
||||
template <> std::string JsonValue::get() const;
|
||||
template <> std::string_view JsonValue::get() const;
|
||||
template <> JsonArray JsonValue::get() const;
|
||||
template <> JsonObject JsonValue::get() const;
|
||||
template <> JsonValue JsonValue::get() const;
|
||||
|
||||
inline bool operator==(const JsonValue& lhs, bool rhs)
|
||||
{
|
||||
if (!lhs.is_boolean())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return lhs.get<bool>() == rhs;
|
||||
}
|
||||
|
||||
inline bool operator==(const JsonValue& lhs, int64_t rhs)
|
||||
{
|
||||
if (!lhs.is_number())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return lhs.get<int64_t>() == rhs;
|
||||
}
|
||||
|
||||
inline bool operator==(const JsonValue& lhs, uint64_t rhs)
|
||||
{
|
||||
if (!lhs.is_number())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return lhs.get<uint64_t>() == rhs;
|
||||
}
|
||||
|
||||
inline bool operator==(const JsonValue& lhs, double rhs)
|
||||
{
|
||||
if (!lhs.is_number())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return lhs.get<double>() == rhs;
|
||||
}
|
||||
|
||||
inline bool operator==(const JsonValue& lhs, std::string_view rhs)
|
||||
{
|
||||
if (!lhs.is_string())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return lhs.get<std::string_view>() == rhs;
|
||||
}
|
||||
|
||||
inline bool operator==(const JsonValue& lhs, const JsonArray& rhs)
|
||||
{
|
||||
if (!lhs.is_array())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return lhs.as_array() == rhs;
|
||||
}
|
||||
|
||||
inline bool operator==(const JsonValue& lhs, const JsonObject& rhs)
|
||||
{
|
||||
if (!lhs.is_object())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return lhs.as_object() == rhs;
|
||||
}
|
||||
|
||||
inline bool operator!=(const JsonValue& lhs, bool rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator!=(const JsonValue& lhs, int64_t rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator!=(const JsonValue& lhs, uint64_t rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator!=(const JsonValue& lhs, double rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator!=(const JsonValue& lhs, std::string_view rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator!=(const JsonValue& lhs, const JsonArray& rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator!=(const JsonValue& lhs, const JsonObject& rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
extern template class Vector<srb2::JsonValue>;
|
||||
extern template class HashMap<String, srb2::JsonValue>;
|
||||
|
||||
} // namespace srb2
|
||||
|
||||
#endif // SRB2_CORE_JSON_HPP
|
||||
185
src/core/json_macro.inl
Normal file
185
src/core/json_macro.inl
Normal file
|
|
@ -0,0 +1,185 @@
|
|||
// __ _____ _____ _____
|
||||
// __| | __| | | | JSON for Modern C++
|
||||
// | | |__ | | | | | | version 3.11.3
|
||||
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||
//
|
||||
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||
// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson <evan@nemerson.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// file: macro_scope.hpp
|
||||
|
||||
// This file is derived from nlohmman json's codegen macros and thus is provided under its license.
|
||||
|
||||
#define SRB2_JSON_EXPAND( x ) x
|
||||
#define SRB2_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME
|
||||
#define SRB2_JSON_PASTE(...) SRB2_JSON_EXPAND(SRB2_JSON_GET_MACRO(__VA_ARGS__, \
|
||||
SRB2_JSON_PASTE64, \
|
||||
SRB2_JSON_PASTE63, \
|
||||
SRB2_JSON_PASTE62, \
|
||||
SRB2_JSON_PASTE61, \
|
||||
SRB2_JSON_PASTE60, \
|
||||
SRB2_JSON_PASTE59, \
|
||||
SRB2_JSON_PASTE58, \
|
||||
SRB2_JSON_PASTE57, \
|
||||
SRB2_JSON_PASTE56, \
|
||||
SRB2_JSON_PASTE55, \
|
||||
SRB2_JSON_PASTE54, \
|
||||
SRB2_JSON_PASTE53, \
|
||||
SRB2_JSON_PASTE52, \
|
||||
SRB2_JSON_PASTE51, \
|
||||
SRB2_JSON_PASTE50, \
|
||||
SRB2_JSON_PASTE49, \
|
||||
SRB2_JSON_PASTE48, \
|
||||
SRB2_JSON_PASTE47, \
|
||||
SRB2_JSON_PASTE46, \
|
||||
SRB2_JSON_PASTE45, \
|
||||
SRB2_JSON_PASTE44, \
|
||||
SRB2_JSON_PASTE43, \
|
||||
SRB2_JSON_PASTE42, \
|
||||
SRB2_JSON_PASTE41, \
|
||||
SRB2_JSON_PASTE40, \
|
||||
SRB2_JSON_PASTE39, \
|
||||
SRB2_JSON_PASTE38, \
|
||||
SRB2_JSON_PASTE37, \
|
||||
SRB2_JSON_PASTE36, \
|
||||
SRB2_JSON_PASTE35, \
|
||||
SRB2_JSON_PASTE34, \
|
||||
SRB2_JSON_PASTE33, \
|
||||
SRB2_JSON_PASTE32, \
|
||||
SRB2_JSON_PASTE31, \
|
||||
SRB2_JSON_PASTE30, \
|
||||
SRB2_JSON_PASTE29, \
|
||||
SRB2_JSON_PASTE28, \
|
||||
SRB2_JSON_PASTE27, \
|
||||
SRB2_JSON_PASTE26, \
|
||||
SRB2_JSON_PASTE25, \
|
||||
SRB2_JSON_PASTE24, \
|
||||
SRB2_JSON_PASTE23, \
|
||||
SRB2_JSON_PASTE22, \
|
||||
SRB2_JSON_PASTE21, \
|
||||
SRB2_JSON_PASTE20, \
|
||||
SRB2_JSON_PASTE19, \
|
||||
SRB2_JSON_PASTE18, \
|
||||
SRB2_JSON_PASTE17, \
|
||||
SRB2_JSON_PASTE16, \
|
||||
SRB2_JSON_PASTE15, \
|
||||
SRB2_JSON_PASTE14, \
|
||||
SRB2_JSON_PASTE13, \
|
||||
SRB2_JSON_PASTE12, \
|
||||
SRB2_JSON_PASTE11, \
|
||||
SRB2_JSON_PASTE10, \
|
||||
SRB2_JSON_PASTE9, \
|
||||
SRB2_JSON_PASTE8, \
|
||||
SRB2_JSON_PASTE7, \
|
||||
SRB2_JSON_PASTE6, \
|
||||
SRB2_JSON_PASTE5, \
|
||||
SRB2_JSON_PASTE4, \
|
||||
SRB2_JSON_PASTE3, \
|
||||
SRB2_JSON_PASTE2, \
|
||||
SRB2_JSON_PASTE1)(__VA_ARGS__))
|
||||
#define SRB2_JSON_PASTE2(func, v1) func(v1)
|
||||
#define SRB2_JSON_PASTE3(func, v1, v2) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE2(func, v2)
|
||||
#define SRB2_JSON_PASTE4(func, v1, v2, v3) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE3(func, v2, v3)
|
||||
#define SRB2_JSON_PASTE5(func, v1, v2, v3, v4) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE4(func, v2, v3, v4)
|
||||
#define SRB2_JSON_PASTE6(func, v1, v2, v3, v4, v5) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE5(func, v2, v3, v4, v5)
|
||||
#define SRB2_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE6(func, v2, v3, v4, v5, v6)
|
||||
#define SRB2_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)
|
||||
#define SRB2_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)
|
||||
#define SRB2_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)
|
||||
#define SRB2_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)
|
||||
#define SRB2_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)
|
||||
#define SRB2_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
|
||||
#define SRB2_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
|
||||
#define SRB2_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)
|
||||
#define SRB2_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)
|
||||
#define SRB2_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)
|
||||
#define SRB2_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)
|
||||
#define SRB2_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)
|
||||
#define SRB2_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)
|
||||
#define SRB2_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)
|
||||
#define SRB2_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)
|
||||
#define SRB2_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)
|
||||
#define SRB2_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)
|
||||
#define SRB2_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)
|
||||
#define SRB2_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)
|
||||
#define SRB2_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)
|
||||
#define SRB2_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)
|
||||
#define SRB2_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)
|
||||
#define SRB2_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)
|
||||
#define SRB2_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)
|
||||
#define SRB2_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)
|
||||
#define SRB2_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)
|
||||
#define SRB2_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)
|
||||
#define SRB2_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)
|
||||
#define SRB2_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)
|
||||
#define SRB2_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)
|
||||
#define SRB2_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)
|
||||
#define SRB2_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)
|
||||
#define SRB2_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)
|
||||
#define SRB2_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)
|
||||
#define SRB2_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)
|
||||
#define SRB2_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)
|
||||
#define SRB2_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)
|
||||
#define SRB2_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)
|
||||
#define SRB2_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)
|
||||
#define SRB2_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)
|
||||
#define SRB2_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)
|
||||
#define SRB2_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)
|
||||
#define SRB2_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)
|
||||
#define SRB2_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)
|
||||
#define SRB2_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)
|
||||
#define SRB2_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)
|
||||
#define SRB2_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)
|
||||
#define SRB2_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)
|
||||
#define SRB2_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)
|
||||
#define SRB2_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)
|
||||
#define SRB2_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)
|
||||
#define SRB2_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)
|
||||
#define SRB2_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)
|
||||
#define SRB2_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)
|
||||
#define SRB2_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)
|
||||
#define SRB2_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)
|
||||
#define SRB2_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) SRB2_JSON_PASTE2(func, v1) SRB2_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)
|
||||
|
||||
#define SRB2_JSON_TO(v1) to_json(srb2_json_j.as_object()[#v1], srb2_json_t.v1);
|
||||
#define SRB2_JSON_FROM(v1) srb2_json_t.v1 = srb2_json_j.as_object().at(#v1);
|
||||
#define SRB2_JSON_FROM_WITH_DEFAULT(v1) if (srb2_json_j.as_object().find(#v1) != srb2_json_j.as_object().end()) \
|
||||
{ \
|
||||
from_json(srb2_json_j.as_object().find(#v1)->second, srb2_json_t.v1); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
srb2_json_t.v1 = srb2_json_default_obj.v1; \
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief macro
|
||||
@def SRB2_JSON_DEFINE_TYPE_INTRUSIVE
|
||||
@since version 3.9.0
|
||||
*/
|
||||
#define SRB2_JSON_DEFINE_TYPE_INTRUSIVE(Type, ...) \
|
||||
friend void to_json(srb2::JsonValue& srb2_json_j, const Type& srb2_json_t) { srb2_json_j = srb2::JsonObject(); SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_TO, __VA_ARGS__)) } \
|
||||
friend void from_json(const srb2::JsonValue& srb2_json_j, Type& srb2_json_t) { SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_FROM, __VA_ARGS__)) }
|
||||
|
||||
#define SRB2_JSON_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||
friend void to_json(srb2::JsonValue& srb2_json_j, const Type& srb2_json_t) { srb2_json_j = srb2::JsonObject(); SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_TO, __VA_ARGS__)) } \
|
||||
friend void from_json(const srb2::JsonValue& srb2_json_j, Type& srb2_json_t) { const Type srb2_json_default_obj{}; SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||
|
||||
/*!
|
||||
@brief macro
|
||||
@def SRB2_JSON_DEFINE_TYPE_NON_INTRUSIVE
|
||||
@since version 3.9.0
|
||||
*/
|
||||
#define SRB2_JSON_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \
|
||||
inline void to_json(srb2::JsonValue& srb2_json_j, const Type& srb2_json_t) { SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_TO, __VA_ARGS__)) } \
|
||||
inline void from_json(const srb2::JsonValue& srb2_json_j, Type& srb2_json_t) { SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_FROM, __VA_ARGS__)) }
|
||||
|
||||
/*!
|
||||
@brief macro
|
||||
@def SRB2_JSON_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT
|
||||
@since version 3.11.0
|
||||
*/
|
||||
#define SRB2_JSON_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||
inline void to_json(srb2::JsonValue& srb2_json_j, const Type& srb2_json_t) { SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_TO, __VA_ARGS__)) } \
|
||||
inline void from_json(const srb2::JsonValue& srb2_json_j, Type& srb2_json_t) { const Type srb2_json_default_obj{}; SRB2_JSON_EXPAND(SRB2_JSON_PASTE(SRB2_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||
Loading…
Add table
Reference in a new issue