23 #ifndef BM_BM_SIM_STACKS_H_
24 #define BM_BM_SIM_STACKS_H_
35 using header_stack_id_t = p4object_id_t;
74 virtual size_t pop_back() = 0;
77 virtual size_t push_back() = 0;
86 virtual bool is_full()
const = 0;
88 virtual void reset() = 0;
96 struct assign_header_stack;
97 struct assign_union_stack;
110 template <
typename T,
typename ShiftImpl>
116 friend struct core::assign_header_stack;
117 friend struct core::assign_union_stack;
119 Stack(
const std::string &name, p4object_id_t
id);
127 size_t pop_back()
override;
129 size_t push_back()
override;
135 void reset()
override;
138 const T &get_last()
const;
141 const T &get_next()
const;
144 const T &at(
size_t idx)
const;
147 using TRef = std::reference_wrapper<T>;
152 void set_next_element(T &e);
154 std::vector<TRef> elements{};
164 template <
typename T>
165 class StackLegacy :
public Stack<T, StackLegacy<T> > {
167 StackLegacy(
const std::string &name, p4object_id_t
id);
170 size_t pop_front(
size_t num);
173 size_t push_front(
size_t num);
178 template <
typename T>
179 class StackP4_16 :
public Stack<T, StackP4_16<T> > {
181 StackP4_16(
const std::string &name, p4object_id_t
id);
184 size_t pop_front(
size_t num);
187 size_t push_front(
size_t num);
190 #ifdef BM_WP4_16_STACKS
191 template <
typename T>
193 using MyStack = StackP4_16<T>;
195 template <
typename T>
196 using MyStack = StackLegacy<T>;
197 #endif // BM_WP4_16_STACKS
201 using header_stack_id_t = p4object_id_t;
202 using header_union_stack_id_t = p4object_id_t;
229 #endif // BM_BM_SIM_STACKS_H_