diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-06-01 15:35:19 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-06-01 15:35:19 +0300 |
commit | 8e7094c87fa7ad049e6ea600a5f90f1c97d683bd (patch) | |
tree | d3e66d7ea5843080db0f65be0b7752538f69a84b /tools/enum_parser/enum_serialization_runtime/dispatch_methods.h | |
parent | e13a5fc9fa49c7a6508a49f29e21a15fd9dac9ec (diff) | |
download | ydb-8e7094c87fa7ad049e6ea600a5f90f1c97d683bd.tar.gz |
intermediate changes
ref:b1e863e3aa12b888b40dd5ec36411ca050a25bd8
Diffstat (limited to 'tools/enum_parser/enum_serialization_runtime/dispatch_methods.h')
-rw-r--r-- | tools/enum_parser/enum_serialization_runtime/dispatch_methods.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/tools/enum_parser/enum_serialization_runtime/dispatch_methods.h b/tools/enum_parser/enum_serialization_runtime/dispatch_methods.h new file mode 100644 index 0000000000..db752ae710 --- /dev/null +++ b/tools/enum_parser/enum_serialization_runtime/dispatch_methods.h @@ -0,0 +1,57 @@ +#pragma once + +#include "ordered_pairs.h" + +#include <util/generic/strbuf.h> +#include <util/stream/fwd.h> + +namespace NEnumSerializationRuntime { + // compile-time conversion method selection + + constexpr size_t LINEAR_SEARCH_KEYS_SIZE_THRESHOLD = 6; + constexpr size_t LINEAR_SEARCH_VALUES_SIZE_THRESHOLD = 2; + + template <class TNameBufs, typename EEnum> + inline void DispatchOutFn(IOutputStream& os, EEnum n) { + constexpr auto order = TNameBufs::NamesOrder; + if constexpr (order >= ::NEnumSerializationRuntime::ESortOrder::DirectMapping) { + return TNameBufs::OutDirect(&os, n, TNameBufs::EnumInitializationData); + } else if constexpr (std::size(TNameBufs::EnumInitializationData.NamesInitializer) <= LINEAR_SEARCH_KEYS_SIZE_THRESHOLD) { + return TNameBufs::OutFullScan(&os, n, TNameBufs::EnumInitializationData); + } else if constexpr (order >= ::NEnumSerializationRuntime::ESortOrder::Ascending) { + return TNameBufs::OutSorted(&os, n, TNameBufs::EnumInitializationData); + } else { + const TNameBufs& names = TNameBufs::Instance(); + return names.Out(&os, n); + } + } + + template <class TNameBufs, typename EEnum> + inline EEnum DispatchFromStringImplFn(const char* data, size_t len) { + const TStringBuf name{data, len}; + constexpr auto order = TNameBufs::ValuesOrder; + static_assert(order >= ::NEnumSerializationRuntime::ESortOrder::Ascending, "enum_parser produced unsorted output"); // comment this line to use run-time sort for temporary workaround + if constexpr (std::size(TNameBufs::EnumInitializationData.ValuesInitializer) <= LINEAR_SEARCH_VALUES_SIZE_THRESHOLD) { + return TNameBufs::FromStringFullScan(name, TNameBufs::EnumInitializationData); + } else if constexpr (order >= ::NEnumSerializationRuntime::ESortOrder::Ascending) { + return TNameBufs::FromStringSorted(name, TNameBufs::EnumInitializationData); + } else { + const TNameBufs& names = TNameBufs::Instance(); + return names.FromString(name); + } + } + + template <class TNameBufs, typename EEnum> + inline bool DispatchTryFromStringImplFn(const char* data, size_t len, EEnum& result) { + const TStringBuf name{data, len}; + constexpr auto order = TNameBufs::ValuesOrder; + if constexpr (std::size(TNameBufs::EnumInitializationData.ValuesInitializer) <= LINEAR_SEARCH_VALUES_SIZE_THRESHOLD) { + return TNameBufs::TryFromStringFullScan(name, result, TNameBufs::EnumInitializationData); + } else if constexpr (order >= ::NEnumSerializationRuntime::ESortOrder::Ascending) { + return TNameBufs::TryFromStringSorted(name, result, TNameBufs::EnumInitializationData); + } else { + const TNameBufs& names = TNameBufs::Instance(); + return names.FromString(name, result); + } + } +} |