barretenberg
Loading...
Searching...
No Matches
flavor_macros.hpp
1#pragma once
2
3// Macros for defining the flavor classes.
4// These are used to derive iterator methods along with the body of a 'flavor' class.
5// DEFINE_FLAVOR_MEMBERS lets you define a flavor entity as a collection of individual members, and derive an iterator.
6// while DEFINE_COMPOUND_GET_ALL lets you combine the iterators of substructures or base
7// classes.
8
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"
13#include <array>
14#include <iostream>
15#include <sstream>
16
17namespace barretenberg::detail {
18template <typename... Args> constexpr std::size_t _va_count(Args&&... /*unused*/)
19{
20 return sizeof...(Args);
21}
22template <typename T, typename... BaseClass> constexpr std::size_t _sum_base_class_size(const T& arg)
23{
24 return (static_cast<const BaseClass&>(arg).size() + ...);
25}
26template <typename T, typename... BaseClass> auto _concatenate_base_class_get_all(T& arg)
27{
28 return concatenate(static_cast<BaseClass&>(arg).get_all()...);
29}
30template <typename T, typename... BaseClass> auto _concatenate_base_class_get_all_const(const T& arg)
31{
32 return concatenate(static_cast<const BaseClass&>(arg).get_all()...);
33}
34template <typename T, typename... BaseClass> auto _concatenate_base_class_get_labels(const T& arg)
35{
36 return concatenate(static_cast<const BaseClass&>(arg).get_labels()...);
37}
38} // namespace barretenberg::detail
39
40#define DEFINE_REF_VIEW(...) \
41 [[nodiscard]] auto get_all() \
42 { \
43 return RefVector{ __VA_ARGS__ }; \
44 } \
45 [[nodiscard]] auto get_all() const \
46 { \
47 return RefVector{ __VA_ARGS__ }; \
48 }
49
57#define DEFINE_FLAVOR_MEMBERS(DataType, ...) \
58 DataType __VA_ARGS__; \
59 DEFINE_REF_VIEW(__VA_ARGS__) \
60 std::vector<std::string> get_labels() const \
61 { \
62 return barretenberg::detail::split_and_trim(#__VA_ARGS__, ','); \
63 } \
64 constexpr std::size_t size() const \
65 { \
66 return barretenberg::detail::_va_count(__VA_ARGS__); \
67 }
68
69#define DEFINE_COMPOUND_GET_ALL(...) \
70 [[nodiscard]] auto get_all() \
71 { \
72 return barretenberg::detail::_concatenate_base_class_get_all<decltype(*this), __VA_ARGS__>(*this); \
73 } \
74 [[nodiscard]] auto get_all() const \
75 { \
76 return barretenberg::detail::_concatenate_base_class_get_all_const<decltype(*this), __VA_ARGS__>(*this); \
77 } \
78 constexpr std::size_t size() const \
79 { \
80 return barretenberg::detail::_sum_base_class_size<decltype(*this), __VA_ARGS__>(*this); \
81 } \
82 std::vector<std::string> get_labels() const \
83 { \
84 return barretenberg::detail::_concatenate_base_class_get_labels<decltype(*this), __VA_ARGS__>(*this); \
85 }