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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user