aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorkmokrov <kmokrov@yandex-team.com>2023-10-17 11:20:12 +0300
committerkmokrov <kmokrov@yandex-team.com>2023-10-17 12:14:22 +0300
commita74d8d38bfdad3260f263cbccf768589e16acfbb (patch)
tree17c5821a519ae5c760df3c40e9bbd0edcf87812e /library/cpp
parentcf8a166dfde05806be6e1881e52f38757b70fbb0 (diff)
downloadydb-a74d8d38bfdad3260f263cbccf768589e16acfbb.tar.gz
YTORM-214: Add parsing enum from yson integer
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/yt/misc/cast-inl.h26
1 files changed, 21 insertions, 5 deletions
diff --git a/library/cpp/yt/misc/cast-inl.h b/library/cpp/yt/misc/cast-inl.h
index a8b34c8af3..71049a4748 100644
--- a/library/cpp/yt/misc/cast-inl.h
+++ b/library/cpp/yt/misc/cast-inl.h
@@ -7,6 +7,7 @@
#include <util/string/cast.h>
#include <util/string/printf.h>
+#include <concepts>
#include <type_traits>
namespace NYT {
@@ -16,29 +17,40 @@ namespace NYT {
namespace NDetail {
template <class T, class S>
-typename std::enable_if<std::is_signed<T>::value && std::is_signed<S>::value, bool>::type IsInIntegralRange(S value)
+bool IsInIntegralRange(S value)
+ requires std::is_signed_v<T> && std::is_signed_v<S>
{
return value >= std::numeric_limits<T>::min() && value <= std::numeric_limits<T>::max();
}
template <class T, class S>
-static typename std::enable_if<std::is_signed<T>::value && std::is_unsigned<S>::value, bool>::type IsInIntegralRange(S value)
+bool IsInIntegralRange(S value)
+ requires std::is_signed_v<T> && std::is_unsigned_v<S>
{
return value <= static_cast<typename std::make_unsigned<T>::type>(std::numeric_limits<T>::max());
}
template <class T, class S>
-static typename std::enable_if<std::is_unsigned<T>::value && std::is_signed<S>::value, bool>::type IsInIntegralRange(S value)
+bool IsInIntegralRange(S value)
+ requires std::is_unsigned_v<T> && std::is_signed_v<S>
{
return value >= 0 && static_cast<typename std::make_unsigned<S>::type>(value) <= std::numeric_limits<T>::max();
}
template <class T, class S>
-typename std::enable_if<std::is_unsigned<T>::value && std::is_unsigned<S>::value, bool>::type IsInIntegralRange(S value)
+bool IsInIntegralRange(S value)
+ requires std::is_unsigned_v<T> && std::is_unsigned_v<S>
{
return value <= std::numeric_limits<T>::max();
}
+template <class T, class S>
+bool IsInIntegralRange(S value)
+ requires std::is_enum_v<S>
+{
+ return IsInIntegralRange<T>(static_cast<std::underlying_type_t<S>>(value));
+}
+
template <class T>
TString FormatInvalidCastValue(T value)
{
@@ -88,7 +100,11 @@ T CheckedIntegralCast(S value)
template <class T, class S>
bool TryEnumCast(S value, T* result)
{
- auto candidate = static_cast<T>(value);
+ std::underlying_type_t<T> underlying;
+ if (!TryIntegralCast<std::underlying_type_t<T>>(value, &underlying)) {
+ return false;
+ }
+ auto candidate = static_cast<T>(underlying);
if (!TEnumTraits<T>::FindLiteralByValue(candidate)) {
return false;
}