23 #ifndef BM_BM_SIM_HEADER_UNIONS_H_
24 #define BM_BM_SIM_HEADER_UNIONS_H_
37 using header_union_id_t = p4object_id_t;
55 HeaderUnion(
const std::string &name, p4object_id_t
id)
58 void make_header_valid(
size_t new_valid_idx) {
59 if (valid && valid_header_idx != new_valid_idx)
60 headers[valid_header_idx].get().mark_invalid();
61 valid_header_idx = new_valid_idx;
66 void make_header_invalid(
size_t idx) {
67 if (valid && valid_header_idx == idx) valid =
false;
72 assert(headers.size() == other->headers.size());
73 std::swap(valid, other->valid);
74 std::swap(valid_header_idx, other->valid_header_idx);
77 for (
size_t i = 0; i < headers.size(); i++)
78 headers[i].get().swap_values(&other->headers[i].get());
84 return valid ? &headers[valid_header_idx].get() :
nullptr;
92 Header &
at(
size_t idx) {
return headers.at(idx); }
94 const Header &
at(
size_t idx)
const {
return headers.at(idx); }
104 void mark_invalid() { }
105 void mark_valid() { }
111 void set_next_header(Header &h) {
112 headers.emplace_back(h);
115 using HeaderRef = std::reference_wrapper<Header>;
117 std::vector<HeaderRef> headers{};
119 size_t valid_header_idx{0};
124 #endif // BM_BM_SIM_HEADER_UNIONS_H_