diff options
author | Maxim Yurchuk <maxim-yurchuk@ydb.tech> | 2024-11-20 17:37:57 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-20 17:37:57 +0000 |
commit | f76323e9b295c15751e51e3443aa47a36bee8023 (patch) | |
tree | 4113c8cad473a33e0f746966e0cf087252fa1d7a /library/cpp/yt/misc/cast-inl.h | |
parent | 753ecb8d410a4cb459c26f3a0082fb2d1724fe63 (diff) | |
parent | a7b9a6afea2a9d7a7bfac4c5eb4c1a8e60adb9e6 (diff) | |
download | ydb-f76323e9b295c15751e51e3443aa47a36bee8023.tar.gz |
Merge pull request #11788 from ydb-platform/mergelibs-241120-1113
Library import 241120-1113
Diffstat (limited to 'library/cpp/yt/misc/cast-inl.h')
-rw-r--r-- | library/cpp/yt/misc/cast-inl.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/library/cpp/yt/misc/cast-inl.h b/library/cpp/yt/misc/cast-inl.h index 50920f0193..5e5a0d90ee 100644 --- a/library/cpp/yt/misc/cast-inl.h +++ b/library/cpp/yt/misc/cast-inl.h @@ -119,7 +119,7 @@ T CheckedIntegralCast(S value) template <class T, class S> requires TEnumTraits<T>::IsEnum -constexpr std::optional<T> TryCheckedEnumCast(S value) +constexpr std::optional<T> TryCheckedEnumCast(S value, bool enableUnknown) { auto underlying = TryCheckedIntegralCast<std::underlying_type_t<T>>(value); [[unlikely]] if (!underlying) { @@ -127,6 +127,15 @@ constexpr std::optional<T> TryCheckedEnumCast(S value) } auto candidate = static_cast<T>(*underlying); [[unlikely]] if (!TEnumTraits<T>::IsValidValue(candidate)) { + if (enableUnknown) { + if constexpr (constexpr auto optionalUnknownValue = TEnumTraits<T>::TryGetUnknownValue()) { + if constexpr (TEnumTraits<T>::IsBitEnum) { + return static_cast<T>(*underlying & ToUnderlying(TEnumTraits<T>::GetAllSetValue())) | *optionalUnknownValue; + } else { + return *optionalUnknownValue; + } + } + } return std::nullopt; } return candidate; @@ -136,7 +145,7 @@ template <class T, class S> requires TEnumTraits<T>::IsEnum T CheckedEnumCast(S value) { - auto result = TryCheckedEnumCast<T>(value); + auto result = TryCheckedEnumCast<T>(value, /*enableUnknown*/ true); [[unlikely]] if (!result) { if constexpr (std::is_signed_v<S>) { throw TSimpleException(Sprintf("Error casting %s value \"%" PRIi64 "\" to enum %s", |