Browse Source

intermediate changes
ref:ad3e40ce3a5041543013ca38b5b55ef688f0d8f7

arcadia-devtools 2 years ago
parent
commit
cc2baf0174

+ 10 - 10
build/platform/test_tool/host.ya.make.inc

@@ -1,16 +1,16 @@
 IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133394941)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133417405)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371849)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369279)
 ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133393969)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133416393)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371250)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369156)
 ELSEIF (HOST_OS_LINUX AND HOST_ARCH_PPC64LE)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133394370)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133416947)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371357)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369226)
 ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133395543)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133417897)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204372158)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369350)
 ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133393521)
-    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133416003)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371182)
+    DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204368989)
 ENDIF()

+ 24 - 0
tools/enum_parser/enum_serialization_runtime/README.md

@@ -1,2 +1,26 @@
+# Enum serialization runtime support library
+
+{% note warning %}
+
 This library should not be used or referred directly.
 Use `GENERATE_ENUM_SERIALIZATION_WITH_HEADER` and `GENERATE_ENUM_SERIALIZATION` macros instead.
+
+{% endnote %}
+
+## Implementation details
+
+### Code bloat
+
+Использование шаблонов вида `TVector<EEnum>`, `std::array<EEnum>` или `TMap<EEnum, TStringBuf>`, а также алгоритмов поверх них, приводит к значительному разбуханию коде. Так как компилятор для разных перечислений вынужден генерировать разные специализации, даже если они компилируются в идентичный машинный код.
+Можно во многом выиграть если хранить не массив из `EEnum`, а массив из `std::underlying_type_t<EEnum>` (или из `TSelectEnumRepresentationType<EEnum>::TType`).
+Ведь различных типов-перечислений намного больше, чем целочисленных типов, на которых они базируются (и тем более больше, чем различных `TSelectEnumRepresentationType::TType`, коих всего четыре).
+И когда компилятор встречает вызов `std::lower_bound`, то для двух массивов из двух перечислений `enum A: int {}` и `enum B: int{}` он создаст две специализации, а если использовать целочисленные типы — то только одну.
+Всё это позволяет вынести вызовы вроде `std::lower_bound` в универсальные и переиспользуемые функции, принимающие например `(TArrayRef<const int> values, int enumValue)` своими аргументами.
+За счёт этого код
+ 1) быстрее компилируется,
+ 2) результат получается более компактным,
+ 3) как следствие, он меньше засоряет во время исполнения кеш инструкций процессора одинаковыми или очень похожими специализациями функций.
+
+
+Преобразование между `enum` и `int` выносится в пользовательский код (в шаблонные `inline` функции), и производится только в момент непосредственного использования (первым действием в семействе функций `ToString`, последним действием в семуйстве функций `FromString`), где оптимизирующий компилятор обычно может заменить их на no-op или на простые операции со значениями в регистрах.
+А контейнеры вида `TVector<EEnum>` и `TMap<EEnum, ...>`, которые возвращаются из функций `util/generic/serialized_enum.h`, заменяются на специальные классы `TArrayView` и `TMappedDictView`. Они также поддерживают быстрое и преобразование из перечислений в целочисленные типы и обратно  в момент использования, и не требуют создавать специализации для каждого из возможных типов-перечислений.