enum_runtime.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #pragma once
  2. #include <util/generic/array_ref.h>
  3. #include <util/generic/strbuf.h>
  4. #include <util/generic/string.h>
  5. #include <util/generic/vector.h>
  6. #include <util/generic/serialized_enum.h>
  7. #include <utility>
  8. class IOutputStream;
  9. namespace NEnumSerializationRuntime {
  10. /// Stores all information about enumeration except its real type
  11. template <typename TEnumRepresentationType>
  12. class TEnumDescriptionBase {
  13. public:
  14. using TRepresentationType = TEnumRepresentationType;
  15. struct TEnumStringPair {
  16. const TRepresentationType Key;
  17. const TStringBuf Name;
  18. };
  19. /// Refers initialization data stored in constexpr-friendly format
  20. struct TInitializationData {
  21. const TArrayRef<const TEnumStringPair> NamesInitializer;
  22. const TArrayRef<const TEnumStringPair> ValuesInitializer;
  23. const TArrayRef<const TStringBuf> CppNamesInitializer;
  24. const TStringBuf CppNamesPrefix;
  25. const TStringBuf ClassName;
  26. };
  27. public:
  28. TEnumDescriptionBase(const TInitializationData& enumInitData);
  29. ~TEnumDescriptionBase();
  30. const TString& ToString(TRepresentationType key) const;
  31. std::pair<bool, TRepresentationType> TryFromString(const TStringBuf name) const;
  32. TRepresentationType FromString(const TStringBuf name) const;
  33. void Out(IOutputStream* os, const TRepresentationType key) const;
  34. const TString& AllEnumNames() const noexcept {
  35. return AllNames;
  36. }
  37. const TVector<TString>& AllEnumCppNames() const noexcept {
  38. return AllCppNames;
  39. }
  40. const TMap<TRepresentationType, TString>& TypelessEnumNames() const noexcept {
  41. return Names;
  42. }
  43. const TVector<TRepresentationType>& TypelessEnumValues() const noexcept {
  44. return AllValues;
  45. }
  46. private:
  47. TMap<TRepresentationType, TString> Names;
  48. TMap<TString, TRepresentationType> Values;
  49. TString AllNames;
  50. TVector<TString> AllCppNames;
  51. TString ClassName;
  52. TVector<TRepresentationType> AllValues;
  53. };
  54. /// Wraps TEnumDescriptionBase and performs on-demand casts
  55. template <typename EEnum, typename TEnumRepresentationType = typename NDetail::TSelectEnumRepresentationType<EEnum>::TType>
  56. class TEnumDescription: public NDetail::TMappedViewBase<EEnum, TEnumRepresentationType>, private TEnumDescriptionBase<TEnumRepresentationType> {
  57. public:
  58. using TBase = TEnumDescriptionBase<TEnumRepresentationType>;
  59. using TCast = NDetail::TMappedViewBase<EEnum, TEnumRepresentationType>;
  60. using TBase::AllEnumCppNames;
  61. using TBase::AllEnumNames;
  62. using typename TBase::TEnumStringPair;
  63. using typename TBase::TRepresentationType;
  64. using typename TBase::TInitializationData;
  65. public:
  66. using TBase::TBase;
  67. const TString& ToString(const EEnum key) const {
  68. return TBase::ToString(TCast::CastToRepresentationType(key));
  69. }
  70. bool FromString(const TStringBuf name, EEnum& ret) const {
  71. const auto findResult = TBase::TryFromString(name);
  72. if (findResult.first) {
  73. ret = TCast::CastFromRepresentationType(findResult.second);
  74. return true;
  75. }
  76. return false;
  77. }
  78. EEnum FromString(const TStringBuf name) const {
  79. return TCast::CastFromRepresentationType(TBase::FromString(name));
  80. }
  81. TMappedDictView<EEnum, TString> EnumNames() const noexcept {
  82. return {TBase::TypelessEnumNames()};
  83. }
  84. TMappedArrayView<EEnum> AllEnumValues() const noexcept {
  85. return {TBase::TypelessEnumValues()};
  86. }
  87. void Out(IOutputStream* os, const EEnum key) const {
  88. TBase::Out(os, TCast::CastToRepresentationType(key));
  89. }
  90. static constexpr TEnumStringPair EnumStringPair(const EEnum key, const TStringBuf name) noexcept {
  91. return {TCast::CastToRepresentationType(key), name};
  92. }
  93. };
  94. }