macro.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // macro.h
  3. // vector
  4. //
  5. // Created by Sam Jaffe on 2/17/24.
  6. //
  7. // Utility Macros
  8. #define COMMA() ,
  9. #define DEFER_RESOLUTION template <bool _ = true>
  10. #define DEFERRED_ENABLE_IF_T(B, ...) std::enable_if_t<B && _, ##__VA_ARGS__>
  11. #define DEFERRED_ENABLE_IF(B, ...) \
  12. DEFER_RESOLUTION DEFERRED_ENABLE_IF_T(B, ##__VA_ARGS__)
  13. // Repetition Macros for Trivial Codegen
  14. #define REPEAT0(X, div, ...)
  15. #define REPEAT1(X, div, ...) X(0, ##__VA_ARGS__)
  16. #define REPEAT2(X, div, ...) \
  17. REPEAT1(X, div, ##__VA_ARGS__) div() X(1, ##__VA_ARGS__)
  18. #define REPEAT3(X, div, ...) \
  19. REPEAT2(X, div, ##__VA_ARGS__) div() X(2, ##__VA_ARGS__)
  20. #define REPEAT4(X, div, ...) \
  21. REPEAT3(X, div, ##__VA_ARGS__) div() X(3, ##__VA_ARGS__)
  22. #define REPEAT5(X, div, ...) \
  23. REPEAT4(X, div, ##__VA_ARGS__) div() X(4, ##__VA_ARGS__)
  24. #define REPEAT(N, X, div, ...) REPEAT##N(X, div, ##__VA_ARGS__)
  25. #define ARGN(N, ...) __VA_ARGS__ arg##N
  26. // Vector Concept Macros
  27. #define VECTOR_ENABLE_IF_LT_N(index, expr) \
  28. DEFERRED_ENABLE_IF(std::size_t(index) < N, expr)
  29. #define VECTOR_ENABLE_IF_EQ_N(index, t, n) \
  30. DEFERRED_ENABLE_IF(std::size_t(index) == N, vector<t, n>)
  31. #define VECTOR_ENABLE_IF_EQ_T(_type, t, n) \
  32. std::enable_if_t<std::is_same_v<_type, t>, vector<t, n>>
  33. #define VECTOR_DISABLE_IF_VECTOR(_type, t, n) \
  34. std::enable_if_t<!is_vector_v<_type>, vector<t, n>>
  35. // Vector Access/Iteration Macros
  36. #define VECTOR_ACCESS_FN(name, i) \
  37. VECTOR_ENABLE_IF_LT_N(i, value_type const &) name() const { \
  38. return _data[i]; \
  39. } \
  40. VECTOR_ENABLE_IF_LT_N(i, value_type &) name() { return _data[i]; }
  41. #define VECTOR_FOR_EACH_RANGE(var, end) \
  42. for (std::size_t var = 0; var < end; ++var)
  43. #define VECTOR_FOR_EACH(var) VECTOR_FOR_EACH_RANGE(var, N)
  44. #define VECTOR_CTOR_N_ARGS(N_IN) \
  45. DEFER_RESOLUTION vector(REPEAT(N_IN, ARGN, COMMA, T), \
  46. DEFERRED_ENABLE_IF_T(N_IN == N, bool) = true) \
  47. : vector(std::array{REPEAT(N_IN, ARGN, COMMA)})