/* * VariantIdentifier.h, 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 * */ #pragma once #include "IdentifierBase.h" VCMI_LIB_NAMESPACE_BEGIN /// This class represents field that may contain value of multiple different identifier types template class VariantIdentifier { using Type = std::variant; Type value; public: VariantIdentifier() {} template VariantIdentifier(const IdentifierType & identifier) : value(identifier) {} int32_t getNum() const { int32_t result; std::visit([&result] (const auto& v) { result = v.getNum(); }, value); return result; } std::string toString() const { std::string result; std::visit([&result] (const auto& v) { result = v.encode(v.getNum()); }, value); return result; } template IdentifierType as() const { auto * result = std::get_if(&value); if (result) return *result; else return IdentifierType(); } bool hasValue() const { bool result = false; std::visit([&result] (const auto& v) { result = v.hasValue(); }, value); return result; } template void serialize(Handler &h) { h & value; } bool operator == (const VariantIdentifier & other) const { return value == other.value; } bool operator != (const VariantIdentifier & other) const { return value != other.value; } bool operator < (const VariantIdentifier & other) const { return value < other.value; } }; VCMI_LIB_NAMESPACE_END