aboutsummaryrefslogtreecommitdiffstats
path: root/tools/enum_parser/enum_serialization_runtime/dispatch_methods.h
diff options
context:
space:
mode:
authorarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-06-01 15:35:19 +0300
committerarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-06-01 15:35:19 +0300
commit8e7094c87fa7ad049e6ea600a5f90f1c97d683bd (patch)
treed3e66d7ea5843080db0f65be0b7752538f69a84b /tools/enum_parser/enum_serialization_runtime/dispatch_methods.h
parente13a5fc9fa49c7a6508a49f29e21a15fd9dac9ec (diff)
downloadydb-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.h57
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);
+ }
+ }
+}