9#include "barretenberg/common/ref_vector.hpp"
10#include "barretenberg/common/std_array.hpp"
11#include "barretenberg/common/std_string.hpp"
12#include "barretenberg/common/std_vector.hpp"
17namespace barretenberg::detail {
18template <
typename... Args>
constexpr std::size_t _va_count(Args&&... )
20 return sizeof...(Args);
22template <
typename T,
typename... BaseClass>
constexpr std::size_t _sum_base_class_size(
const T& arg)
24 return (
static_cast<const BaseClass&
>(arg).size() + ...);
26template <
typename T,
typename... BaseClass>
auto _concatenate_base_class_get_all(T& arg)
28 return concatenate(
static_cast<BaseClass&
>(arg).get_all()...);
30template <
typename T,
typename... BaseClass>
auto _concatenate_base_class_get_all_const(
const T& arg)
32 return concatenate(
static_cast<const BaseClass&
>(arg).get_all()...);
34template <
typename T,
typename... BaseClass>
auto _concatenate_base_class_get_labels(
const T& arg)
36 return concatenate(
static_cast<const BaseClass&
>(arg).get_labels()...);
40#define DEFINE_REF_VIEW(...) \
41 [[nodiscard]] auto get_all() \
43 return RefVector{ __VA_ARGS__ }; \
45 [[nodiscard]] auto get_all() const \
47 return RefVector{ __VA_ARGS__ }; \
57#define DEFINE_FLAVOR_MEMBERS(DataType, ...) \
58 DataType __VA_ARGS__; \
59 DEFINE_REF_VIEW(__VA_ARGS__) \
60 std::vector<std::string> get_labels() const \
62 return barretenberg::detail::split_and_trim(#__VA_ARGS__, ','); \
64 constexpr std::size_t size() const \
66 return barretenberg::detail::_va_count(__VA_ARGS__); \
69#define DEFINE_COMPOUND_GET_ALL(...) \
70 [[nodiscard]] auto get_all() \
72 return barretenberg::detail::_concatenate_base_class_get_all<decltype(*this), __VA_ARGS__>(*this); \
74 [[nodiscard]] auto get_all() const \
76 return barretenberg::detail::_concatenate_base_class_get_all_const<decltype(*this), __VA_ARGS__>(*this); \
78 constexpr std::size_t size() const \
80 return barretenberg::detail::_sum_base_class_size<decltype(*this), __VA_ARGS__>(*this); \
82 std::vector<std::string> get_labels() const \
84 return barretenberg::detail::_concatenate_base_class_get_labels<decltype(*this), __VA_ARGS__>(*this); \