From e10767756146ca0d8e890326e20671aed5182e2b Mon Sep 17 00:00:00 2001 From: babenko Date: Tue, 14 Mar 2023 09:33:31 +0300 Subject: YT-18571: Refactor YT enums to make them Arcadia-friendly --- library/cpp/yt/string/enum-inl.h | 25 ++++++++----------------- library/cpp/yt/string/enum.h | 5 ++++- 2 files changed, 12 insertions(+), 18 deletions(-) (limited to 'library/cpp/yt/string') diff --git a/library/cpp/yt/string/enum-inl.h b/library/cpp/yt/string/enum-inl.h index 7ce7d2a350a..7e6785efb45 100644 --- a/library/cpp/yt/string/enum-inl.h +++ b/library/cpp/yt/string/enum-inl.h @@ -27,14 +27,8 @@ void FormatUnknownEnumValue( template std::optional TryParseEnum(TStringBuf value) { - static_assert(TEnumTraits::IsEnum); - auto tryFromString = [] (TStringBuf value) -> std::optional { - T result; - if (auto ok = TEnumTraits::FindValueByLiteral(DecodeEnumValue(value), &result)) { - return result; - } - return {}; + return TEnumTraits::FindValueByLiteral(DecodeEnumValue(value)); }; if constexpr (TEnumTraits::IsBitEnum) { @@ -65,28 +59,25 @@ T ParseEnum(TStringBuf value) template void FormatEnum(TStringBuilderBase* builder, T value, bool lowerCase) { - static_assert(TEnumTraits::IsEnum); - auto formatScalarValue = [builder, lowerCase] (T value) { - auto* literal = TEnumTraits::FindLiteralByValue(value); - if (!literal) { - YT_VERIFY(!TEnumTraits::IsBitEnum); + auto optionalLiteral = TEnumTraits::FindLiteralByValue(value); + if (!optionalLiteral) { NYT::NDetail::FormatUnknownEnumValue( builder, TEnumTraits::GetTypeName(), - static_cast::TUnderlying>(value)); + ToUnderlying(value)); return; } if (lowerCase) { - CamelCaseToUnderscoreCase(builder, *literal); + CamelCaseToUnderscoreCase(builder, *optionalLiteral); } else { - builder->AppendString(*literal); + builder->AppendString(*optionalLiteral); } }; if constexpr (TEnumTraits::IsBitEnum) { - if (auto* literal = TEnumTraits::FindLiteralByValue(value)) { + if (TEnumTraits::FindLiteralByValue(value)) { formatScalarValue(value); return; } @@ -106,7 +97,7 @@ void FormatEnum(TStringBuilderBase* builder, T value, bool lowerCase) } template -TString FormatEnum(T value, typename TEnumTraits::TType*) +TString FormatEnum(T value) { TStringBuilder builder; FormatEnum(&builder, value, /*lowerCase*/ true); diff --git a/library/cpp/yt/string/enum.h b/library/cpp/yt/string/enum.h index 10dc02610f7..caad6f20648 100644 --- a/library/cpp/yt/string/enum.h +++ b/library/cpp/yt/string/enum.h @@ -13,6 +13,9 @@ namespace NYT { TString DecodeEnumValue(TStringBuf value); TString EncodeEnumValue(TStringBuf value); +template +std::optional TryParseEnum(TStringBuf value); + template T ParseEnum(TStringBuf value); @@ -20,7 +23,7 @@ template void FormatEnum(TStringBuilderBase* builder, T value, bool lowerCase); template -TString FormatEnum(T value, typename TEnumTraits::TType* = nullptr); +TString FormatEnum(T value); //////////////////////////////////////////////////////////////////////////////// -- cgit v1.3