24template <
typename Map,
typename Key>
25typename Map::mapped_type get(
const Map &m,
const Key &key) {
26 auto it = m.find(key);
27 return it != m.end() ? it->second :
typename Map::mapped_type{};
29template <
class Map,
typename Key,
typename Value>
30typename Map::mapped_type get(
const Map &m,
const Key &key, Value &&def) {
31 using M =
typename Map::mapped_type;
32 auto it = m.find(key);
33 return it != m.end() ? it->second :
static_cast<M
>(std::forward<Value>(def));
38template <
typename Map,
typename Key>
39const typename Map::mapped_type *getref(
const Map &m,
const Key &key) {
40 auto it = m.find(key);
41 return it != m.end() ? &it->second :
nullptr;
44template <
typename Map,
typename Key>
45typename Map::mapped_type *getref(Map &m,
const Key &key) {
46 auto it = m.find(key);
47 return it != m.end() ? &it->second :
nullptr;
52template <
class Map,
typename Key>
53std::optional<typename Map::mapped_type> get_optional(
const Map &m,
const Key &key) {
54 auto it = m.find(key);
55 if (it != m.end())
return std::optional<typename Map::mapped_type>(it->second);
60template <
typename Map,
typename Key>
61typename Map::mapped_type get(
const Map *m,
const Key &key) {
62 return m ? get(*m, key) : typename Map::mapped_type{};
65template <
class Map,
typename Key,
typename Value>
66typename Map::mapped_type get(
const Map *m,
const Key &key, Value &&def) {
67 return m ? get(*m, key, std::forward(def)) : typename Map::mapped_type{};
70template <
typename Map,
typename Key>
71const typename Map::mapped_type *getref(
const Map *m,
const Key &key) {
72 return m ? getref(*m, key) : nullptr;
75template <
typename Map,
typename Key>
76typename Map::mapped_type *getref(Map *m,
const Key &key) {
77 return m ? getref(*m, key) : nullptr;
81template <
class PairIter>
87 using iterator_category =
typename std::iterator_traits<PairIter>::iterator_category;
88 using value_type =
typename std::iterator_traits<PairIter>::value_type::first_type;
89 using difference_type =
typename std::iterator_traits<PairIter>::difference_type;
90 using pointer =
decltype(&it->first);
91 using reference =
decltype(*&it->first);
93 explicit iterator(PairIter i) : it(i) {}
94 iterator &operator++() {
98 iterator &operator--() {
102 iterator operator++(
int) {
107 iterator operator--(
int) {
112 bool operator==(
const iterator &i)
const {
return it == i.it; }
113 bool operator!=(
const iterator &i)
const {
return it != i.it; }
114 reference operator*()
const {
return it->first; }
115 pointer operator->()
const {
return &it->first; }
120 explicit IterKeys(U &map) : b(map.begin()), e(map.end()) {}
121 IterKeys(PairIter b, PairIter e) : b(b), e(e) {}
122 iterator begin()
const {
return b; }
123 iterator end()
const {
return e; }
136template <
class PairIter>
142template <
class PairIter>
148 using iterator_category =
typename std::iterator_traits<PairIter>::iterator_category;
149 using value_type =
typename std::iterator_traits<PairIter>::value_type::second_type;
150 using difference_type =
typename std::iterator_traits<PairIter>::difference_type;
151 using pointer =
decltype(&it->second);
152 using reference =
decltype(*&it->second);
154 explicit iterator(PairIter i) : it(i) {}
155 iterator &operator++() {
159 iterator &operator--() {
163 iterator operator++(
int) {
168 iterator operator--(
int) {
173 bool operator==(
const iterator &i)
const {
return it == i.it; }
174 bool operator!=(
const iterator &i)
const {
return it != i.it; }
175 reference operator*()
const {
return it->second; }
176 pointer operator->()
const {
return &it->second; }
180 using value_type =
typename std::iterator_traits<PairIter>::value_type::second_type;
183 explicit IterValues(U &map) : b(map.begin()), e(map.end()) {}
184 IterValues(PairIter b, PairIter e) : b(b), e(e) {}
185 iterator begin()
const {
return b; }
186 iterator end()
const {
return e; }
199template <
class PairIter>
208 typename M::key_type key;
210 using MapIt =
decltype(map.begin);
216 using iterator_category = std::forward_iterator_tag;
217 using value_type =
typename M::value_type;
218 using difference_type =
typename std::iterator_traits<MapIt>::difference_type;
219 using pointer =
decltype(&it->second);
220 using reference =
decltype(*&it->second);
222 iterator(
const MapForKey &s, MapIt i) : self(s), it(std::move(i)) {}
223 iterator &operator++() {
224 if (++it != self.map.end() && it->first != self.key) it = self.map.end();
227 iterator operator++(
int) {
232 bool operator==(
const iterator &i)
const {
return it == i.it; }
233 bool operator!=(
const iterator &i)
const {
return it != i.it; }
234 reference operator*()
const {
return it->second; }
235 pointer operator->()
const {
return &it->second; }
239 MapForKey(M &m,
typename M::key_type k) : map(m), key(k) {}
240 iterator begin()
const {
return iterator(*
this, map.find(key)); }
241 iterator end()
const {
return iterator(*
this, map.end()); }
245MapForKey<M> ValuesForKey(M &m,
typename M::key_type k) {