Skip to content

Commit

Permalink
fix msvc
Browse files Browse the repository at this point in the history
  • Loading branch information
poor-circle committed Jul 24, 2023
1 parent b225687 commit d6f2a61
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 98 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@ include(cmake/install.cmake)
include(cmake/config.cmake)
# add project's source such as unit test, example & benchmark
include(cmake/subdir.cmake)

include(cmake/platform.cmake)

15 changes: 15 additions & 0 deletions cmake/platform.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# --------------------- Gcc
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines")
#-ftree-slp-vectorize with coroutine cause link error. disable it util gcc fix.
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-tree-slp-vectorize")
endif()
# --------------------- Clang

# --------------------- Msvc
# Resolves C1128 complained by MSVC: number of sections exceeded object file format limit: compile with /bigobj.
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/bigobj>")
# Resolves C4737 complained by MSVC: C4737: Unable to perform required tail call. Performance may be degraded. "Release-Type only"
if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/EHa>")
endif()
193 changes: 98 additions & 95 deletions include/ylt/struct_pack/reflection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ namespace detail {
};

template <typename Type>
concept user_defined_refl = requires {STRUCT_PACK_GET_0(std::declval<Type&>());};
concept user_defined_refl = std::is_same_v<decltype(STRUCT_PACK_REFL_FLAG(std::declval<Type&>())),Type&>;

template <typename Type>
concept tuple_size = requires(Type tuple) {
Expand Down Expand Up @@ -1687,14 +1687,16 @@ namespace detail {
} // namespace detail
} // namespace struct_pack

#define STRUCT_PACK_ARG_COUNT(...) STRUCT_PACK_INTERNAL_ARG_COUNT(0, ##__VA_ARGS__,\

#define STRUCT_PACK_ARG_COUNT(...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_INTERNAL_ARG_COUNT(0, ##__VA_ARGS__,\
64, 63, 62, 61, 60, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
9, 8, 7, 6, 5, 4, 3, 2, 1, 0))

#define STRUCT_PACK_INTERNAL_ARG_COUNT(\
_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \
_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \
Expand All @@ -1705,77 +1707,78 @@ namespace detail {
_60, _61, _62, _63, _64, N, ...) N

#define STRUCT_PACK_CONCAT_(l, r) l ## r

#define STRUCT_PACK_CONCAT(l, r) STRUCT_PACK_CONCAT_(l, r)

#define STRUCT_PACK_MARCO_EXPAND(...) __VA_ARGS__

#define STRUCT_PACK_DOARG0(s,f,v,o)
#define STRUCT_PACK_DOARG1(s,f,v,t,...) STRUCT_PACK_DOARG0(s,f,v,__VA_ARGS__) s f(0,t)
#define STRUCT_PACK_DOARG2(s,f,v,t,...) STRUCT_PACK_DOARG1(s,f,v,__VA_ARGS__) s f(1,t)
#define STRUCT_PACK_DOARG3(s,f,v,t,...) STRUCT_PACK_DOARG2(s,f,v,__VA_ARGS__) s f(2,t)
#define STRUCT_PACK_DOARG4(s,f,v,t,...) STRUCT_PACK_DOARG3(s,f,v,__VA_ARGS__) s f(3,t)
#define STRUCT_PACK_DOARG5(s,f,v,t,...) STRUCT_PACK_DOARG4(s,f,v,__VA_ARGS__) s f(4,t)
#define STRUCT_PACK_DOARG6(s,f,v,t,...) STRUCT_PACK_DOARG5(s,f,v,__VA_ARGS__) s f(5,t)
#define STRUCT_PACK_DOARG7(s,f,v,t,...) STRUCT_PACK_DOARG6(s,f,v,__VA_ARGS__) s f(6,t)
#define STRUCT_PACK_DOARG8(s,f,v,t,...) STRUCT_PACK_DOARG7(s,f,v,__VA_ARGS__) s f(7,t)
#define STRUCT_PACK_DOARG9(s,f,v,t,...) STRUCT_PACK_DOARG8(s,f,v,__VA_ARGS__) s f(8,t)
#define STRUCT_PACK_DOARG10(s,f,v,t,...) STRUCT_PACK_DOARG9(s,f,v,__VA_ARGS__) s f(9,t)
#define STRUCT_PACK_DOARG11(s,f,v,t,...) STRUCT_PACK_DOARG10(s,f,v,__VA_ARGS__) s f(10,t)
#define STRUCT_PACK_DOARG12(s,f,v,t,...) STRUCT_PACK_DOARG11(s,f,v,__VA_ARGS__) s f(11,t)
#define STRUCT_PACK_DOARG13(s,f,v,t,...) STRUCT_PACK_DOARG12(s,f,v,__VA_ARGS__) s f(12,t)
#define STRUCT_PACK_DOARG14(s,f,v,t,...) STRUCT_PACK_DOARG13(s,f,v,__VA_ARGS__) s f(13,t)
#define STRUCT_PACK_DOARG15(s,f,v,t,...) STRUCT_PACK_DOARG14(s,f,v,__VA_ARGS__) s f(14,t)
#define STRUCT_PACK_DOARG16(s,f,v,t,...) STRUCT_PACK_DOARG15(s,f,v,__VA_ARGS__) s f(15,t)
#define STRUCT_PACK_DOARG17(s,f,v,t,...) STRUCT_PACK_DOARG16(s,f,v,__VA_ARGS__) s f(16,t)
#define STRUCT_PACK_DOARG18(s,f,v,t,...) STRUCT_PACK_DOARG17(s,f,v,__VA_ARGS__) s f(17,t)
#define STRUCT_PACK_DOARG19(s,f,v,t,...) STRUCT_PACK_DOARG18(s,f,v,__VA_ARGS__) s f(18,t)
#define STRUCT_PACK_DOARG20(s,f,v,t,...) STRUCT_PACK_DOARG19(s,f,v,__VA_ARGS__) s f(19,t)
#define STRUCT_PACK_DOARG21(s,f,v,t,...) STRUCT_PACK_DOARG20(s,f,v,__VA_ARGS__) s f(20,t)
#define STRUCT_PACK_DOARG22(s,f,v,t,...) STRUCT_PACK_DOARG21(s,f,v,__VA_ARGS__) s f(21,t)
#define STRUCT_PACK_DOARG23(s,f,v,t,...) STRUCT_PACK_DOARG22(s,f,v,__VA_ARGS__) s f(22,t)
#define STRUCT_PACK_DOARG24(s,f,v,t,...) STRUCT_PACK_DOARG23(s,f,v,__VA_ARGS__) s f(23,t)
#define STRUCT_PACK_DOARG25(s,f,v,t,...) STRUCT_PACK_DOARG24(s,f,v,__VA_ARGS__) s f(24,t)
#define STRUCT_PACK_DOARG26(s,f,v,t,...) STRUCT_PACK_DOARG25(s,f,v,__VA_ARGS__) s f(25,t)
#define STRUCT_PACK_DOARG27(s,f,v,t,...) STRUCT_PACK_DOARG26(s,f,v,__VA_ARGS__) s f(26,t)
#define STRUCT_PACK_DOARG28(s,f,v,t,...) STRUCT_PACK_DOARG27(s,f,v,__VA_ARGS__) s f(27,t)
#define STRUCT_PACK_DOARG29(s,f,v,t,...) STRUCT_PACK_DOARG28(s,f,v,__VA_ARGS__) s f(28,t)
#define STRUCT_PACK_DOARG30(s,f,v,t,...) STRUCT_PACK_DOARG29(s,f,v,__VA_ARGS__) s f(29,t)
#define STRUCT_PACK_DOARG31(s,f,v,t,...) STRUCT_PACK_DOARG30(s,f,v,__VA_ARGS__) s f(30,t)
#define STRUCT_PACK_DOARG32(s,f,v,t,...) STRUCT_PACK_DOARG31(s,f,v,__VA_ARGS__) s f(31,t)
#define STRUCT_PACK_DOARG33(s,f,v,t,...) STRUCT_PACK_DOARG32(s,f,v,__VA_ARGS__) s f(32,t)
#define STRUCT_PACK_DOARG34(s,f,v,t,...) STRUCT_PACK_DOARG33(s,f,v,__VA_ARGS__) s f(33,t)
#define STRUCT_PACK_DOARG35(s,f,v,t,...) STRUCT_PACK_DOARG34(s,f,v,__VA_ARGS__) s f(34,t)
#define STRUCT_PACK_DOARG36(s,f,v,t,...) STRUCT_PACK_DOARG35(s,f,v,__VA_ARGS__) s f(35,t)
#define STRUCT_PACK_DOARG37(s,f,v,t,...) STRUCT_PACK_DOARG36(s,f,v,__VA_ARGS__) s f(36,t)
#define STRUCT_PACK_DOARG38(s,f,v,t,...) STRUCT_PACK_DOARG37(s,f,v,__VA_ARGS__) s f(37,t)
#define STRUCT_PACK_DOARG39(s,f,v,t,...) STRUCT_PACK_DOARG38(s,f,v,__VA_ARGS__) s f(38,t)
#define STRUCT_PACK_DOARG40(s,f,v,t,...) STRUCT_PACK_DOARG39(s,f,v,__VA_ARGS__) s f(39,t)
#define STRUCT_PACK_DOARG41(s,f,v,t,...) STRUCT_PACK_DOARG40(s,f,v,__VA_ARGS__) s f(40,t)
#define STRUCT_PACK_DOARG42(s,f,v,t,...) STRUCT_PACK_DOARG41(s,f,v,__VA_ARGS__) s f(41,t)
#define STRUCT_PACK_DOARG43(s,f,v,t,...) STRUCT_PACK_DOARG42(s,f,v,__VA_ARGS__) s f(42,t)
#define STRUCT_PACK_DOARG44(s,f,v,t,...) STRUCT_PACK_DOARG43(s,f,v,__VA_ARGS__) s f(43,t)
#define STRUCT_PACK_DOARG45(s,f,v,t,...) STRUCT_PACK_DOARG44(s,f,v,__VA_ARGS__) s f(44,t)
#define STRUCT_PACK_DOARG46(s,f,v,t,...) STRUCT_PACK_DOARG45(s,f,v,__VA_ARGS__) s f(45,t)
#define STRUCT_PACK_DOARG47(s,f,v,t,...) STRUCT_PACK_DOARG46(s,f,v,__VA_ARGS__) s f(46,t)
#define STRUCT_PACK_DOARG48(s,f,v,t,...) STRUCT_PACK_DOARG47(s,f,v,__VA_ARGS__) s f(47,t)
#define STRUCT_PACK_DOARG49(s,f,v,t,...) STRUCT_PACK_DOARG48(s,f,v,__VA_ARGS__) s f(48,t)
#define STRUCT_PACK_DOARG50(s,f,v,t,...) STRUCT_PACK_DOARG49(s,f,v,__VA_ARGS__) s f(49,t)
#define STRUCT_PACK_DOARG51(s,f,v,t,...) STRUCT_PACK_DOARG50(s,f,v,__VA_ARGS__) s f(50,t)
#define STRUCT_PACK_DOARG52(s,f,v,t,...) STRUCT_PACK_DOARG51(s,f,v,__VA_ARGS__) s f(51,t)
#define STRUCT_PACK_DOARG53(s,f,v,t,...) STRUCT_PACK_DOARG52(s,f,v,__VA_ARGS__) s f(52,t)
#define STRUCT_PACK_DOARG54(s,f,v,t,...) STRUCT_PACK_DOARG53(s,f,v,__VA_ARGS__) s f(53,t)
#define STRUCT_PACK_DOARG55(s,f,v,t,...) STRUCT_PACK_DOARG54(s,f,v,__VA_ARGS__) s f(54,t)
#define STRUCT_PACK_DOARG56(s,f,v,t,...) STRUCT_PACK_DOARG55(s,f,v,__VA_ARGS__) s f(55,t)
#define STRUCT_PACK_DOARG57(s,f,v,t,...) STRUCT_PACK_DOARG56(s,f,v,__VA_ARGS__) s f(56,t)
#define STRUCT_PACK_DOARG58(s,f,v,t,...) STRUCT_PACK_DOARG57(s,f,v,__VA_ARGS__) s f(57,t)
#define STRUCT_PACK_DOARG59(s,f,v,t,...) STRUCT_PACK_DOARG58(s,f,v,__VA_ARGS__) s f(58,t)
#define STRUCT_PACK_DOARG60(s,f,v,t,...) STRUCT_PACK_DOARG59(s,f,v,__VA_ARGS__) s f(59,t)
#define STRUCT_PACK_DOARG61(s,f,v,t,...) STRUCT_PACK_DOARG60(s,f,v,__VA_ARGS__) s f(60,t)
#define STRUCT_PACK_DOARG62(s,f,v,t,...) STRUCT_PACK_DOARG61(s,f,v,__VA_ARGS__) s f(61,t)
#define STRUCT_PACK_DOARG63(s,f,v,t,...) STRUCT_PACK_DOARG62(s,f,v,__VA_ARGS__) s f(62,t)
#define STRUCT_PACK_DOARG64(s,f,v,t,...) STRUCT_PACK_DOARG63(s,f,v,__VA_ARGS__) s f(63,t)
#define STRUCT_PACK_DOARG1(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG0(s,f,v,__VA_ARGS__)) s f(0,t)
#define STRUCT_PACK_DOARG2(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG1(s,f,v,__VA_ARGS__)) s f(1,t)
#define STRUCT_PACK_DOARG3(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG2(s,f,v,__VA_ARGS__)) s f(2,t)
#define STRUCT_PACK_DOARG4(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG3(s,f,v,__VA_ARGS__)) s f(3,t)
#define STRUCT_PACK_DOARG5(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG4(s,f,v,__VA_ARGS__)) s f(4,t)
#define STRUCT_PACK_DOARG6(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG5(s,f,v,__VA_ARGS__)) s f(5,t)
#define STRUCT_PACK_DOARG7(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG6(s,f,v,__VA_ARGS__)) s f(6,t)
#define STRUCT_PACK_DOARG8(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG7(s,f,v,__VA_ARGS__)) s f(7,t)
#define STRUCT_PACK_DOARG9(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG8(s,f,v,__VA_ARGS__)) s f(8,t)
#define STRUCT_PACK_DOARG10(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG9(s,f,v,__VA_ARGS__)) s f(9,t)
#define STRUCT_PACK_DOARG11(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG10(s,f,v,__VA_ARGS__)) s f(10,t)
#define STRUCT_PACK_DOARG12(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG11(s,f,v,__VA_ARGS__)) s f(11,t)
#define STRUCT_PACK_DOARG13(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG12(s,f,v,__VA_ARGS__)) s f(12,t)
#define STRUCT_PACK_DOARG14(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG13(s,f,v,__VA_ARGS__)) s f(13,t)
#define STRUCT_PACK_DOARG15(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG14(s,f,v,__VA_ARGS__)) s f(14,t)
#define STRUCT_PACK_DOARG16(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG15(s,f,v,__VA_ARGS__)) s f(15,t)
#define STRUCT_PACK_DOARG17(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG16(s,f,v,__VA_ARGS__)) s f(16,t)
#define STRUCT_PACK_DOARG18(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG17(s,f,v,__VA_ARGS__)) s f(17,t)
#define STRUCT_PACK_DOARG19(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG18(s,f,v,__VA_ARGS__)) s f(18,t)
#define STRUCT_PACK_DOARG20(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG19(s,f,v,__VA_ARGS__)) s f(19,t)
#define STRUCT_PACK_DOARG21(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG20(s,f,v,__VA_ARGS__)) s f(20,t)
#define STRUCT_PACK_DOARG22(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG21(s,f,v,__VA_ARGS__)) s f(21,t)
#define STRUCT_PACK_DOARG23(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG22(s,f,v,__VA_ARGS__)) s f(22,t)
#define STRUCT_PACK_DOARG24(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG23(s,f,v,__VA_ARGS__)) s f(23,t)
#define STRUCT_PACK_DOARG25(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG24(s,f,v,__VA_ARGS__)) s f(24,t)
#define STRUCT_PACK_DOARG26(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG25(s,f,v,__VA_ARGS__)) s f(25,t)
#define STRUCT_PACK_DOARG27(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG26(s,f,v,__VA_ARGS__)) s f(26,t)
#define STRUCT_PACK_DOARG28(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG27(s,f,v,__VA_ARGS__)) s f(27,t)
#define STRUCT_PACK_DOARG29(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG28(s,f,v,__VA_ARGS__)) s f(28,t)
#define STRUCT_PACK_DOARG30(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG29(s,f,v,__VA_ARGS__)) s f(29,t)
#define STRUCT_PACK_DOARG31(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG30(s,f,v,__VA_ARGS__)) s f(30,t)
#define STRUCT_PACK_DOARG32(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG31(s,f,v,__VA_ARGS__)) s f(31,t)
#define STRUCT_PACK_DOARG33(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG32(s,f,v,__VA_ARGS__)) s f(32,t)
#define STRUCT_PACK_DOARG34(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG33(s,f,v,__VA_ARGS__)) s f(33,t)
#define STRUCT_PACK_DOARG35(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG34(s,f,v,__VA_ARGS__)) s f(34,t)
#define STRUCT_PACK_DOARG36(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG35(s,f,v,__VA_ARGS__)) s f(35,t)
#define STRUCT_PACK_DOARG37(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG36(s,f,v,__VA_ARGS__)) s f(36,t)
#define STRUCT_PACK_DOARG38(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG37(s,f,v,__VA_ARGS__)) s f(37,t)
#define STRUCT_PACK_DOARG39(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG38(s,f,v,__VA_ARGS__)) s f(38,t)
#define STRUCT_PACK_DOARG40(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG39(s,f,v,__VA_ARGS__)) s f(39,t)
#define STRUCT_PACK_DOARG41(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG40(s,f,v,__VA_ARGS__)) s f(40,t)
#define STRUCT_PACK_DOARG42(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG41(s,f,v,__VA_ARGS__)) s f(41,t)
#define STRUCT_PACK_DOARG43(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG42(s,f,v,__VA_ARGS__)) s f(42,t)
#define STRUCT_PACK_DOARG44(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG43(s,f,v,__VA_ARGS__)) s f(43,t)
#define STRUCT_PACK_DOARG45(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG44(s,f,v,__VA_ARGS__)) s f(44,t)
#define STRUCT_PACK_DOARG46(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG45(s,f,v,__VA_ARGS__)) s f(45,t)
#define STRUCT_PACK_DOARG47(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG46(s,f,v,__VA_ARGS__)) s f(46,t)
#define STRUCT_PACK_DOARG48(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG47(s,f,v,__VA_ARGS__)) s f(47,t)
#define STRUCT_PACK_DOARG49(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG48(s,f,v,__VA_ARGS__)) s f(48,t)
#define STRUCT_PACK_DOARG50(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG49(s,f,v,__VA_ARGS__)) s f(49,t)
#define STRUCT_PACK_DOARG51(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG50(s,f,v,__VA_ARGS__)) s f(50,t)
#define STRUCT_PACK_DOARG52(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG51(s,f,v,__VA_ARGS__)) s f(51,t)
#define STRUCT_PACK_DOARG53(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG52(s,f,v,__VA_ARGS__)) s f(52,t)
#define STRUCT_PACK_DOARG54(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG53(s,f,v,__VA_ARGS__)) s f(53,t)
#define STRUCT_PACK_DOARG55(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG54(s,f,v,__VA_ARGS__)) s f(54,t)
#define STRUCT_PACK_DOARG56(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG55(s,f,v,__VA_ARGS__)) s f(55,t)
#define STRUCT_PACK_DOARG57(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG56(s,f,v,__VA_ARGS__)) s f(56,t)
#define STRUCT_PACK_DOARG58(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG57(s,f,v,__VA_ARGS__)) s f(57,t)
#define STRUCT_PACK_DOARG59(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG58(s,f,v,__VA_ARGS__)) s f(58,t)
#define STRUCT_PACK_DOARG60(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG59(s,f,v,__VA_ARGS__)) s f(59,t)
#define STRUCT_PACK_DOARG61(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG60(s,f,v,__VA_ARGS__)) s f(60,t)
#define STRUCT_PACK_DOARG62(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG61(s,f,v,__VA_ARGS__)) s f(61,t)
#define STRUCT_PACK_DOARG63(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG62(s,f,v,__VA_ARGS__)) s f(62,t)
#define STRUCT_PACK_DOARG64(s,f,v,t,...) STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_DOARG63(s,f,v,__VA_ARGS__)) s f(63,t)

#define STRUCT_PACK_MAKE_ARGS0(Type)
#define STRUCT_PACK_MAKE_ARGS1(Type) Type
#define STRUCT_PACK_MAKE_ARGS1(Type) Type
#define STRUCT_PACK_MAKE_ARGS2(Type) STRUCT_PACK_MAKE_ARGS1(Type), Type
#define STRUCT_PACK_MAKE_ARGS3(Type) STRUCT_PACK_MAKE_ARGS2(Type), Type
#define STRUCT_PACK_MAKE_ARGS4(Type) STRUCT_PACK_MAKE_ARGS3(Type), Type
Expand Down Expand Up @@ -1845,7 +1848,7 @@ namespace detail {
STRUCT_PACK_CONCAT(STRUCT_PACK_MAKE_ARGS,Count)(Type)

#define STRUCT_PACK_FOREACH_(sepatator,fun,...) \
STRUCT_PACK_CONCAT(STRUCT_PACK_DOARG,STRUCT_PACK_ARG_COUNT(__VA_ARGS__))(sepatator,fun,STRUCT_PACK_ARG_COUNT(__VA_ARGS__),__VA_ARGS__)
STRUCT_PACK_MARCO_EXPAND(STRUCT_PACK_CONCAT(STRUCT_PACK_DOARG,STRUCT_PACK_ARG_COUNT(__VA_ARGS__))(sepatator,fun,STRUCT_PACK_ARG_COUNT(__VA_ARGS__),__VA_ARGS__))
#define STRUCT_PACK_FOREACH(sepatator,fun,...) \
STRUCT_PACK_FOREACH_(sepatator,fun,__VA_ARGS__)

Expand All @@ -1865,31 +1868,31 @@ const auto& STRUCT_PACK_GET_##Idx(const Type& c) {\
}\

#define STRUCT_PACK_REFL(Type,...) \
template<typename T>\
constexpr std::size_t STRUCT_PACK_FIELD_COUNT_IMPL();\
template<>\
constexpr std::size_t STRUCT_PACK_FIELD_COUNT_IMPL<Type>() {return STRUCT_PACK_ARG_COUNT(__VA_ARGS__);}\
decltype(auto) STRUCT_PACK_FIELD_COUNT(const Type &){\
return std::integral_constant<std::size_t,STRUCT_PACK_ARG_COUNT(__VA_ARGS__)>{};\
}\
template<std::size_t I> auto& STRUCT_PACK_GET(Type& c) {\
STRUCT_PACK_FOREACH(,STRUCT_PACK_RETURN_ELEMENT,__VA_ARGS__)\
else {\
static_assert(I < STRUCT_PACK_FIELD_COUNT_IMPL<Type>());\
}\
}\
template<std::size_t I> const auto& STRUCT_PACK_GET(const Type& c) {\
STRUCT_PACK_FOREACH(,STRUCT_PACK_RETURN_ELEMENT,__VA_ARGS__)\
else {\
static_assert(I < STRUCT_PACK_FIELD_COUNT_IMPL<Type>());\
}\
}\
STRUCT_PACK_FOREACH(,STRUCT_PACK_GET_INDEX,STRUCT_PACK_MAKE_ARGS(Type,STRUCT_PACK_ARG_COUNT(__VA_ARGS__)))\
STRUCT_PACK_FOREACH(,STRUCT_PACK_GET_INDEX_CONST,STRUCT_PACK_MAKE_ARGS(Type,STRUCT_PACK_ARG_COUNT(__VA_ARGS__)))\
Type& STRUCT_PACK_REFL_FLAG(Type& t) {return t;} \
template<typename T> \
constexpr std::size_t STRUCT_PACK_FIELD_COUNT_IMPL(); \
template<> \
constexpr std::size_t STRUCT_PACK_FIELD_COUNT_IMPL<Type>() {return STRUCT_PACK_ARG_COUNT(__VA_ARGS__);} \
decltype(auto) STRUCT_PACK_FIELD_COUNT(const Type &){ \
return std::integral_constant<std::size_t,STRUCT_PACK_ARG_COUNT(__VA_ARGS__)>{}; \
} \
template<std::size_t I> auto& STRUCT_PACK_GET(Type& c) { \
STRUCT_PACK_FOREACH(,STRUCT_PACK_RETURN_ELEMENT,__VA_ARGS__) \
else { \
static_assert(I < STRUCT_PACK_FIELD_COUNT_IMPL<Type>()); \
} \
} \
template<std::size_t I> const auto& STRUCT_PACK_GET(const Type& c) { \
STRUCT_PACK_FOREACH(,STRUCT_PACK_RETURN_ELEMENT,__VA_ARGS__) \
else { \
static_assert(I < STRUCT_PACK_FIELD_COUNT_IMPL<Type>()); \
} \
} \
STRUCT_PACK_FOREACH(,STRUCT_PACK_GET_INDEX,STRUCT_PACK_MAKE_ARGS(Type,STRUCT_PACK_ARG_COUNT(__VA_ARGS__))) \
STRUCT_PACK_FOREACH(,STRUCT_PACK_GET_INDEX_CONST,STRUCT_PACK_MAKE_ARGS(Type,STRUCT_PACK_ARG_COUNT(__VA_ARGS__))) \

#define STRUCT_PACK_FRIEND_DECL(Type) \
template <std::size_t I> \
friend auto& STRUCT_PACK_GET(Type& c);\
template <std::size_t I>\
friend const auto& STRUCT_PACK_GET(const Type& c);\

friend auto& STRUCT_PACK_GET(Type& c); \
template <std::size_t I> \
friend const auto& STRUCT_PACK_GET(const Type& c); \
2 changes: 1 addition & 1 deletion src/struct_pack/examples/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")

cc_binary(
name = "serialize_example",
srcs = ["serialize.cpp"],
srcs = ["basic_usage.cpp","main.cpp","non_aggregated_type.cpp"],
copts = ["-std=c++20"],
deps = [
"//:ylt"
Expand Down
2 changes: 1 addition & 1 deletion src/struct_pack/examples/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ void basic_usage();
void non_aggregated_type();

int main() {
// basic_usage();
basic_usage();
non_aggregated_type();
return 0;
}

0 comments on commit d6f2a61

Please sign in to comment.