| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- //
- // macro.h
- // vector
- //
- // Created by Sam Jaffe on 2/17/24.
- //
- // Utility Macros
- #define COMMA() ,
- #define DEFER_RESOLUTION template <bool _ = true>
- #define DEFERRED_ENABLE_IF_T(B, ...) std::enable_if_t<B && _, ##__VA_ARGS__>
- #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<t, n>)
- #define VECTOR_ENABLE_IF_EQ_T(_type, t, n) \
- std::enable_if_t<std::is_same_v<_type, t>, vector<t, n>>
- #define VECTOR_DISABLE_IF_VECTOR(_type, t, n) \
- std::enable_if_t<!is_vector_v<_type>, vector<t, n>>
- // 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)})
|