diff options
| author | bulatman <[email protected]> | 2023-03-10 09:57:16 +0300 | 
|---|---|---|
| committer | bulatman <[email protected]> | 2023-03-10 09:57:16 +0300 | 
| commit | 59c758d9fa32f1dc467824707fb8cdf91e8bb731 (patch) | |
| tree | 778dfe65cb05879b49595f4f4dc1ba43e8df7ffb /library/cpp | |
| parent | 82ad7fa64a7e511763a6f6a0278d4eed1b01b96e (diff) | |
YT: Allow to define enum with custom string represenation
Diffstat (limited to 'library/cpp')
| -rw-r--r-- | library/cpp/yt/misc/enum-inl.h | 16 | ||||
| -rw-r--r-- | library/cpp/yt/misc/unittests/enum_ut.cpp | 14 | 
2 files changed, 30 insertions, 0 deletions
diff --git a/library/cpp/yt/misc/enum-inl.h b/library/cpp/yt/misc/enum-inl.h index 86515e8a4e3..18a78621a9c 100644 --- a/library/cpp/yt/misc/enum-inl.h +++ b/library/cpp/yt/misc/enum-inl.h @@ -140,6 +140,22 @@ static constexpr bool AreValuesDistinct(const TValues& values)      )(item)  #define ENUM__GET_DOMAIN_NAMES_ITEM_SEQ(seq) \ +    PP_IF( \ +       ENUM__ITEM_SEQ_HAS_DOMAIN_NAME(seq), \ +       ENUM__GET_DOMAIN_NAMES_ITEM_SEQ_CUSTOM, \ +       ENUM__GET_DOMAIN_NAMES_ITEM_SEQ_AUTO \ +    )(seq) + +#define ENUM__ITEM_SEQ_HAS_DOMAIN_NAME(seq) \ +    PP_CONCAT(ENUM__ITEM_SEQ_HAS_DOMAIN_NAME_, PP_COUNT(seq)) + +#define ENUM__ITEM_SEQ_HAS_DOMAIN_NAME_2 PP_FALSE +#define ENUM__ITEM_SEQ_HAS_DOMAIN_NAME_3 PP_TRUE + +#define ENUM__GET_DOMAIN_NAMES_ITEM_SEQ_CUSTOM(seq) \ +    TStringBuf(PP_ELEMENT(seq, 2)), + +#define ENUM__GET_DOMAIN_NAMES_ITEM_SEQ_AUTO(seq) \      ENUM__GET_DOMAIN_NAMES_ITEM_ATOMIC(PP_ELEMENT(seq, 0))  #define ENUM__GET_DOMAIN_NAMES_ITEM_ATOMIC(item) \ diff --git a/library/cpp/yt/misc/unittests/enum_ut.cpp b/library/cpp/yt/misc/unittests/enum_ut.cpp index 6af11b04dc0..2a024be228c 100644 --- a/library/cpp/yt/misc/unittests/enum_ut.cpp +++ b/library/cpp/yt/misc/unittests/enum_ut.cpp @@ -37,6 +37,11 @@ DEFINE_AMBIGUOUS_ENUM_WITH_UNDERLYING_TYPE(EMultipleNames, int,      ((D2)(100))  ); +DEFINE_ENUM(ECustomString, +    ((A) (1) ("1_a")) +    ((B) (2) ("1_b")) +); +  ////////////////////////////////////////////////////////////////////////////////  template <class T, size_t N> @@ -243,6 +248,15 @@ TEST(TEnumTest, MultipleNames)      EXPECT_EQ("D1", ToString(EMultipleNames::D2));  } +TEST(TEnumTest, CustomString) +{ +    EXPECT_EQ(ECustomString::A, TEnumTraits<ECustomString>::FromString("1_a")); +    EXPECT_EQ(ECustomString::B, TEnumTraits<ECustomString>::FromString("1_b")); + +    EXPECT_EQ("1_a", ToString(ECustomString::A)); +    EXPECT_EQ("1_b", ToString(ECustomString::B)); +} +  ////////////////////////////////////////////////////////////////////////////////  } // namespace  | 
