Confluent Sets and Maps
map.h
1 /*
2  * Copyright (c) 2017 Olle Liljenzin
3  */
4 
5 #ifndef CONFLUENT_MAP_H_INCLUDED
6 #define CONFLUENT_MAP_H_INCLUDED
7 
8 #include <stdexcept>
9 
10 #include "set.h"
11 
12 namespace confluent {
13 
15 
16 template <class Key,
17  class T,
18  class Compare,
19  class Hash,
20  class Equal,
21  class MappedHash,
22  class MappedEqual>
23 class map_provider;
24 
25 template <class Key,
26  class T,
27  class Compare,
28  class Hash,
29  class Equal,
30  class MappedHash,
31  class MappedEqual>
32 class map;
33 
34 namespace internal {
35 
36 inline size_t hash_combine(size_t h1, size_t h2, size_t h3, size_t h4) {
37  return hash_combine(hash_combine(h1, h2), hash_combine(h3, h4));
38 }
39 
40 struct map_tag {};
41 
42 template <class Traits>
43 node_ptr<Traits> make_node(const env<Traits, map_tag>& env,
44  const typename Traits::value_type& value,
45  node_ptr<typename Traits::key_set_traits> key_node,
46  node_ptr<Traits> left,
47  node_ptr<Traits> right) {
48  return node<Traits>::create(env, value, std::move(key_node), std::move(left),
49  std::move(right), env.hash(value.second));
50 }
51 
52 template <class Traits>
53 node_ptr<Traits> make_node(const env<Traits, map_tag>& env,
54  const typename Traits::value_type& value,
55  node_ptr<Traits> left = nullptr,
56  node_ptr<Traits> right = nullptr) {
57  node_ptr<typename Traits::key_set_traits> key_node = make_node(
58  env.key_set_env_, value.first, left ? left->key_node() : nullptr,
59  right ? right->key_node() : nullptr);
60  return make_node(env, value, std::move(key_node), std::move(left),
61  std::move(right));
62 }
63 
64 template <class Traits>
65 node_ptr<Traits> make_node(const env<Traits, map_tag>& env,
66  const node<Traits>& parent,
67  node_ptr<Traits> left,
68  node_ptr<Traits> right) {
69  node_ptr<typename Traits::key_set_traits> key_node = make_node(
70  env.key_set_env_, *parent.key_node(), left ? left->key_node() : nullptr,
71  right ? right->key_node() : nullptr);
72  return make_node(env, parent.value(), std::move(key_node), std::move(left),
73  std::move(right));
74 }
75 
76 template <class Traits, class Left, class Right>
77 node_ptr<Traits> set_intersection(const env<Traits>& env,
78  Left&& left,
79  Right&& right) {
80  if (!left || !right)
81  return nullptr;
82  if (left->key_node() == right)
83  return std::forward<Left>(left);
84  switch (rank(env.key_set_env_, *left->key_node(), *right)) {
85  case ranking::LEFT: {
86  auto s = split(env.key_set_env_, std::forward<Right>(right), left->key());
87  return join(env, set_intersection(env, left->left_, std::move(s.first)),
88  set_intersection(env, left->right_, std::move(s.second)));
89  }
90  case ranking::RIGHT: {
91  auto s = split(env, std::forward<Left>(left), right->key());
92  return join(env, set_intersection(env, std::move(s.first), right->left_),
93  set_intersection(env, std::move(s.second), right->right_));
94  }
95  default: {
96  return make_node(env, *left,
97  set_intersection(env, left->left_, right->left_),
98  set_intersection(env, left->right_, right->right_));
99  }
100  }
101 }
102 
103 template <class Traits, class Left, class Right>
104 node_ptr<Traits> set_difference(const env<Traits>& env,
105  Left&& left,
106  Right&& right) {
107  if (!left || left->key_node() == right)
108  return nullptr;
109  if (!right)
110  return std::forward<Left>(left);
111  switch (rank(env.key_set_env_, *left->key_node(), *right)) {
112  case ranking::LEFT: {
113  auto s = split(env.key_set_env_, std::forward<Right>(right), left->key());
114  return make_node(env, *left,
115  set_difference(env, left->left_, std::move(s.first)),
116  set_difference(env, left->right_, std::move(s.second)));
117  }
118  case ranking::RIGHT: {
119  auto s = split(env, std::forward<Left>(left), right->key());
120  return join(env, set_difference(env, std::move(s.first), right->left_),
121  set_difference(env, std::move(s.second), right->right_));
122  }
123  default: {
124  return join(env, set_difference(env, left->left_, right->left_),
125  set_difference(env, left->right_, right->right_));
126  }
127  }
128 }
129 
130 template <class Traits, class NodePtr>
131 size_t update(const env<Traits>& env, node_ptr<Traits>* p, NodePtr&& q) {
132  size_t n = size(*p);
133  *p = set_union(env, std::forward<NodePtr>(q), *p);
134  return size(*p) - n;
135 }
136 
137 template <class Traits, class NodePtr>
138 size_t diff(const env<Traits>& env, node_ptr<Traits>* p, NodePtr&& q) {
139  size_t n = size(*p);
140  *p = set_difference(env, *p, std::forward<NodePtr>(q));
141  return n - size(*p);
142 }
143 
144 template <class Traits, class NodePtr>
145 size_t intersect(const env<Traits>& env, node_ptr<Traits>* p, NodePtr&& q) {
146  size_t n = size(*p);
147  *p = set_intersection(env, *p, std::forward<NodePtr>(q));
148  return n - size(*p);
149 }
150 
151 template <class Traits>
152 size_t insert_or_assign(const env<Traits>& env,
153  node_ptr<Traits>* p,
154  const typename Traits::value_type& value) {
155  return update(env, p, make_node(env, value));
156 }
157 
158 template <class Traits, class InputIterator>
159 size_t insert_or_assign(const env<Traits>& env,
160  node_ptr<Traits>* p,
161  InputIterator first,
162  InputIterator last) {
163  return update(env, p, make_node(env, first, last));
164 }
165 
166 template <class Key,
167  class T,
168  class Compare,
169  class Hash,
170  class Equal,
171  class MappedHash,
172  class MappedEqual>
173 struct map_traits {
174  typedef map_tag category;
175  typedef Key key_type;
176  typedef T mapped_type;
177  typedef std::pair<Key, T> value_type;
178  typedef map_provider<Key, T, Compare, Hash, Equal, MappedHash, MappedEqual>
179  provider;
180  typedef map<Key, T, Compare, Hash, Equal, MappedHash, MappedEqual> container;
181  typedef set_traits<Key, Compare, Hash, Equal> key_set_traits;
182 };
183 
184 template <class Traits>
185 struct node<Traits, map_tag> {
186  typedef node_ptr<Traits> ptr_type;
187  typedef typename Traits::key_type key_type;
188  typedef typename Traits::mapped_type mapped_type;
189  typedef typename Traits::value_type value_type;
190  typedef node_ptr<typename Traits::key_set_traits> key_node_ptr;
191  typedef env<Traits> env_type;
192 
193  node(const value_type& value,
194  key_node_ptr key_node,
195  ptr_type left,
196  ptr_type right,
197  size_t hash)
198  : reference_count_(1),
199  value_(value),
200  key_node_(std::move(key_node)),
201  hash_(hash),
202  left_(std::move(left)),
203  right_(std::move(right)) {}
204 
205  static ptr_type create(const env_type& env,
206  const value_type& value,
207  key_node_ptr key_node,
208  ptr_type left,
209  ptr_type right,
210  size_t mapped_hash) {
211  size_t hash = hash_combine(internal::hash(left), internal::hash(right),
212  mapped_hash, key_node->hash_);
213  std::unique_ptr<node> p(new node(value, std::move(key_node),
214  std::move(left), std::move(right), hash));
215  return get_unique_node(env, std::move(p));
216  }
217 
218  const key_type& key() const { return value_.first; }
219  const mapped_type& mapped() const { return value_.second; }
220  const value_type& value() const { return value_; }
221  size_t priority() const { return key_node_->priority(); }
222  size_t size() const { return key_node_->size(); }
223  const key_node_ptr& key_node() const { return key_node_; }
224 
225  std::atomic<size_t> reference_count_;
226  node* next_;
227  value_type value_;
228  key_node_ptr key_node_;
229  const size_t hash_;
230  const ptr_type left_;
231  const ptr_type right_;
232 };
233 
234 template <class Traits>
235 struct env<Traits, map_tag> : env_base<Traits> {
236  typedef typename Traits::provider provider_type;
237  typedef typename Traits::key_type key_type;
238  typedef typename Traits::mapped_type mapped_type;
239  typedef typename Traits::value_type value_type;
240  typedef typename Traits::key_set_traits key_set_traits;
241  typedef env<key_set_traits> key_set_env_type;
242 
243  using env_base<Traits>::provider_;
244 
245  env(provider_type* provider)
246  : env_base<Traits>(provider),
247  key_set_env_(provider->set_provider().get()) {}
248 
249  static bool compare(const key_type& lhs, const key_type& rhs) {
250  return key_set_env_type::compare(lhs, rhs);
251  }
252 
253  static bool compare(const value_type& lhs, const key_type& rhs) {
254  return key_set_env_type::compare(lhs.first, rhs);
255  }
256 
257  static bool compare(const value_type& lhs, const value_type& rhs) {
258  return compare(lhs.first, rhs.first);
259  }
260 
261  static bool equal(const mapped_type& lhs, const mapped_type& rhs) {
262  return provider_->mapped_eq()(lhs, rhs);
263  }
264 
265  static bool equal(const value_type& lhs, const key_type& rhs) {
266  return key_set_env_type::equal(lhs.first, rhs);
267  }
268 
269  static bool equal(const value_type& lhs, const value_type& rhs) {
270  return key_set_env_type::equal(lhs.first, rhs.first) &&
271  provider_->mapped_eq()(lhs.second, rhs.second);
272  }
273 
274  static size_t hash(const mapped_type& mapped) {
275  return provider_->mapped_hash()(mapped);
276  }
277 
278  const key_set_env_type key_set_env_;
279 };
280 
281 } // namespace internal
282 
284 
301 template <class Key,
302  class T,
303  class Compare = std::less<Key>,
304  class Hash = std::hash<Key>,
305  class Equal = std::equal_to<Key>,
306  class MappedHash = std::hash<T>,
307  class MappedEqual = std::equal_to<T>>
309  typedef internal::
310  map_traits<Key, T, Compare, Hash, Equal, MappedHash, MappedEqual>
311  traits;
312 
313  friend struct internal::env_base<traits>;
314 
315  public:
317 
327  map_provider(const MappedHash& mapped_hash = MappedHash(),
328  const MappedEqual& mapped_equal = MappedEqual(),
329  const std::shared_ptr<set_provider_type>& set_provider =
331  : mapped_hash_(mapped_hash),
332  mapped_equal_(mapped_equal),
333  set_provider_(set_provider) {
334  assert(set_provider_);
335  }
336 
337  map_provider(const map_provider&) = delete;
338 
339  ~map_provider() { assert(size() == 0); }
340 
344  const MappedHash& mapped_hash() const { return mapped_hash_; }
345 
349  const MappedEqual& mapped_eq() const { return mapped_equal_; }
350 
354  const std::shared_ptr<set_provider_type>& set_provider() const {
355  return set_provider_;
356  }
357 
361  size_t size() const {
362  std::lock_guard<std::mutex> lock(hash_table_.mutex_);
363  return hash_table_.size_;
364  }
365 
369  static const std::shared_ptr<map_provider>& default_provider() {
370  static const std::shared_ptr<map_provider> provider =
371  std::make_shared<map_provider>();
372  return provider;
373  }
374 
375  private:
376  const MappedHash mapped_hash_;
377  const MappedEqual mapped_equal_;
378  const std::shared_ptr<set_provider_type> set_provider_;
379  internal::hash_table<traits> hash_table_;
380 };
381 
399 template <class Key,
400  class T,
401  class Compare = std::less<Key>,
402  class Hash = std::hash<Key>,
403  class Equal = std::equal_to<Key>,
404  class MappedHash = std::hash<T>,
405  class MappedEqual = std::equal_to<T>>
406 class map {
407  typedef internal::
408  map_traits<Key, T, Compare, Hash, Equal, MappedHash, MappedEqual>
409  traits;
410  typedef internal::set_traits<Key, Compare, Hash, Equal> key_set_traits;
411  typedef internal::env<traits> env_type;
412 
413  public:
414  typedef Key key_type;
415  typedef T mapped_type;
416  typedef std::pair<Key, T> value_type;
420  typedef std::shared_ptr<provider_type> provider_ptr;
421  typedef confluent::iterator<traits> iterator;
422  typedef std::reverse_iterator<iterator> reverse_iterator;
423 
424  private:
426  typedef typename internal::node<traits> node_type;
427  typedef typename internal::node<key_set_traits> key_node_type;
428 
429  friend struct confluent::iterator<traits>;
430 
431  public:
440  : provider_(std::move(provider)) {}
441 
452  template <class InputIterator>
453  map(InputIterator first,
454  InputIterator last,
455  provider_ptr provider = provider_type::default_provider())
456  : provider_(std::move(provider)) {
457  insert(first, last);
458  }
459 
469  map(std::initializer_list<value_type> ilist,
470  provider_ptr provider = provider_type::default_provider())
471  : provider_(std::move(provider)) {
472  insert(ilist);
473  }
474 
485  map(iterator first, iterator last) : map(*first.container_) {
486  retain(first, last);
487  }
488 
498  map(const map& other) : provider_(other.provider_), node_(other.node_) {}
499 
511  map(map&& other)
512  : provider_(std::move(other.provider_)), node_(std::move(other.node_)) {}
513 
514  ~map() { clear(); }
515 
526  size_t insert(const value_type& value) {
527  return internal::insert(env(), &node_, value);
528  }
529 
542  template <class InputIterator>
543  size_t insert(InputIterator first, InputIterator last) {
544  return internal::insert(env(), &node_, first, last);
545  }
546 
558  size_t insert(std::initializer_list<value_type> ilist) {
559  return internal::insert(env(), &node_, ilist.begin(), ilist.end());
560  }
561 
578  size_t insert(const map& other) {
579  check(other);
580  return internal::add(env(), &node_, other.node_);
581  }
582 
594  size_t insert_or_assign(const value_type& value) {
595  return internal::insert_or_assign(env(), &node_, value);
596  }
597 
611  template <class InputIterator>
612  size_t insert_or_assign(InputIterator first, InputIterator last) {
613  return internal::insert_or_assign(env(), &node_, first, last);
614  }
615 
628  size_t insert_or_assign(std::initializer_list<value_type> ilist) {
629  return internal::insert_or_assign(env(), &node_, ilist.begin(),
630  ilist.end());
631  }
632 
650  size_t insert_or_assign(const map& other) {
651  check(other);
652  return internal::update(env(), &node_, other.node_);
653  }
654 
665  size_t erase(const key_type& key) {
666  return internal::erase(env(), &node_, key);
667  }
668 
679  size_t erase(const value_type& value) {
680  return internal::erase(env(), &node_, value);
681  }
682 
697  size_t erase(iterator first, iterator last) {
698  check(first, last);
699  return internal::erase(env(), &node_, first.pos_, last.pos_);
700  }
701 
724  size_t erase(const key_set_type& other) {
725  check(other);
726  return internal::diff(env(), &node_, other.node_);
727  }
728 
749  size_t erase(const map& other) {
750  check(other);
751  return internal::diff(env(), &rank, &node_, other.node_);
752  }
753 
770  size_t retain(iterator first, iterator last) {
771  check(first, last);
772  return internal::retain(env(), &node_, first.pos_, last.pos_);
773  }
774 
797  size_t retain(const key_set_type& other) {
798  check(other);
799  return internal::intersect(env(), &node_, other.node_);
800  }
801 
822  size_t retain(const map& other) {
823  check(other);
824  return internal::intersect(env(), &rank, &node_, other.node_);
825  }
826 
835  void clear() {
836  if (node_)
837  reset(env(), &node_);
838  }
839 
845  void swap(map& other) {
846  provider_.swap(other.provider_);
847  node_.swap(other.node_);
848  }
849 
860  map& operator=(const map& other) {
861  clear();
862  provider_ = other.provider_;
863  node_ = other.node_;
864  return *this;
865  }
866 
880  map& operator=(map&& other) {
881  swap(other);
882  return *this;
883  }
884 
896  map& operator=(std::initializer_list<value_type> ilist) {
897  internal::assign(env(), &node_, ilist.begin(), ilist.end());
898  return *this;
899  }
900 
915  map operator|(const map& rhs) const {
916  check(rhs);
917  return map(provider_, set_union(env(), node_, rhs.node_));
918  }
919 
935  map& operator|=(const map& rhs) {
936  check(rhs);
937  insert(rhs);
938  return *this;
939  }
940 
958  map operator&(const map& rhs) const {
959  check(rhs);
960  return map(provider_, set_intersection(env(), &rank, node_, rhs.node_));
961  }
962 
983  map operator&(const key_set_type& rhs) const {
984  check(rhs);
985  return map(provider_, set_intersection(env(), node_, rhs.node_));
986  }
987 
1006  map& operator&=(const map& rhs) {
1007  check(rhs);
1008  retain(rhs);
1009  return *this;
1010  }
1011 
1031  map& operator&=(const key_set_type& rhs) {
1032  check(rhs);
1033  retain(rhs);
1034  return *this;
1035  }
1036 
1054  map operator-(const map& rhs) const {
1055  check(rhs);
1056  return map(provider_, set_difference(env(), &rank, node_, rhs.node_));
1057  }
1058 
1079  map operator-(const key_set_type& rhs) const {
1080  check(rhs);
1081  return map(provider_, set_difference(env(), node_, rhs.node_));
1082  }
1083 
1102  map& operator-=(const map& rhs) {
1103  check(rhs);
1104  erase(rhs);
1105  return *this;
1106  }
1107 
1127  map& operator-=(const key_set_type& rhs) {
1128  check(rhs);
1129  erase(rhs);
1130  return *this;
1131  }
1132 
1136  iterator begin() const { return iterator(this, 0); }
1137 
1141  iterator end() const { return iterator(this, size()); }
1142 
1146  iterator cbegin() const { return begin(); }
1147 
1151  iterator cend() const { return end(); }
1152 
1156  reverse_iterator rbegin() const { return reverse_iterator(end()); }
1157 
1161  reverse_iterator rend() const { return reverse_iterator(begin()); }
1162 
1171  iterator find(const key_type& key) const {
1172  std::pair<const node_type*, size_t> bound = internal::lower_bound(
1173  node_.get(),
1174  [&](const node_type& p) { return key_comp(p.key(), key); });
1175  if (bound.first && key_eq(bound.first->key(), key))
1176  return iterator(this, bound);
1177  else
1178  return end();
1179  }
1180 
1190  iterator lower_bound(const key_type& key) const {
1191  return iterator(this,
1192  internal::lower_bound(node_.get(), [&](const node_type& p) {
1193  return key_comp(p.key(), key);
1194  }));
1195  }
1196 
1206  iterator upper_bound(const key_type& key) const {
1207  return iterator(this,
1208  internal::lower_bound(node_.get(), [&](const node_type& p) {
1209  return !key_comp(key, p.key());
1210  }));
1211  }
1212 
1224  std::pair<iterator, iterator> equal_range(const key_type& key) const {
1225  return {lower_bound(key), upper_bound(key)};
1226  }
1227 
1237  const mapped_type& at(const key_type& key) const {
1238  const node_type* p =
1239  internal::lower_bound(node_.get(), [&](const node_type& p) {
1240  return key_comp(p.key(), key);
1241  }).first;
1242  if (!p || !key_eq(p->key(), key))
1243  throw std::out_of_range("key not found");
1244  return p->mapped();
1245  }
1246 
1255  const value_type& at_index(size_t k) const {
1256  return internal::at_index(node_.get(), k)->value();
1257  }
1258 
1267  size_t count(const key_type& key) const {
1268  const key_node_type* p =
1269  internal::lower_bound(
1270  node_ ? node_->key_node().get() : nullptr,
1271  [&](const key_node_type& p) { return key_comp(p.key(), key); })
1272  .first;
1273  return p && key_eq(p->key(), key) ? 1 : 0;
1274  }
1275 
1285  size_t count(const key_type& key, const mapped_type& mapped) const {
1286  const node_type* p =
1287  internal::lower_bound(node_.get(), [&](const node_type& p) {
1288  return key_comp(p.key(), key);
1289  }).first;
1290  return p && key_eq(p->key(), key) && mapped_eq(p->mapped(), mapped) ? 1 : 0;
1291  }
1292 
1309  bool includes(const map& other) const {
1310  check(other);
1311  return internal::includes(env(), &map::rank, node_, other.node_);
1312  }
1313 
1320  return key_set_type(provider_->set_provider(),
1321  node_ ? node_->key_node() : nullptr);
1322  }
1323 
1327  const provider_ptr& provider() const { return provider_; }
1328 
1336  bool empty() const { return !node_; }
1337 
1343  size_t size() const { return internal::size(node_); }
1344 
1350  size_t hash() const { return internal::hash(node_); }
1351 
1362  bool operator==(const map& other) const { return node_ == other.node_; }
1363 
1374  bool operator!=(const map& other) const { return node_ != other.node_; }
1375 
1376  private:
1377  typedef typename internal::node_ptr<traits> node_ptr;
1378 
1379  map(provider_ptr provider, node_ptr node)
1380  : provider_(std::move(provider)), node_(std::move(node)) {}
1381 
1382  void check(const map& other) const { assert(provider_ == other.provider_); }
1383 
1384  void check(const key_set_type& other) const {
1385  assert(provider_->set_provider() == other.provider_);
1386  }
1387 
1388  void check(const iterator& first, const iterator& last) const {
1389  assert(provider_ == first.container_->provider_);
1390  assert(provider_ == last.container_->provider_);
1391  assert(first.pos_ <= last.pos_);
1392  assert(last.pos_ <= size());
1393  }
1394 
1395  bool key_comp(const key_type& lhs, const key_type& rhs) const {
1396  return provider_->set_provider()->key_comp()(lhs, rhs);
1397  }
1398 
1399  bool value_comp(const value_type& lhs, const value_type& rhs) const {
1400  return key_comp(lhs.first, rhs.first);
1401  }
1402 
1403  bool key_eq(const key_type& lhs, const key_type& rhs) const {
1404  return provider_->set_provider()->key_eq()(lhs, rhs);
1405  }
1406 
1407  bool mapped_eq(const mapped_type& lhs, const mapped_type& rhs) const {
1408  return provider_->mapped_eq()(lhs, rhs);
1409  }
1410 
1411  bool value_eq(const value_type& lhs, const value_type& rhs) const {
1412  return key_eq(lhs.first, rhs.first) && value_eq(lhs.second, rhs.second);
1413  }
1414 
1415  static internal::ranking rank(const env_type& e,
1416  const node_type& left,
1417  const node_type& right) {
1418  internal::ranking r = internal::rank(e, left, right);
1419  if (r == internal::ranking::SAME && !e.equal(left.mapped(), right.mapped()))
1420  return internal::ranking::NOT_SAME;
1421  return r;
1422  }
1423 
1424  env_type env() const { return {provider_.get()}; }
1425 
1426  provider_ptr provider_;
1427  node_ptr node_;
1428 };
1429 
1439 template <class T,
1440  class Compare,
1441  class Hash,
1442  class Equal,
1443  class MappedHash,
1444  class MappedEqual>
1445 void swap(map<T, Compare, Hash, Equal, MappedHash, MappedEqual>& x,
1446  map<T, Compare, Hash, Equal, MappedHash, MappedEqual>& y) {
1447  x.swap(y);
1448 }
1449 
1459 template <class T,
1460  class Compare,
1461  class Hash,
1462  class Equal,
1463  class MappedHash,
1464  class MappedEqual>
1465 size_t hash(const map<T, Compare, Hash, Equal, MappedHash, MappedEqual>& x) {
1466  return x.hash();
1467 }
1468 
1469 } // namespace confluent
1470 
1471 #endif // CONFLUENT_MAP_H_INCLUDED
size_t insert_or_assign(std::initializer_list< value_type > ilist)
Definition: map.h:628
map & operator&=(const key_set_type &rhs)
Definition: map.h:1031
iterator cbegin() const
Definition: map.h:1146
map & operator=(std::initializer_list< value_type > ilist)
Definition: map.h:896
void clear()
Definition: map.h:835
map & operator&=(const map &rhs)
Definition: map.h:1006
bool includes(const map &other) const
Definition: map.h:1309
Definition: set.h:1141
iterator lower_bound(const key_type &key) const
Definition: map.h:1190
size_t insert_or_assign(const map &other)
Definition: map.h:650
map operator-(const map &rhs) const
Definition: map.h:1054
static const std::shared_ptr< map_provider > & default_provider()
Definition: map.h:369
size_t erase(const key_set_type &other)
Definition: map.h:724
Definition: map.h:406
size_t size() const
Definition: map.h:361
key_set_type key_set() const
Definition: map.h:1319
iterator cend() const
Definition: map.h:1151
const mapped_type & at(const key_type &key) const
Definition: map.h:1237
bool operator==(const map &other) const
Definition: map.h:1362
map(iterator first, iterator last)
Definition: map.h:485
map & operator=(const map &other)
Definition: map.h:860
static const std::shared_ptr< set_provider > & default_provider()
Definition: set.h:1110
size_t insert(const map &other)
Definition: map.h:578
const MappedEqual & mapped_eq() const
Definition: map.h:349
size_t erase(const value_type &value)
Definition: map.h:679
map & operator=(map &&other)
Definition: map.h:880
map_provider(const MappedHash &mapped_hash=MappedHash(), const MappedEqual &mapped_equal=MappedEqual(), const std::shared_ptr< set_provider_type > &set_provider=set_provider_type::default_provider())
Definition: map.h:327
void swap(map &other)
Definition: map.h:845
map & operator-=(const key_set_type &rhs)
Definition: map.h:1127
map(InputIterator first, InputIterator last, provider_ptr provider=provider_type::default_provider())
Definition: map.h:453
const MappedHash & mapped_hash() const
Definition: map.h:344
map operator&(const map &rhs) const
Definition: map.h:958
const provider_ptr & provider() const
Definition: map.h:1327
map operator|(const map &rhs) const
Definition: map.h:915
size_t retain(const map &other)
Definition: map.h:822
size_t size() const
Definition: map.h:1343
size_t count(const key_type &key) const
Definition: map.h:1267
Definition: map.h:308
map operator&(const key_set_type &rhs) const
Definition: map.h:983
size_t insert(const value_type &value)
Definition: map.h:526
size_t insert_or_assign(InputIterator first, InputIterator last)
Definition: map.h:612
reverse_iterator rend() const
Definition: map.h:1161
reverse_iterator rbegin() const
Definition: map.h:1156
size_t erase(const map &other)
Definition: map.h:749
map(provider_ptr provider=provider_type::default_provider())
Definition: map.h:439
map & operator-=(const map &rhs)
Definition: map.h:1102
Definition: set.h:1062
map(std::initializer_list< value_type > ilist, provider_ptr provider=provider_type::default_provider())
Definition: map.h:469
size_t insert(InputIterator first, InputIterator last)
Definition: map.h:543
size_t erase(iterator first, iterator last)
Definition: map.h:697
size_t erase(const key_type &key)
Definition: map.h:665
std::pair< iterator, iterator > equal_range(const key_type &key) const
Definition: map.h:1224
const value_type & at_index(size_t k) const
Definition: map.h:1255
map & operator|=(const map &rhs)
Definition: map.h:935
const std::shared_ptr< set_provider_type > & set_provider() const
Definition: map.h:354
bool empty() const
Definition: map.h:1336
size_t hash() const
Definition: map.h:1350
map(const map &other)
Definition: map.h:498
bool operator!=(const map &other) const
Definition: map.h:1374
iterator begin() const
Definition: map.h:1136
size_t retain(iterator first, iterator last)
Definition: map.h:770
iterator end() const
Definition: map.h:1141
map(map &&other)
Definition: map.h:511
size_t insert_or_assign(const value_type &value)
Definition: map.h:594
iterator find(const key_type &key) const
Definition: map.h:1171
size_t retain(const key_set_type &other)
Definition: map.h:797
size_t insert(std::initializer_list< value_type > ilist)
Definition: map.h:558
iterator upper_bound(const key_type &key) const
Definition: map.h:1206
size_t count(const key_type &key, const mapped_type &mapped) const
Definition: map.h:1285
map operator-(const key_set_type &rhs) const
Definition: map.h:1079