MetaIdentifier.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * MetaIdentifier.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "IdentifierBase.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. /// This class represents field that may contain value of multiple different identifer types
  14. template<typename... Types>
  15. class DLL_LINKAGE MetaIdentifier
  16. {
  17. std::variant<Types...> value;
  18. public:
  19. MetaIdentifier()
  20. {}
  21. template<typename IdentifierType>
  22. MetaIdentifier(const IdentifierType & identifier)
  23. : value(identifier)
  24. {}
  25. int32_t getNum() const
  26. {
  27. std::optional<int32_t> result;
  28. std::visit([&result] (const auto& v) { result = v.getNum(); }, value);
  29. assert(result.has_value());
  30. return result.value_or(-1);
  31. }
  32. std::string toString() const
  33. {
  34. std::optional<std::string> result;
  35. std::visit([&result] (const auto& v) { result = v.encode(v.getNum()); }, value);
  36. assert(result.has_value());
  37. return result.value_or("");
  38. }
  39. template<typename IdentifierType>
  40. IdentifierType as() const
  41. {
  42. auto * result = std::get_if<IdentifierType>(&value);
  43. assert(result);
  44. if (result)
  45. return *result;
  46. else
  47. return IdentifierType();
  48. }
  49. template <typename Handler> void serialize(Handler &h, const int version)
  50. {
  51. h & value;
  52. }
  53. bool operator == (const MetaIdentifier & other) const
  54. {
  55. return value == other.value;
  56. }
  57. bool operator != (const MetaIdentifier & other) const
  58. {
  59. return value != other.value;
  60. }
  61. bool operator < (const MetaIdentifier & other) const
  62. {
  63. return value < other.value;
  64. }
  65. };
  66. VCMI_LIB_NAMESPACE_END