1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-25 22:42:04 +02:00

Remove bitmasks of PlayerColor's. Add encode/decode methods

This commit is contained in:
Ivan Savenko
2023-08-25 21:40:19 +03:00
parent f79492e5b0
commit a30e7ba321
13 changed files with 56 additions and 142 deletions

View File

@@ -335,81 +335,6 @@ public:
}
}
///si32-convertible identifier set <-> Json array of string
///Type U is only used for code & decode
///TODO: Auto deduce U based on T?
template <typename T, typename U = T>
void serializeIdArray(const std::string & fieldName, std::set<T> & value, const std::set<T> & defaultValue)
{
std::vector<si32> temp;
if(saving && value != defaultValue)
{
temp.reserve(value.size());
for(const T & vitem : value)
{
si32 item = static_cast<si32>(vitem);
temp.push_back(item);
}
serializeInternal(fieldName, temp, &U::decode, &U::encode);
}
if(!saving)
{
JsonNode node;
serializeRaw(fieldName, node, std::nullopt);
if(node.Vector().empty())
{
value = defaultValue;
}
else
{
value.clear();
for(const auto & id : node.Vector())
{
VLC->identifiers()->requestIdentifier(U::entityType(), id, [&value](int32_t identifier)
{
value.emplace(identifier);
});
}
}
}
}
///bitmask <-> Json array of string
template <typename T, int Size>
void serializeIdArray(const std::string & fieldName, T & value, const T & defaultValue, const TDecoder & decoder, const TEncoder & encoder)
{
static_assert(8 * sizeof(T) >= Size, "Mask size too small");
std::vector<si32> temp;
temp.reserve(Size);
if(saving && value != defaultValue)
{
for(si32 i = 0; i < Size; i++)
if(value & (1 << i))
temp.push_back(i);
serializeInternal(fieldName, temp, decoder, encoder);
}
if(!saving)
{
serializeInternal(fieldName, temp, decoder, encoder);
if(temp.empty())
value = defaultValue;
else
{
value = 0;
for(auto i : temp)
value |= (1 << i);
}
}
}
///si32-convertible instance identifier <-> Json string
template <typename T>
void serializeInstance(const std::string & fieldName, T & value, const T & defaultValue)