aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbulatman <bulatman@yandex-team.com>2023-03-10 09:57:16 +0300
committerbulatman <bulatman@yandex-team.com>2023-03-10 09:57:16 +0300
commit59c758d9fa32f1dc467824707fb8cdf91e8bb731 (patch)
tree778dfe65cb05879b49595f4f4dc1ba43e8df7ffb
parent82ad7fa64a7e511763a6f6a0278d4eed1b01b96e (diff)
downloadydb-59c758d9fa32f1dc467824707fb8cdf91e8bb731.tar.gz
YT: Allow to define enum with custom string represenation
-rw-r--r--library/cpp/yt/misc/enum-inl.h16
-rw-r--r--library/cpp/yt/misc/unittests/enum_ut.cpp14
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