P4C
The P4 Compiler
Loading...
Searching...
No Matches
alias_array.h
1
17
18#ifndef BACKENDS_TOFINO_BF_ASM_ALIAS_ARRAY_H_
19#define BACKENDS_TOFINO_BF_ASM_ALIAS_ARRAY_H_
20
21#include <cstdlib>
22
23#include "lib/exceptions.h"
24
25template <size_t S, typename T>
26class alias_array;
27
28template <typename T>
30 protected:
31 class iterator {
32 T **ptr;
33
34 public:
35 explicit iterator(T **p) : ptr(p) {}
36 iterator &operator++() {
37 ++ptr;
38 return *this;
39 }
40 iterator &operator--() {
41 --ptr;
42 return *this;
43 }
44 iterator &operator++(int) {
45 auto copy = *this;
46 ++ptr;
47 return copy;
48 }
49 iterator &operator--(int) {
50 auto copy = *this;
51 --ptr;
52 return copy;
53 }
54 bool operator==(const iterator &i) const { return ptr == i.ptr; }
55 bool operator!=(const iterator &i) const { return ptr != i.ptr; }
56 T &operator*() const { return **ptr; }
57 T *operator->() const { return *ptr; }
58 };
59
60 public:
61 virtual T &operator[](size_t) = 0;
62 virtual const T &operator[](size_t) const = 0;
63 virtual size_t size() const = 0;
64 virtual iterator begin() = 0;
65 virtual iterator end() = 0;
66 virtual bool modified() const = 0;
67 virtual void set_modified(bool v = true) = 0;
68 virtual bool disabled() const = 0;
69 virtual bool disable() = 0;
70 virtual bool disable_if_zero() = 0;
71 virtual void enable() = 0;
72};
73
74template <size_t S, typename T>
75class alias_array : public alias_array_base<T> {
76 T *data[S];
77 using typename alias_array_base<T>::iterator;
78
79 public:
80 alias_array(const std::initializer_list<T *> &v) {
81 auto it = v.begin();
82 for (auto &e : data) {
83 BUG_CHECK(it != v.end(), "Not enough initializers for alias array");
84 e = *it++;
85 }
86 BUG_CHECK(it == v.end(), "Too many initializers for alias array");
87 }
88 T &operator[](size_t idx) {
89 BUG_CHECK(idx < S, "alias array index %zd out of bounds %zd", idx, S);
90 return *data[idx];
91 }
92 const T &operator[](size_t idx) const {
93 BUG_CHECK(idx < S, "alias array index %zd out of bounds %zd", idx, S);
94 return *data[idx];
95 }
96 size_t size() const { return S; }
97 iterator begin() { return iterator(data); }
98 iterator end() { return iterator(data + S); }
99 bool modified() const {
100 for (size_t i = 0; i < S; i++)
101 if (data[i]->modified()) return true;
102 return false;
103 }
104 void set_modified(bool v = true) {
105 for (size_t i = 0; i < S; i++) data[i]->set_modified(v);
106 }
107 bool disabled() const {
108 bool rv = true;
109 for (size_t i = 0; i < S; i++)
110 if (!data[i]->disabled()) rv = false;
111 return rv;
112 }
113 bool disable() {
114 bool rv = true;
115 for (size_t i = 0; i < S; i++)
116 if (!data[i]->disable()) rv = false;
117 return rv;
118 }
119 void enable() {
120 for (size_t i = 0; i < S; i++) data[i]->enable();
121 }
122 bool disable_if_unmodified() {
123 bool rv = true;
124 for (size_t i = 0; i < S; i++)
125 if (!data[i]->disable_if_unmodified()) rv = false;
126 return rv;
127 }
128 bool disable_if_zero() {
129 bool rv = true;
130 for (size_t i = 0; i < S; i++)
131 if (!data[i]->disable_if_zero()) rv = false;
132 return rv;
133 }
134 bool disable_if_reset_value() {
135 bool rv = true;
136 for (size_t i = 0; i < S; i++)
137 if (!data[i]->disable_if_reset_value()) rv = false;
138 return rv;
139 }
140};
141
142#endif /* BACKENDS_TOFINO_BF_ASM_ALIAS_ARRAY_H_ */
Definition alias_array.h:31
Definition alias_array.h:29
Definition alias_array.h:75