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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/*
* JsonSerializeFormat.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "JsonSerializeFormat.h"
VCMI_LIB_NAMESPACE_BEGIN
//JsonSerializeHelper
JsonSerializeHelper::JsonSerializeHelper(JsonSerializeHelper && other) noexcept: owner(other.owner), restoreState(false)
{
std::swap(restoreState, other.restoreState);
}
JsonSerializeHelper::~JsonSerializeHelper()
{
if(restoreState)
owner->pop();
}
JsonSerializeFormat * JsonSerializeHelper::operator->()
{
return owner;
}
JsonSerializeHelper::JsonSerializeHelper(JsonSerializeFormat * owner_)
: owner(owner_),
restoreState(true)
{
}
//JsonStructSerializer
JsonStructSerializer::JsonStructSerializer(JsonStructSerializer && other) noexcept: JsonSerializeHelper(std::move(static_cast<JsonSerializeHelper &>(other))) {}
JsonStructSerializer::JsonStructSerializer(JsonSerializeFormat * owner_)
: JsonSerializeHelper(owner_)
{
}
//JsonArraySerializer
JsonArraySerializer::JsonArraySerializer(JsonArraySerializer && other) noexcept: JsonSerializeHelper(std::move(static_cast<JsonSerializeHelper &>(other))) {}
JsonArraySerializer::JsonArraySerializer(JsonSerializeFormat * owner_): JsonSerializeHelper(owner_), thisNode(&owner->getCurrent()) {}
JsonStructSerializer JsonArraySerializer::enterStruct(const size_t index)
{
owner->pushArrayElement(index);
return JsonStructSerializer(owner);
}
JsonArraySerializer JsonArraySerializer::enterArray(const size_t index)
{
owner->pushArrayElement(index);
return JsonArraySerializer(owner);
}
void JsonArraySerializer::serializeString(const size_t index, std::string & value)
{
owner->pushArrayElement(index);
owner->serializeInternal(value);
owner->pop();
}
void JsonArraySerializer::serializeInt64(const size_t index, int64_t & value)
{
owner->pushArrayElement(index);
owner->serializeInternal(value);
owner->pop();
}
void JsonArraySerializer::resize(const size_t newSize)
{
resize(newSize, JsonNode::JsonType::DATA_NULL);
}
void JsonArraySerializer::resize(const size_t newSize, JsonNode::JsonType type)
{
owner->resizeCurrent(newSize, type);
}
size_t JsonArraySerializer::size() const
{
return thisNode->Vector().size();
}
JsonSerializeFormat::LICSet::LICSet(const std::set<si32> & Standard, TDecoder Decoder, TEncoder Encoder):
standard(Standard),
decoder(std::move(Decoder)),
encoder(std::move(Encoder))
{
}
//JsonSerializeFormat
JsonSerializeFormat::JsonSerializeFormat(const IInstanceResolver * instanceResolver_, const bool saving_, const bool updating_)
: saving(saving_),
updating(updating_),
instanceResolver(instanceResolver_)
{
}
JsonStructSerializer JsonSerializeFormat::enterStruct(const std::string & fieldName)
{
pushStruct(fieldName);
return JsonStructSerializer(this);
}
JsonArraySerializer JsonSerializeFormat::enterArray(const std::string & fieldName)
{
pushArray(fieldName);
return JsonArraySerializer(this);
}
void JsonSerializeFormat::serializeBool(const std::string & fieldName, bool & value)
{
serializeBool<bool>(fieldName, value, true, false, false);
}
void JsonSerializeFormat::serializeBool(const std::string & fieldName, bool & value, const bool defaultValue)
{
serializeBool<bool>(fieldName, value, true, false, defaultValue);
}
void JsonSerializeFormat::readLICPart(const JsonNode & part, const JsonSerializeFormat::TDecoder & decoder, std::set<si32> & value) const
{
for(const auto & index : part.Vector())
{
const std::string & identifier = index.String();
try
{
const si32 rawId = decoder(identifier);
value.insert(rawId);
}
catch (const IdentifierResolutionException & e)
{
// downgrade exception to warning (printed as part of exception generation
// this is usually caused by loading allowed heroes / artifacts list from vmap's
}
}
}
VCMI_LIB_NAMESPACE_END
|