18#ifndef BACKENDS_TOFINO_BF_ASM_MAP_H_
19#define BACKENDS_TOFINO_BF_ASM_MAP_H_
23template <
class K,
class T,
class V,
class Comp,
class Alloc>
24inline V get(
const std::map<K, V, Comp, Alloc> &m, T key, V def = V()) {
25 auto it = m.find(key);
26 if (it != m.end())
return it->second;
30template <
class K,
class T,
class V,
class Comp,
class Alloc>
31inline V *getref(std::map<K, V, Comp, Alloc> &m, T key) {
32 auto it = m.find(key);
33 if (it != m.end())
return &it->second;
37template <
class K,
class T,
class V,
class Comp,
class Alloc>
38inline const V *getref(
const std::map<K, V, Comp, Alloc> &m, T key) {
39 auto it = m.find(key);
40 if (it != m.end())
return &it->second;
44template <
class K,
class T,
class V,
class Comp,
class Alloc>
45inline V get(
const std::map<K, V, Comp, Alloc> *m, T key, V def = V()) {
46 return m ? get(*m, key, def) : def;
49template <
class K,
class T,
class V,
class Comp,
class Alloc>
50inline V *getref(std::map<K, V, Comp, Alloc> *m, T key) {
51 return m ? getref(*m, key) : 0;
54template <
class K,
class T,
class V,
class Comp,
class Alloc>
55inline const V *getref(
const std::map<K, V, Comp, Alloc> *m, T key) {
56 return m ? getref(*m, key) : 0;
60template <
class PairIter>
63 :
public std::iterator<typename std::iterator_traits<PairIter>::iterator_category,
64 typename std::iterator_traits<PairIter>::value_type,
65 typename std::iterator_traits<PairIter>::difference_type,
66 typename std::iterator_traits<PairIter>::pointer,
67 typename std::iterator_traits<PairIter>::reference> {
72 explicit iterator(PairIter i) : it(i) {}
73 iterator &operator=(PairIter i) {
77 iterator &operator++() {
81 iterator &operator--() {
85 iterator operator++(
int) {
90 iterator operator--(
int) {
95 bool operator==(
const iterator &i)
const {
return it == i.it; }
96 bool operator!=(
const iterator &i)
const {
return it != i.it; }
97 decltype(*&it->first)
operator*()
const {
return it->first; }
98 decltype(&it->first) operator->()
const {
return &it->first; }
102 IterKeys(U &map) : b(map.begin()), e(map.end()) {}
103 IterKeys(PairIter b, PairIter e) : b(b), e(e) {}
104 iterator begin()
const {
return b; }
112struct IterKeysCopy : IterKeys<typename Map::const_iterator> {
114 explicit IterKeysCopy(Map &&map) : m(std::move(map)) {
136template <
class PairIter>
142template <
class PairIter>
146 using iterator_category =
typename std::iterator_traits<PairIter>::iterator_category;
147 using value_type =
typename std::iterator_traits<PairIter>::value_type;
148 using difference_type =
typename std::iterator_traits<PairIter>::difference_type;
149 using pointer =
typename std::iterator_traits<PairIter>::pointer;
150 using reference =
typename std::iterator_traits<PairIter>::reference;
155 explicit iterator(PairIter i) : it(i) {}
156 iterator &operator=(PairIter i) {
160 iterator &operator++() {
164 iterator &operator--() {
168 iterator operator++(
int) {
173 iterator operator--(
int) {
178 bool operator==(
const iterator &i)
const {
return it == i.it; }
179 bool operator!=(
const iterator &i)
const {
return it != i.it; }
180 decltype(*&it->second)
operator*()
const {
return it->second; }
181 decltype(&it->second) operator->()
const {
return &it->second; }
185 IterValues(U &map) : b(map.begin()), e(map.end()) {}
186 IterValues(PairIter b, PairIter e) : b(b), e(e) {}
187 iterator begin()
const {
return b; }
195struct IterValuesCopy : IterValues<typename Map::const_iterator> {
197 explicit IterValuesCopy(Map &&map) : m(std::move(map)) {
219template <
class PairIter>
228 typename M::key_type key;
230 const MapForKey &self;
231 decltype(map.begin()) it;
234 iterator(
const MapForKey &s,
decltype(map.begin()) i) : self(s), it(i) {}
235 iterator &operator++() {
236 if (++it != self.map.end() && it->first != self.key) it = self.map.end();
239 bool operator==(
const iterator &i)
const {
return it == i.it; }
240 bool operator!=(
const iterator &i)
const {
return it != i.it; }
241 decltype(*&it->second)
operator*()
const {
return it->second; }
242 decltype(&it->second) operator->()
const {
return &it->second; }
246 MapForKey(M &m,
typename M::key_type k) : map(m), key(k) {}
247 iterator begin()
const {
return iterator(*
this, map.find(key)); }
248 iterator end()
const {
return iterator(*
this, map.end()); }
252MapForKey<M> ValuesForKey(M &m,
typename M::key_type k) {
Definition backends/tofino/bf-asm/map.h:67
Definition backends/tofino/bf-asm/map.h:144
Definition backends/tofino/bf-asm/map.h:226
Definition backends/tofino/bf-asm/map.h:112
Definition backends/tofino/bf-asm/map.h:61
Definition backends/tofino/bf-asm/map.h:195
Definition backends/tofino/bf-asm/map.h:143