From cc7af2fcc1aa4eaec1c31066d3e9c0aaa6d7f05c Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 12 Jul 2024 18:31:06 +0800 Subject: [PATCH 1/3] add reflection lib --- include/ylt/reflection/member_count.hpp | 141 ++++ include/ylt/reflection/member_names.hpp | 174 +++++ include/ylt/reflection/member_ptr.hpp | 842 +++++++++++++++++++++ include/ylt/reflection/member_value.hpp | 200 +++++ include/ylt/reflection/template_string.hpp | 192 +++++ src/reflection/tests/CMakeLists.txt | 5 + src/reflection/tests/test_reflection.cpp | 174 +++++ 7 files changed, 1728 insertions(+) create mode 100644 include/ylt/reflection/member_count.hpp create mode 100644 include/ylt/reflection/member_names.hpp create mode 100644 include/ylt/reflection/member_ptr.hpp create mode 100644 include/ylt/reflection/member_value.hpp create mode 100644 include/ylt/reflection/template_string.hpp create mode 100644 src/reflection/tests/CMakeLists.txt create mode 100644 src/reflection/tests/test_reflection.cpp diff --git a/include/ylt/reflection/member_count.hpp b/include/ylt/reflection/member_count.hpp new file mode 100644 index 000000000..7f721052c --- /dev/null +++ b/include/ylt/reflection/member_count.hpp @@ -0,0 +1,141 @@ + +#pragma once +#include +#include +#include +#include + +namespace ylt::reflection { +namespace internal { +#if __cpp_concepts >= 201907L +template +concept tuple_size = requires(Type tuple) { + std::tuple_size>::value; +}; +#else +template +struct tuple_size_impl : std::false_type {}; + +template +struct tuple_size_impl< + T, std::void_t>::value)>> + : std::true_type {}; + +template +constexpr bool tuple_size = tuple_size_impl::value; +#endif + +#if __cpp_concepts >= 201907L +template +concept optional = requires(Type optional) { + optional.value(); + optional.has_value(); + optional.operator*(); + typename std::remove_cvref_t::value_type; +}; +#else +template +struct optional_impl : std::false_type {}; + +template +struct optional_impl().value()), + decltype(std::declval().has_value()), + decltype(std::declval().operator*()), + typename remove_cvref_t::value_type>> + : std::true_type {}; + +template +constexpr bool optional = !expected && optional_impl::value; +#endif + +template +struct compatible; + +template +constexpr inline bool is_compatible_v = false; + +template +constexpr inline bool is_compatible_v> = true; + +struct UniversalVectorType { + template + operator std::vector(); +}; + +struct UniversalType { + template + operator T(); +}; + +struct UniversalIntegralType { + template >> + operator T(); +}; + +struct UniversalNullptrType { + operator std::nullptr_t(); +}; + +struct UniversalOptionalType { + template >> + operator U(); +}; + +struct UniversalCompatibleType { + template >> + operator U(); +}; + +template +struct is_constructable_impl : std::false_type {}; +template +struct is_constructable_impl< + T, construct_param_t, + std::void_t, Args...> + : std::true_type {}; + +template +constexpr bool is_constructable = + is_constructable_impl::value; + +template +inline constexpr std::size_t members_count_impl() { + if constexpr (is_constructable) { + return members_count_impl(); + } + else if constexpr (is_constructable) { + return members_count_impl(); + } + else if constexpr (is_constructable) { + return members_count_impl(); + } + else if constexpr (is_constructable) { + return members_count_impl(); + } + else if constexpr (is_constructable) { + return members_count_impl(); + } + else if constexpr (is_constructable) { + return members_count_impl(); + } + else { + return sizeof...(Args); + } +} +} // namespace internal + +template +inline constexpr std::size_t members_count() { + using type = std::remove_cvref_t; + if constexpr (internal::tuple_size) { + return std::tuple_size::value; + } + else { + return internal::members_count_impl(); + } +} + +template +constexpr std::size_t members_count_v = members_count(); +} // namespace ylt::reflection \ No newline at end of file diff --git a/include/ylt/reflection/member_names.hpp b/include/ylt/reflection/member_names.hpp new file mode 100644 index 000000000..40ef25d42 --- /dev/null +++ b/include/ylt/reflection/member_names.hpp @@ -0,0 +1,174 @@ +#pragma once +#include +#include + +#include "template_string.hpp" +#if __has_include() || defined(__clang__) || defined(_MSC_VER) || \ + (defined(__GNUC__) && __GNUC__ > 10) +#include "member_ptr.hpp" + +namespace ylt::reflection { + +namespace internal { + +template +struct Wrapper { + using Type = T; + T v; +}; + +template +Wrapper(T) -> Wrapper; + +// This workaround is necessary for clang. +template +inline constexpr auto wrap(const T& arg) noexcept { + return Wrapper{arg}; +} + +template +inline constexpr std::string_view get_member_name() { +#if defined(_MSC_VER) + constexpr std::string_view func_name = __FUNCSIG__; +#else + constexpr std::string_view func_name = __PRETTY_FUNCTION__; +#endif + +#if defined(__clang__) + auto split = func_name.substr(0, func_name.size() - 2); + return split.substr(split.find_last_of(":.") + 1); +#elif defined(__GNUC__) + auto split = func_name.substr(0, func_name.size() - 2); + return split.substr(split.find_last_of(":") + 1); +#elif defined(_MSC_VER) + auto split = func_name.substr(0, func_name.size() - 7); + return split.substr(split.rfind("->") + 2); +#else + static_assert(false, + "You are using an unsupported compiler. Please use GCC, Clang " + "or MSVC or switch to the rfl::Field-syntax."); +#endif +} +} // namespace internal + +template +inline constexpr std::array> +get_member_names() { + constexpr size_t Count = members_count_v; + constexpr auto tp = struct_to_tuple(); + + std::array arr; + [&](std::index_sequence) mutable { + ((arr[Is] = internal::get_member_name(tp))>()), + ...); + } + (std::make_index_sequence{}); + return arr; +} + +template +inline constexpr auto tuple_to_variant(std::tuple) { + return std::variant...>{}; +} + +template +using struct_variant_t = decltype(tuple_to_variant( + std::declval>())>)); + +template +inline const auto& get_member_offset_arr() { + constexpr size_t Count = members_count_v; + constexpr auto tp = struct_to_tuple(); + + [[maybe_unused]] static std::array arr = {[&]( + std::index_sequence) mutable {std::array arr; + ((arr[Is] = size_t((const char*)std::get(tp) - + (char*)(&internal::wrapper::value))), + ...); + return arr; +} +(std::make_index_sequence{}) +}; // namespace ylt::reflection + +return arr; +} + +template +inline constexpr auto get_member_names_map() { + constexpr auto name_arr = get_member_names(); + return [&](std::index_sequence) mutable { + return frozen::unordered_map{ + {name_arr[Is], Is}...}; + } + (std::make_index_sequence{}); +} + +template +struct FixedString { + char data[N]; + template + constexpr FixedString(const char (&s)[N], std::index_sequence) + : data{s[I]...} {} + constexpr FixedString(const char (&s)[N]) + : FixedString(s, std::make_index_sequence()) {} + constexpr std::string_view str() const { + return std::string_view{data, N - 1}; + } +}; + +template +inline constexpr size_t index_of(std::string_view name) { + constexpr auto arr = get_member_names(); + for (size_t i = 0; i < arr.size(); i++) { + if (arr[i] == name) { + return i; + } + } + + return arr.size(); +} + +template +inline constexpr size_t index_of() { + return index_of(name.str()); +} + +template +inline constexpr std::string_view name_of() { + static_assert(index < members_count_v, "index out of range"); + constexpr auto arr = get_member_names(); + return arr[index]; +} + +template +inline constexpr std::string_view name_of(size_t index) { + constexpr auto arr = get_member_names(); + if (index >= arr.size()) { + return ""; + } + + return arr[index]; +} + +template +inline constexpr void for_each(Visit func) { + constexpr auto arr = get_member_names(); + [&](std::index_sequence) mutable { + if constexpr (std::is_invocable_v) { + (func(arr[Is], Is), ...); + } + else if constexpr (std::is_invocable_v) { + (func(arr[Is]), ...); + } + else { + static_assert(sizeof(Visit) < 0, + "invalid arguments, full arguments: [std::string_view, " + "size_t], at least has std::string_view and make sure keep " + "the order of arguments"); + } + } + (std::make_index_sequence{}); +} + +} // namespace ylt::reflection +#endif diff --git a/include/ylt/reflection/member_ptr.hpp b/include/ylt/reflection/member_ptr.hpp new file mode 100644 index 000000000..9208fa717 --- /dev/null +++ b/include/ylt/reflection/member_ptr.hpp @@ -0,0 +1,842 @@ +#pragma once +#include "member_count.hpp" + +#if __has_include() || defined(__clang__) || defined(_MSC_VER) || \ + (defined(__GNUC__) && __GNUC__ > 10) +// modify based on: +// https://github.com/getml/reflect-cpp/blob/main/include/rfl/internal/bind_fake_object_to_tuple.hpp +// thanks for alxn4's greate idea! +namespace ylt::reflection { +namespace internal { + +template +struct object_tuple_view_helper { + static constexpr auto tuple_view() { + static_assert( + sizeof(T) < 0, + "\n\nThis error occurs for one of two reasons:\n\n" + "1) You have created a struct with more than 100 fields, which is " + "unsupported. \n\n" + "2) Your struct is not an aggregate type.\n\n"); + } + + static constexpr auto tuple_view(T&) { + static_assert( + sizeof(T) < 0, + "\n\nThis error occurs for one of two reasons:\n\n" + "1) You have created a struct with more than 100 fields, which is " + "unsupported. \n\n" + "2) Your struct is not an aggregate type.\n\n"); + } +}; + +template +struct object_tuple_view_helper { + static constexpr auto tuple_view() { return std::tie(); } + static constexpr auto tuple_view(auto&) { return std::tie(); } +}; + +template +struct wrapper { + inline static T value; +}; + +template +inline consteval T& get_fake_object() noexcept { + return wrapper::value; +} + +#define RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( \ + n, ...) \ + template \ + struct object_tuple_view_helper { \ + static constexpr auto tuple_view() { \ + auto& [__VA_ARGS__] = get_fake_object>(); \ + auto ref_tup = std::tie(__VA_ARGS__); \ + auto get_ptrs = [](auto&... _refs) { \ + return std::make_tuple(&_refs...); \ + }; \ + return std::apply(get_ptrs, ref_tup); \ + } \ + static constexpr auto tuple_view(auto& t) { \ + auto& [__VA_ARGS__] = t; \ + return std::tie(__VA_ARGS__); \ + } \ + } + +/*The following boilerplate code was generated using a Python script: +macro = +"RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS" +with open("generated_code4.cpp", "w", encoding="utf-8") as codefile: + codefile.write( + "\n".join( + [ + f"{macro}({i}, {', '.join([f'f{j}' for j in range(i)])});" + for i in range(1, 129) + ] + ) + ) +*/ + +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS(1, + f0); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS(2, + f0, + f1); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS(3, + f0, + f1, + f2); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 4, f0, f1, f2, f3); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 5, f0, f1, f2, f3, f4); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 6, f0, f1, f2, f3, f4, f5); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 7, f0, f1, f2, f3, f4, f5, f6); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 8, f0, f1, f2, f3, f4, f5, f6, f7); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 9, f0, f1, f2, f3, f4, f5, f6, f7, f8); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 10, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 11, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 12, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 13, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 14, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 15, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 16, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 17, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 18, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 19, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 20, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 21, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 22, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 23, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 24, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 25, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 26, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 27, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 28, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 29, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 30, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 31, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 32, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 33, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 34, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 35, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 36, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 37, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 38, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 39, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 40, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 41, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 42, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 43, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 44, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 45, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 46, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 47, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 48, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 49, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 50, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 51, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 52, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 53, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 54, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 55, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 56, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 57, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 58, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 59, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 60, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 61, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 62, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 63, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 64, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 65, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 66, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 67, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 68, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 69, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 70, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 71, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 72, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 73, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 74, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 75, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 76, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 77, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 78, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 79, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 80, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 81, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 82, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 83, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 84, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 85, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 86, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 87, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 88, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 89, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 90, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 91, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 92, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 93, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 94, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 95, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 96, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 97, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 98, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 99, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 100, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 101, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 102, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 103, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 104, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 105, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 106, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 107, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 108, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 109, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 110, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 111, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 112, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 113, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 114, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 115, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 116, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 117, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 118, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 119, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 120, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 121, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 122, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120, f121); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 123, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120, f121, f122); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 124, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120, f121, f122, f123); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 125, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120, f121, f122, f123, f124); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 126, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120, f121, f122, f123, f124, f125); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 127, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120, f121, f122, f123, f124, f125, f126); +RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS( + 128, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30, + f31, f32, f33, f34, f35, f36, f37, f38, f39, f40, f41, f42, f43, f44, f45, + f46, f47, f48, f49, f50, f51, f52, f53, f54, f55, f56, f57, f58, f59, f60, + f61, f62, f63, f64, f65, f66, f67, f68, f69, f70, f71, f72, f73, f74, f75, + f76, f77, f78, f79, f80, f81, f82, f83, f84, f85, f86, f87, f88, f89, f90, + f91, f92, f93, f94, f95, f96, f97, f98, f99, f100, f101, f102, f103, f104, + f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, + f117, f118, f119, f120, f121, f122, f123, f124, f125, f126, f127); + +#undef RFL_INTERNAL_OBJECT_IF_YOU_SEE_AN_ERROR_REFER_TO_DOCUMENTATION_ON_C_ARRAYS + +template +inline constexpr auto tuple_view(T& t) { + return internal::object_tuple_view_helper>::tuple_view( + t); +} +} // namespace internal + +template +inline constexpr auto struct_to_tuple() { + return internal::object_tuple_view_helper>::tuple_view(); +} + +template +inline constexpr auto object_to_tuple(T& t) { + return internal::tuple_view(t); +} +} // namespace ylt::reflection +#endif diff --git a/include/ylt/reflection/member_value.hpp b/include/ylt/reflection/member_value.hpp new file mode 100644 index 000000000..00a4d698b --- /dev/null +++ b/include/ylt/reflection/member_value.hpp @@ -0,0 +1,200 @@ +#pragma once +#include +#include +#include +#include + +#include "template_string.hpp" + +#if __has_include() || defined(__clang__) || defined(_MSC_VER) || \ + (defined(__GNUC__) && __GNUC__ > 10) +#include "member_names.hpp" + +namespace ylt::reflection { + +namespace internal { +template +inline void set_member_ptr(Member& member, T t) { + if constexpr (std::is_constructible_v) { + member = t; + } + else { + std::string str = "given type: "; + str.append(iguana::type_string>()); + str.append(" is not equal with real type: ") + .append(iguana::type_string>()); + throw std::invalid_argument(str); + } +} + +template +struct is_variant : std::false_type {}; + +template +struct is_variant> : std::true_type {}; + +template +inline bool tuple_switch(Member& member, std::size_t i, Tuple& t, + std::index_sequence) { + if constexpr (is_variant::value) { + return (((i == Is) && + ((member = Member{std::in_place_index, &std::get(t)}), + true)) || + ...); + } + else { + return (((i == Is) && ((set_member_ptr(member, &std::get(t))), true)) || + ...); + } +} +} // namespace internal + +template +inline Member& get(T& t, size_t index) { + auto ref_tp = object_to_tuple(t); + constexpr size_t tuple_size = std::tuple_size_v; + + if (index >= tuple_size) { + std::string str = "index out of range, "; + str.append("index: ") + .append(std::to_string(index)) + .append(" is greater equal than member count ") + .append(std::to_string(tuple_size)); + throw std::out_of_range(str); + } + Member* member_ptr = nullptr; + internal::tuple_switch(member_ptr, index, ref_tp, + std::make_index_sequence{}); + if (member_ptr == nullptr) { + throw std::invalid_argument( + "given member type is not match the real member type"); + } + return *member_ptr; +} + +template +inline Member& get(T& t, std::string_view name) { + static constexpr auto map = get_member_names_map(); + size_t index = map.at(name); // may throw out_of_range: unknown key. + auto ref_tp = object_to_tuple(t); + + Member* member_ptr = nullptr; + internal::tuple_switch(member_ptr, index, ref_tp, + std::make_index_sequence{}); + if (member_ptr == nullptr) { + throw std::invalid_argument( + "given member type is not match the real member type"); + } + return *member_ptr; +} + +template +inline auto get(T& t, size_t index) { + auto ref_tp = object_to_tuple(t); + constexpr size_t tuple_size = std::tuple_size_v; + if (index >= tuple_size) { + std::string str = "index out of range, "; + str.append("index: ") + .append(std::to_string(index)) + .append(" is greater equal than member count ") + .append(std::to_string(tuple_size)); + throw std::out_of_range(str); + } + + using variant = decltype(tuple_to_variant(ref_tp)); + variant member_ptr; + internal::tuple_switch(member_ptr, index, ref_tp, + std::make_index_sequence{}); + return member_ptr; +} + +template +inline auto get(T& t, std::string_view name) { + static constexpr auto map = get_member_names_map(); + size_t index = map.at(name); // may throw out_of_range: unknown key. + return get(t, index); +} + +template +inline auto& get(T& t) { + auto ref_tp = object_to_tuple(t); + + static_assert(index < std::tuple_size_v, + "index out of range"); + + return std::get(ref_tp); +} + +template +inline auto& get(T& t) { + constexpr size_t index = index_of(); + return get(t); +} + +template +inline bool check_value(T value, U field_value) { + if constexpr (std::is_same_v) { + return value == field_value; + } + else { + return false; + } +} + +template +inline size_t index_of(T& t, Field& value) { + const auto& offset_arr = get_member_offset_arr(); + size_t cur_offset = (const char*)(&value) - (const char*)(&t); + auto it = std::lower_bound(offset_arr.begin(), offset_arr.end(), cur_offset); + if (it == offset_arr.end()) { + return offset_arr.size(); + } + + return std::distance(offset_arr.begin(), it); +} + +template +inline std::string_view name_of(T& t, Field& value) { + size_t index = index_of(t, value); + constexpr auto arr = get_member_names(); + if (index == arr.size()) { + return ""; + } + + return arr[index]; +} + +template +inline void for_each(T& t, Visit func) { + auto ref_tp = object_to_tuple(t); + constexpr size_t tuple_size = std::tuple_size_v; + constexpr auto arr = get_member_names(); + [&](std::index_sequence) mutable { + if constexpr (std::is_invocable_v(ref_tp))>) { + (func(std::get(ref_tp)), ...); + } + else if constexpr (std::is_invocable_v(ref_tp)), + std::string_view>) { + (func(std::get(ref_tp), arr[Is]), ...); + } + else if constexpr (std::is_invocable_v(ref_tp)), + std::string_view, size_t>) { + (func(std::get(ref_tp), arr[Is], Is), ...); + } + else { + static_assert(sizeof(Visit) < 0, + "invalid arguments, full arguments: [field_value&, " + "std::string_view, size_t], at least has field_value and " + "make sure keep the order of arguments"); + } + } + (std::make_index_sequence{}); +} + +} // namespace ylt::reflection + +template +inline constexpr auto operator""_ylts() { + return s; +} +#endif diff --git a/include/ylt/reflection/template_string.hpp b/include/ylt/reflection/template_string.hpp new file mode 100644 index 000000000..dc159b8c6 --- /dev/null +++ b/include/ylt/reflection/template_string.hpp @@ -0,0 +1,192 @@ +#pragma once +#include +#include + +#include "frozen/string.h" +#include "frozen/unordered_map.h" + +namespace iguana { + +#if defined(__clang__) || defined(_MSC_VER) || \ + (defined(__GNUC__) && __GNUC__ > 8) + +template +constexpr std::string_view get_raw_name() { +#ifdef _MSC_VER + return __FUNCSIG__; +#else + return __PRETTY_FUNCTION__; +#endif +} + +template +constexpr std::string_view get_raw_name() { +#ifdef _MSC_VER + return __FUNCSIG__; +#else + return __PRETTY_FUNCTION__; +#endif +} + +template +inline constexpr std::string_view type_string() { + constexpr std::string_view sample = get_raw_name(); + constexpr size_t pos = sample.find("int"); + constexpr std::string_view str = get_raw_name(); + constexpr auto next1 = str.rfind(sample[pos + 3]); +#if defined(_MSC_VER) + constexpr std::size_t npos = str.find_first_of(" ", pos); + if (npos != std::string_view::npos) + return str.substr(npos + 1, next1 - npos - 1); + else + return str.substr(pos, next1 - pos); +#else + return str.substr(pos, next1 - pos); +#endif +} + +template +inline constexpr std::string_view enum_string() { + constexpr std::string_view sample = get_raw_name(); + constexpr size_t pos = sample.find("int"); + constexpr std::string_view str = get_raw_name(); + constexpr auto next1 = str.rfind(sample[pos + 3]); +#if defined(__clang__) || defined(_MSC_VER) + constexpr auto s1 = str.substr(pos, next1 - pos); +#else + constexpr auto s1 = str.substr(pos + 5, next1 - pos - 5); +#endif + return s1; +} + +template +inline constexpr std::string_view field_string() { + constexpr std::string_view raw_name = enum_string(); + return raw_name.substr(raw_name.rfind(":") + 1); +} + +#if defined(__clang__) && (__clang_major__ >= 17) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wenum-constexpr-conversion" +#endif + +template +constexpr std::string_view get_raw_name_with_v() { +#ifdef _MSC_VER + return __FUNCSIG__; +#else + return __PRETTY_FUNCTION__; +#endif +} + +// True means the V is a valid enum value, and the second of the result is the +// name +template +constexpr std::pair try_get_enum_name() { + constexpr std::string_view sample_raw_name = get_raw_name_with_v(); + constexpr size_t pos = sample_raw_name.find("5"); + constexpr std::string_view enum_raw_name = get_raw_name_with_v(); + constexpr auto enum_end = enum_raw_name.rfind(&sample_raw_name[pos + 1]); +#ifdef _MSC_VER + constexpr auto enum_begin = enum_raw_name.rfind(',', enum_end) + 1; +#else + constexpr auto enum_begin = enum_raw_name.rfind(' ', enum_end) + 1; +#endif + constexpr std::string_view res = + enum_raw_name.substr(enum_begin, enum_end - enum_begin); + + constexpr size_t pos_brackets = res.find(')'); + + size_t pos_colon = res.find("::"); + return {pos_brackets == std::string_view::npos, + res.substr(pos_colon == std::string_view::npos ? 0 : pos_colon + 2)}; +} + +// Enumerate the numbers in a integer sequence to see if they are legal enum +// value +template +constexpr inline auto get_enum_arr( + const std::integer_sequence &) { + constexpr std::size_t N = sizeof...(Is); + std::array enum_names = {}; + std::array enum_values = {}; + std::size_t num = 0; + (([&]() { + constexpr auto res = try_get_enum_name(Is)>(); + if constexpr (res.first) { + // the Is is a valid enum value + enum_names[num] = res.second; + enum_values[num] = static_cast(Is); + ++num; + } + })(), + ...); + return std::make_tuple(num, enum_values, enum_names); +} + +template &arr, size_t... Is> +constexpr auto array_to_seq(const std::index_sequence &) { + return std::integer_sequence(); +} + +// convert array to map +template +constexpr inline auto get_enum_to_str_map( + const std::array &enum_names, + const std::array &enum_values, const std::index_sequence &) { + return frozen::unordered_map{ + {enum_values[Is], enum_names[Is]}...}; +} + +template +constexpr inline auto get_str_to_enum_map( + const std::array &enum_names, + const std::array &enum_values, const std::index_sequence &) { + return frozen::unordered_map{ + {enum_names[Is], enum_values[Is]}...}; +} + +#endif + +// the default generic enum_value +// if the user has not defined a specialization template, this will be called +template +struct enum_value { + constexpr static std::array value = {}; +}; + +template +constexpr inline auto get_enum_map() { +#if defined(__clang__) || defined(_MSC_VER) || \ + (defined(__GNUC__) && __GNUC__ > 8) + constexpr auto &arr = enum_value::value; + constexpr auto arr_size = arr.size(); + if constexpr (arr_size > 0) { + // the user has defined a specialization template + constexpr auto arr_seq = + array_to_seq(std::make_index_sequence()); + constexpr auto t = get_enum_arr(arr_seq); + if constexpr (str_to_enum) { + return get_str_to_enum_map( + std::get<2>(t), std::get<1>(t), + std::make_index_sequence(t)>{}); + } + else { + return get_enum_to_str_map( + std::get<2>(t), std::get<1>(t), + std::make_index_sequence(t)>{}); + } + } + else { + return false; + } +#else + return false; +#endif +} + +#if defined(__clang__) && (__clang_major__ >= 17) +#pragma clang diagnostic pop +#endif + +} // namespace iguana \ No newline at end of file diff --git a/src/reflection/tests/CMakeLists.txt b/src/reflection/tests/CMakeLists.txt new file mode 100644 index 000000000..14fecda6f --- /dev/null +++ b/src/reflection/tests/CMakeLists.txt @@ -0,0 +1,5 @@ +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/tests) +add_executable(reflection_test + test_reflection.cpp + ) +add_test(NAME reflection_test COMMAND reflection_test) diff --git a/src/reflection/tests/test_reflection.cpp b/src/reflection/tests/test_reflection.cpp new file mode 100644 index 000000000..ecce135c7 --- /dev/null +++ b/src/reflection/tests/test_reflection.cpp @@ -0,0 +1,174 @@ +#include +#include + +#include "ylt/reflection/member_names.hpp" +#include "ylt/reflection/member_value.hpp" + +#define DOCTEST_CONFIG_IMPLEMENT +#include "doctest.h" + +#if __has_include() || defined(__clang__) || defined(_MSC_VER) || \ + (defined(__GNUC__) && __GNUC__ > 10) + +using namespace ylt::reflection; + +struct sub { + int id; +}; + +enum class Color { red, black }; + +struct person { + Color color; + int id; + sub s; + std::string str; + int arr[2]; +}; + +TEST_CASE("test member names") { + constexpr size_t size = members_count_v; + CHECK(size == 5); + constexpr auto tp = struct_to_tuple(); + constexpr size_t tp_size = std::tuple_size_v; + CHECK(tp_size == 5); + + constexpr auto arr = get_member_names(); + for (auto name : arr) { + std::cout << name << ", "; + } + std::cout << "\n"; + CHECK(arr == + std::array{"color", "id", "s", "str", "arr"}); +} + +struct simple { + int color; + int id; + std::string str; + int age; +}; + +void test_pointer() { + simple t{}; + auto&& [a, b, c, d] = t; + size_t offset1 = (const char*)(&a) - (const char*)(&t); + size_t offset2 = (const char*)(&b) - (const char*)(&t); + size_t offset3 = (const char*)(&c) - (const char*)(&t); + size_t offset4 = (const char*)(&d) - (const char*)(&t); + + const auto& offset_arr = get_member_offset_arr(); + CHECK(offset_arr[0] == offset1); + CHECK(offset_arr[1] == offset2); + CHECK(offset_arr[2] == offset3); + CHECK(offset_arr[3] == offset4); +} + +TEST_CASE("test member pointer and offset") { test_pointer(); } + +TEST_CASE("test member value") { + simple p{.color = 2, .id = 10, .str = "hello reflection", .age = 6}; + auto ref_tp = object_to_tuple(p); + constexpr auto arr = get_member_names(); + std::stringstream out; + [&](std::index_sequence) { + ((out << "name: " << arr[Is] << ", value: " << std::get(ref_tp) + << "\n"), + ...); + } + (std::make_index_sequence{}); + + std::string result = out.str(); + std::cout << out.str(); + + std::string expected_str = + "name: color, value: 2\nname: id, value: 10\nname: str, value: hello " + "reflection\nname: age, value: 6\n"; + CHECK(result == expected_str); + + constexpr auto map = get_member_names_map(); + constexpr size_t index = map.at("age"); + CHECK(index == 3); + auto age = std::get(ref_tp); + CHECK(age == 6); + + auto& age1 = get(p, "age"); + CHECK(age1 == 6); + + auto& age2 = get<"age"_ylts>(p); + CHECK(age2 == 6); + + auto& var1 = get<"str"_ylts>(p); + CHECK(var1 == "hello reflection"); + + auto age3 = get(p, 3); + CHECK(age3 == 6); + + auto str2 = get<2>(p); + CHECK(str2 == "hello reflection"); + + auto var = get(p, 3); + CHECK(*std::get<3>(var) == 6); + + auto var2 = get(p, "str"); + CHECK(*std::get<2>(var2) == "hello reflection"); + std::visit( + [](auto ptr) { + std::cout << *ptr << "\n"; + }, + var2); + + for_each(p, [](auto& field) { + std::cout << field << "\n"; + }); + + for_each(p, [](auto& field, auto name, auto index) { + std::cout << field << ", " << name << ", " << index << "\n"; + }); + + for_each(p, [](auto& field, auto name) { + std::cout << field << ", " << name << "\n"; + }); + + for_each([](std::string_view field_name, size_t index) { + std::cout << index << ", " << field_name << "\n"; + }); + + for_each([](std::string_view field_name) { + std::cout << index << ", " << field_name << "\n"; + }); + + constexpr std::string_view name1 = name_of(); + CHECK(name1 == "str"); + + constexpr std::string_view name2 = name_of(2); + CHECK(name2 == "str"); + + constexpr size_t idx = index_of(); + CHECK(idx == 2); + + constexpr size_t idx1 = index_of("str"); + CHECK(idx1 == 2); + + constexpr size_t idx2 = index_of(); + CHECK(idx2 == 4); + + size_t idx3 = index_of("no_such"); + CHECK(idx3 == 4); + + size_t idx4 = index_of(p, age1); + CHECK(idx4 == 3); + + auto name3 = name_of(p, age1); + CHECK(name3 == "age"); + + int no_such = 100; + size_t idx5 = index_of(p, no_such); + CHECK(idx5 == 4); +} + +#endif + +DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4007) +int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); } +DOCTEST_MSVC_SUPPRESS_WARNING_POP From 4a351db4447613c11b1dd5de49decaf5a1443633 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 12 Jul 2024 21:22:16 +0800 Subject: [PATCH 2/3] for gcc --- include/ylt/reflection/member_names.hpp | 2 +- src/reflection/tests/test_reflection.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/ylt/reflection/member_names.hpp b/include/ylt/reflection/member_names.hpp index 40ef25d42..97e5524b2 100644 --- a/include/ylt/reflection/member_names.hpp +++ b/include/ylt/reflection/member_names.hpp @@ -38,7 +38,7 @@ inline constexpr std::string_view get_member_name() { auto split = func_name.substr(0, func_name.size() - 2); return split.substr(split.find_last_of(":.") + 1); #elif defined(__GNUC__) - auto split = func_name.substr(0, func_name.size() - 2); + auto split = func_name.substr(0, func_name.rfind(")}")); return split.substr(split.find_last_of(":") + 1); #elif defined(_MSC_VER) auto split = func_name.substr(0, func_name.size() - 7); diff --git a/src/reflection/tests/test_reflection.cpp b/src/reflection/tests/test_reflection.cpp index ecce135c7..334e5196d 100644 --- a/src/reflection/tests/test_reflection.cpp +++ b/src/reflection/tests/test_reflection.cpp @@ -135,7 +135,7 @@ TEST_CASE("test member value") { }); for_each([](std::string_view field_name) { - std::cout << index << ", " << field_name << "\n"; + std::cout << field_name << "\n"; }); constexpr std::string_view name1 = name_of(); From c2c9e879cf0d3e421ec88ee2ae3669837d5d67f1 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Fri, 12 Jul 2024 22:07:38 +0800 Subject: [PATCH 3/3] for msvc --- NOTICE | 2 +- include/ylt/reflection/member_names.hpp | 2 +- include/ylt/reflection/member_ptr.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NOTICE b/NOTICE index 9231e0d4b..a8db0da71 100644 --- a/NOTICE +++ b/NOTICE @@ -28,5 +28,5 @@ Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at ) =================================================================== -The reflection of a struct and data format borrow various ideas from zpp_bits and msgpack. +The reflection of a struct and data format borrow various ideas from zpp_bits, reflect-cpp and msgpack. coro_rpc borrow various ideas from rest_rpc. diff --git a/include/ylt/reflection/member_names.hpp b/include/ylt/reflection/member_names.hpp index 97e5524b2..de106f03e 100644 --- a/include/ylt/reflection/member_names.hpp +++ b/include/ylt/reflection/member_names.hpp @@ -41,7 +41,7 @@ inline constexpr std::string_view get_member_name() { auto split = func_name.substr(0, func_name.rfind(")}")); return split.substr(split.find_last_of(":") + 1); #elif defined(_MSC_VER) - auto split = func_name.substr(0, func_name.size() - 7); + auto split = func_name.substr(0, func_name.rfind("}>")); return split.substr(split.rfind("->") + 2); #else static_assert(false, diff --git a/include/ylt/reflection/member_ptr.hpp b/include/ylt/reflection/member_ptr.hpp index 9208fa717..f0e587b20 100644 --- a/include/ylt/reflection/member_ptr.hpp +++ b/include/ylt/reflection/member_ptr.hpp @@ -42,7 +42,7 @@ struct wrapper { }; template -inline consteval T& get_fake_object() noexcept { +inline constexpr T& get_fake_object() noexcept { return wrapper::value; }