18template <
typename Map,
typename Key>
19typename Map::mapped_type get(
const Map &m,
const Key &key) {
20 auto it = m.find(key);
21 return it != m.end() ? it->second :
typename Map::mapped_type{};
23template <
class Map,
typename Key,
typename Value>
24typename Map::mapped_type get(
const Map &m,
const Key &key,
Value &&def) {
25 using M =
typename Map::mapped_type;
26 auto it = m.find(key);
27 return it != m.end() ? it->second :
static_cast<M
>(std::forward<Value>(def));
32template <
typename Map,
typename Key>
33const typename Map::mapped_type *getref(
const Map &m,
const Key &key) {
34 auto it = m.find(key);
35 return it != m.end() ? &it->second :
nullptr;
38template <
typename Map,
typename Key>
39typename Map::mapped_type *getref(Map &m,
const Key &key) {
40 auto it = m.find(key);
41 return it != m.end() ? &it->second :
nullptr;
46template <
class Map,
typename Key>
47std::optional<typename Map::mapped_type> get_optional(
const Map &m,
const Key &key) {
48 auto it = m.find(key);
49 if (it != m.end())
return std::optional<typename Map::mapped_type>(it->second);
54template <
typename Map,
typename Key>
55typename Map::mapped_type get(
const Map *m,
const Key &key) {
56 return m ? get(*m, key) : typename Map::mapped_type{};
59template <
class Map,
typename Key,
typename Value>
60typename Map::mapped_type get(
const Map *m,
const Key &key, Value &&def) {
61 return m ? get(*m, key, std::forward(def)) : typename Map::mapped_type{};
64template <
typename Map,
typename Key>
65const typename Map::mapped_type *getref(
const Map *m,
const Key &key) {
66 return m ? getref(*m, key) : nullptr;
69template <
typename Map,
typename Key>
70typename Map::mapped_type *getref(Map *m,
const Key &key) {
71 return m ? getref(*m, key) : nullptr;
75template <
class PairIter>
81 using iterator_category =
typename std::iterator_traits<PairIter>::iterator_category;
82 using value_type =
typename std::iterator_traits<PairIter>::value_type::first_type;
83 using difference_type =
typename std::iterator_traits<PairIter>::difference_type;
84 using pointer =
decltype(&it->first);
85 using reference =
decltype(*&it->first);
87 explicit iterator(PairIter i) : it(i) {}
88 iterator &operator++() {
92 iterator &operator--() {
96 iterator operator++(
int) {
101 iterator operator--(
int) {
106 bool operator==(
const iterator &i)
const {
return it == i.it; }
107 bool operator!=(
const iterator &i)
const {
return it != i.it; }
108 reference operator*()
const {
return it->first; }
109 pointer operator->()
const {
return &it->first; }
114 explicit IterKeys(U &map) : b(map.begin()), e(map.end()) {}
115 IterKeys(PairIter b, PairIter e) : b(b), e(e) {}
116 iterator begin()
const {
return b; }
117 iterator end()
const {
return e; }
130template <
class PairIter>
136template <
class PairIter>
142 using iterator_category =
typename std::iterator_traits<PairIter>::iterator_category;
143 using value_type =
typename std::iterator_traits<PairIter>::value_type::second_type;
144 using difference_type =
typename std::iterator_traits<PairIter>::difference_type;
145 using pointer =
decltype(&it->second);
146 using reference =
decltype(*&it->second);
148 explicit iterator(PairIter i) : it(i) {}
149 iterator &operator++() {
153 iterator &operator--() {
157 iterator operator++(
int) {
162 iterator operator--(
int) {
167 bool operator==(
const iterator &i)
const {
return it == i.it; }
168 bool operator!=(
const iterator &i)
const {
return it != i.it; }
169 reference operator*()
const {
return it->second; }
170 pointer operator->()
const {
return &it->second; }
174 using value_type =
typename std::iterator_traits<PairIter>::value_type::second_type;
177 explicit IterValues(U &map) : b(map.begin()), e(map.end()) {}
178 IterValues(PairIter b, PairIter e) : b(b), e(e) {}
179 iterator begin()
const {
return b; }
180 iterator end()
const {
return e; }
193template <
class PairIter>
202 typename M::key_type key;
204 using MapIt =
decltype(map.begin());
206 const MapForKey &self;
210 using iterator_category = std::forward_iterator_tag;
211 using value_type =
typename M::value_type;
212 using difference_type =
typename std::iterator_traits<MapIt>::difference_type;
213 using pointer =
decltype(&it->second);
214 using reference =
decltype(*&it->second);
216 iterator(
const MapForKey &s, MapIt i) : self(s), it(std::move(i)) {}
217 iterator &operator++() {
218 if (++it != self.map.end() && it->first != self.key) it = self.map.end();
221 iterator operator++(
int) {
226 bool operator==(
const iterator &i)
const {
return it == i.it; }
227 bool operator!=(
const iterator &i)
const {
return it != i.it; }
228 reference operator*()
const {
return it->second; }
229 pointer operator->()
const {
return &it->second; }
233 MapForKey(M &m,
typename M::key_type k) : map(m), key(k) {}
234 iterator begin()
const {
return iterator(*
this, map.find(key)); }
235 iterator end()
const {
return iterator(*
this, map.end()); }
239MapForKey<M> ValuesForKey(M &m,
typename M::key_type k) {
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
Definition backends/tofino/bf-asm/map.h:61
Definition backends/tofino/bf-asm/map.h:143