5 #ifndef CONFLUENT_MAP_H_INCLUDED 6 #define CONFLUENT_MAP_H_INCLUDED 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));
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));
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),
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),
76 template <
class Traits,
class Left,
class Right>
77 node_ptr<Traits> set_intersection(
const env<Traits>& env,
82 if (left->key_node() == right)
83 return std::forward<Left>(left);
84 switch (rank(env.key_set_env_, *left->key_node(), *right)) {
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)));
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_));
96 return make_node(env, *left,
97 set_intersection(env, left->left_, right->left_),
98 set_intersection(env, left->right_, right->right_));
103 template <
class Traits,
class Left,
class Right>
104 node_ptr<Traits> set_difference(
const env<Traits>& env,
107 if (!left || left->key_node() == 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)));
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_));
124 return join(env, set_difference(env, left->left_, right->left_),
125 set_difference(env, left->right_, right->right_));
130 template <
class Traits,
class NodePtr>
131 size_t update(
const env<Traits>& env, node_ptr<Traits>* p, NodePtr&& q) {
133 *p = set_union(env, std::forward<NodePtr>(q), *p);
137 template <
class Traits,
class NodePtr>
138 size_t diff(
const env<Traits>& env, node_ptr<Traits>* p, NodePtr&& q) {
140 *p = set_difference(env, *p, std::forward<NodePtr>(q));
144 template <
class Traits,
class NodePtr>
145 size_t intersect(
const env<Traits>& env, node_ptr<Traits>* p, NodePtr&& q) {
147 *p = set_intersection(env, *p, std::forward<NodePtr>(q));
151 template <
class Traits>
152 size_t insert_or_assign(
const env<Traits>& env,
154 const typename Traits::value_type& value) {
155 return update(env, p, make_node(env, value));
158 template <
class Traits,
class InputIterator>
159 size_t insert_or_assign(
const env<Traits>& env,
162 InputIterator last) {
163 return update(env, p, make_node(env, first, last));
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>
180 typedef map<Key, T, Compare, Hash, Equal, MappedHash, MappedEqual> container;
181 typedef set_traits<Key, Compare, Hash, Equal> key_set_traits;
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;
193 node(
const value_type& value,
194 key_node_ptr key_node,
198 : reference_count_(1),
200 key_node_(std::move(key_node)),
202 left_(std::move(left)),
203 right_(std::move(right)) {}
205 static ptr_type create(
const env_type& env,
206 const value_type& value,
207 key_node_ptr key_node,
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));
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_; }
225 std::atomic<size_t> reference_count_;
228 key_node_ptr key_node_;
230 const ptr_type left_;
231 const ptr_type right_;
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;
243 using env_base<Traits>::provider_;
245 env(provider_type* provider)
246 : env_base<Traits>(provider),
247 key_set_env_(provider->set_provider().get()) {}
249 static bool compare(
const key_type& lhs,
const key_type& rhs) {
250 return key_set_env_type::compare(lhs, rhs);
253 static bool compare(
const value_type& lhs,
const key_type& rhs) {
254 return key_set_env_type::compare(lhs.first, rhs);
257 static bool compare(
const value_type& lhs,
const value_type& rhs) {
258 return compare(lhs.first, rhs.first);
261 static bool equal(
const mapped_type& lhs,
const mapped_type& rhs) {
262 return provider_->mapped_eq()(lhs, rhs);
265 static bool equal(
const value_type& lhs,
const key_type& rhs) {
266 return key_set_env_type::equal(lhs.first, rhs);
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);
274 static size_t hash(
const mapped_type& mapped) {
275 return provider_->mapped_hash()(mapped);
278 const key_set_env_type key_set_env_;
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>>
310 map_traits<Key, T, Compare, Hash, Equal, MappedHash, MappedEqual>
313 friend struct internal::env_base<traits>;
328 const MappedEqual& mapped_equal = MappedEqual(),
329 const std::shared_ptr<set_provider_type>&
set_provider =
332 mapped_equal_(mapped_equal),
334 assert(set_provider_);
349 const MappedEqual&
mapped_eq()
const {
return mapped_equal_; }
355 return set_provider_;
362 std::lock_guard<std::mutex> lock(hash_table_.mutex_);
363 return hash_table_.size_;
370 static const std::shared_ptr<map_provider> provider =
371 std::make_shared<map_provider>();
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_;
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>>
408 map_traits<Key, T, Compare, Hash, Equal, MappedHash, MappedEqual>
410 typedef internal::set_traits<Key, Compare, Hash, Equal> key_set_traits;
411 typedef internal::env<traits> env_type;
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;
426 typedef typename internal::node<traits> node_type;
427 typedef typename internal::node<key_set_traits> key_node_type;
429 friend struct confluent::iterator<traits>;
452 template <
class InputIterator>
469 map(std::initializer_list<value_type> ilist,
485 map(iterator first, iterator last) :
map(*first.container_) {
498 map(
const map& other) : provider_(other.provider_), node_(other.node_) {}
512 : provider_(std::move(other.provider_)), node_(std::move(other.node_)) {}
527 return internal::insert(env(), &node_, value);
542 template <
class InputIterator>
543 size_t insert(InputIterator first, InputIterator last) {
544 return internal::insert(env(), &node_, first, last);
558 size_t insert(std::initializer_list<value_type> ilist) {
559 return internal::insert(env(), &node_, ilist.begin(), ilist.end());
580 return internal::add(env(), &node_, other.node_);
595 return internal::insert_or_assign(env(), &node_, value);
611 template <
class InputIterator>
613 return internal::insert_or_assign(env(), &node_, first, last);
629 return internal::insert_or_assign(env(), &node_, ilist.begin(),
652 return internal::update(env(), &node_, other.node_);
666 return internal::erase(env(), &node_, key);
679 size_t erase(
const value_type& value) {
680 return internal::erase(env(), &node_, value);
697 size_t erase(iterator first, iterator last) {
699 return internal::erase(env(), &node_, first.pos_, last.pos_);
726 return internal::diff(env(), &node_, other.node_);
751 return internal::diff(env(), &rank, &node_, other.node_);
770 size_t retain(iterator first, iterator last) {
772 return internal::retain(env(), &node_, first.pos_, last.pos_);
799 return internal::intersect(env(), &node_, other.node_);
824 return internal::intersect(env(), &rank, &node_, other.node_);
837 reset(env(), &node_);
846 provider_.swap(other.provider_);
847 node_.swap(other.node_);
862 provider_ = other.provider_;
897 internal::assign(env(), &node_, ilist.begin(), ilist.end());
917 return map(provider_, set_union(env(), node_, rhs.node_));
960 return map(provider_, set_intersection(env(), &rank, node_, rhs.node_));
985 return map(provider_, set_intersection(env(), node_, rhs.node_));
1056 return map(provider_, set_difference(env(), &rank, node_, rhs.node_));
1081 return map(provider_, set_difference(env(), node_, rhs.node_));
1136 iterator
begin()
const {
return iterator(
this, 0); }
1141 iterator
end()
const {
return iterator(
this,
size()); }
1156 reverse_iterator
rbegin()
const {
return reverse_iterator(
end()); }
1161 reverse_iterator
rend()
const {
return reverse_iterator(
begin()); }
1171 iterator
find(
const key_type& key)
const {
1172 std::pair<const node_type*, size_t> bound = internal::lower_bound(
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);
1191 return iterator(
this,
1192 internal::lower_bound(node_.get(), [&](
const node_type& p) {
1193 return key_comp(p.key(), key);
1207 return iterator(
this,
1208 internal::lower_bound(node_.get(), [&](
const node_type& p) {
1209 return !key_comp(key, p.key());
1224 std::pair<iterator, iterator>
equal_range(
const key_type& key)
const {
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);
1242 if (!p || !key_eq(p->key(), key))
1243 throw std::out_of_range(
"key not found");
1256 return internal::at_index(node_.get(), k)->value();
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); })
1273 return p && key_eq(p->key(), key) ? 1 : 0;
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);
1290 return p && key_eq(p->key(), key) && mapped_eq(p->mapped(), mapped) ? 1 : 0;
1311 return internal::includes(env(), &map::rank, node_, other.node_);
1321 node_ ? node_->key_node() :
nullptr);
1327 const provider_ptr&
provider()
const {
return provider_; }
1343 size_t size()
const {
return internal::size(node_); }
1350 size_t hash()
const {
return internal::hash(node_); }
1377 typedef typename internal::node_ptr<traits> node_ptr;
1380 : provider_(std::move(
provider)), node_(std::move(node)) {}
1382 void check(
const map& other)
const { assert(provider_ == other.provider_); }
1384 void check(
const key_set_type& other)
const {
1385 assert(provider_->set_provider() == other.provider_);
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());
1395 bool key_comp(
const key_type& lhs,
const key_type& rhs)
const {
1396 return provider_->set_provider()->key_comp()(lhs, rhs);
1399 bool value_comp(
const value_type& lhs,
const value_type& rhs)
const {
1400 return key_comp(lhs.first, rhs.first);
1403 bool key_eq(
const key_type& lhs,
const key_type& rhs)
const {
1404 return provider_->set_provider()->key_eq()(lhs, rhs);
1407 bool mapped_eq(
const mapped_type& lhs,
const mapped_type& rhs)
const {
1408 return provider_->mapped_eq()(lhs, rhs);
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);
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;
1424 env_type env()
const {
return {provider_.get()}; }
1426 provider_ptr provider_;
1445 void swap(map<T, Compare, Hash, Equal, MappedHash, MappedEqual>& x,
1446 map<T, Compare, Hash, Equal, MappedHash, MappedEqual>& y) {
1465 size_t hash(
const map<T, Compare, Hash, Equal, MappedHash, MappedEqual>& x) {
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
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
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
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
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