// // macro.h // vector // // Created by Sam Jaffe on 2/17/24. // // Utility Macros #define COMMA() , #define DEFER_RESOLUTION template #define DEFERRED_ENABLE_IF_T(B, ...) std::enable_if_t #define DEFERRED_ENABLE_IF(B, ...) \ DEFER_RESOLUTION DEFERRED_ENABLE_IF_T(B, ##__VA_ARGS__) // Repetition Macros for Trivial Codegen #define REPEAT0(X, div, ...) #define REPEAT1(X, div, ...) X(0, ##__VA_ARGS__) #define REPEAT2(X, div, ...) \ REPEAT1(X, div, ##__VA_ARGS__) div() X(1, ##__VA_ARGS__) #define REPEAT3(X, div, ...) \ REPEAT2(X, div, ##__VA_ARGS__) div() X(2, ##__VA_ARGS__) #define REPEAT4(X, div, ...) \ REPEAT3(X, div, ##__VA_ARGS__) div() X(3, ##__VA_ARGS__) #define REPEAT5(X, div, ...) \ REPEAT4(X, div, ##__VA_ARGS__) div() X(4, ##__VA_ARGS__) #define REPEAT(N, X, div, ...) REPEAT##N(X, div, ##__VA_ARGS__) #define ARGN(N, ...) __VA_ARGS__ arg##N // Vector Concept Macros #define VECTOR_ENABLE_IF_LT_N(index, expr) \ DEFERRED_ENABLE_IF(std::size_t(index) < N, expr) #define VECTOR_ENABLE_IF_EQ_N(index, t, n) \ DEFERRED_ENABLE_IF(std::size_t(index) == N, vector) #define VECTOR_ENABLE_IF_EQ_T(_type, t, n) \ std::enable_if_t, vector> #define VECTOR_DISABLE_IF_VECTOR(_type, t, n) \ std::enable_if_t, vector> // Vector Access/Iteration Macros #define VECTOR_ACCESS_FN(name, i) \ VECTOR_ENABLE_IF_LT_N(i, value_type const &) name() const { \ return _data[i]; \ } \ VECTOR_ENABLE_IF_LT_N(i, value_type &) name() { return _data[i]; } #define VECTOR_FOR_EACH_RANGE(var, end) \ for (std::size_t var = 0; var < end; ++var) #define VECTOR_FOR_EACH(var) VECTOR_FOR_EACH_RANGE(var, N) #define VECTOR_CTOR_N_ARGS(N_IN) \ DEFER_RESOLUTION vector(REPEAT(N_IN, ARGN, COMMA, T), \ DEFERRED_ENABLE_IF_T(N_IN == N, bool) = true) \ : vector(std::array{REPEAT(N_IN, ARGN, COMMA)})