Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/unordered/detail/unique.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
comparison
equal
deleted
inserted
replaced
100:793467b5e61c | 101:c530137014c0 |
---|---|
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
6 | 6 |
7 #ifndef BOOST_UNORDERED_DETAIL_UNIQUE_HPP_INCLUDED | 7 #ifndef BOOST_UNORDERED_DETAIL_UNIQUE_HPP_INCLUDED |
8 #define BOOST_UNORDERED_DETAIL_UNIQUE_HPP_INCLUDED | 8 #define BOOST_UNORDERED_DETAIL_UNIQUE_HPP_INCLUDED |
9 | 9 |
10 #if defined(_MSC_VER) && (_MSC_VER >= 1020) | 10 #include <boost/config.hpp> |
11 # pragma once | 11 #if defined(BOOST_HAS_PRAGMA_ONCE) |
12 #pragma once | |
12 #endif | 13 #endif |
13 | 14 |
14 #include <boost/unordered/detail/table.hpp> | 15 #include <boost/unordered/detail/table.hpp> |
15 #include <boost/unordered/detail/extract_key.hpp> | 16 #include <boost/unordered/detail/extract_key.hpp> |
16 #include <boost/throw_exception.hpp> | 17 #include <boost/throw_exception.hpp> |
25 template <typename A, typename T> | 26 template <typename A, typename T> |
26 struct unique_node : | 27 struct unique_node : |
27 boost::unordered::detail::value_base<T> | 28 boost::unordered::detail::value_base<T> |
28 { | 29 { |
29 typedef typename ::boost::unordered::detail::rebind_wrap< | 30 typedef typename ::boost::unordered::detail::rebind_wrap< |
30 A, unique_node<A, T> >::type::pointer node_pointer; | 31 A, unique_node<A, T> >::type allocator; |
32 typedef typename ::boost::unordered::detail:: | |
33 allocator_traits<allocator>::pointer node_pointer; | |
31 typedef node_pointer link_pointer; | 34 typedef node_pointer link_pointer; |
32 | 35 |
33 link_pointer next_; | 36 link_pointer next_; |
34 std::size_t hash_; | 37 std::size_t hash_; |
35 | 38 |
46 unique_node& operator=(unique_node const&); | 49 unique_node& operator=(unique_node const&); |
47 }; | 50 }; |
48 | 51 |
49 template <typename T> | 52 template <typename T> |
50 struct ptr_node : | 53 struct ptr_node : |
51 boost::unordered::detail::value_base<T>, | |
52 boost::unordered::detail::ptr_bucket | 54 boost::unordered::detail::ptr_bucket |
53 { | 55 { |
56 typedef T value_type; | |
54 typedef boost::unordered::detail::ptr_bucket bucket_base; | 57 typedef boost::unordered::detail::ptr_bucket bucket_base; |
55 typedef ptr_node<T>* node_pointer; | 58 typedef ptr_node<T>* node_pointer; |
56 typedef ptr_bucket* link_pointer; | 59 typedef ptr_bucket* link_pointer; |
57 | 60 |
58 std::size_t hash_; | 61 std::size_t hash_; |
62 boost::unordered::detail::value_base<T> value_base_; | |
59 | 63 |
60 ptr_node() : | 64 ptr_node() : |
61 bucket_base(), | 65 bucket_base(), |
62 hash_(0) | 66 hash_(0) |
63 {} | 67 {} |
64 | 68 |
65 void init(node_pointer) | 69 void init(node_pointer) |
66 { | 70 { |
67 } | 71 } |
72 | |
73 void* address() { return value_base_.address(); } | |
74 value_type& value() { return value_base_.value(); } | |
75 value_type* value_ptr() { return value_base_.value_ptr(); } | |
68 | 76 |
69 private: | 77 private: |
70 ptr_node& operator=(ptr_node const&); | 78 ptr_node& operator=(ptr_node const&); |
71 }; | 79 }; |
72 | 80 |
136 typedef typename pick::link_pointer link_pointer; | 144 typedef typename pick::link_pointer link_pointer; |
137 | 145 |
138 typedef boost::unordered::detail::table_impl<types> table; | 146 typedef boost::unordered::detail::table_impl<types> table; |
139 typedef boost::unordered::detail::set_extractor<value_type> extractor; | 147 typedef boost::unordered::detail::set_extractor<value_type> extractor; |
140 | 148 |
141 typedef boost::unordered::detail::pick_policy::type policy; | 149 typedef typename boost::unordered::detail::pick_policy<T>::type policy; |
142 }; | 150 }; |
143 | 151 |
144 template <typename A, typename K, typename M, typename H, typename P> | 152 template <typename A, typename K, typename M, typename H, typename P> |
145 struct map | 153 struct map |
146 { | 154 { |
161 | 169 |
162 typedef boost::unordered::detail::table_impl<types> table; | 170 typedef boost::unordered::detail::table_impl<types> table; |
163 typedef boost::unordered::detail::map_extractor<key_type, value_type> | 171 typedef boost::unordered::detail::map_extractor<key_type, value_type> |
164 extractor; | 172 extractor; |
165 | 173 |
166 typedef boost::unordered::detail::pick_policy::type policy; | 174 typedef typename boost::unordered::detail::pick_policy<K>::type policy; |
167 }; | 175 }; |
168 | 176 |
169 template <typename Types> | 177 template <typename Types> |
170 struct table_impl : boost::unordered::detail::table<Types> | 178 struct table_impl : boost::unordered::detail::table<Types> |
171 { | 179 { |
527 prev = prev->next_; | 535 prev = prev->next_; |
528 } | 536 } |
529 | 537 |
530 link_pointer end = static_cast<node_pointer>(prev->next_)->next_; | 538 link_pointer end = static_cast<node_pointer>(prev->next_)->next_; |
531 | 539 |
532 std::size_t count = this->delete_nodes(prev, end); | 540 std::size_t deleted_count = this->delete_nodes(prev, end); |
533 this->fix_bucket(bucket_index, prev); | 541 this->fix_bucket(bucket_index, prev); |
534 return count; | 542 return deleted_count; |
535 } | 543 } |
536 | 544 |
537 iterator erase(c_iterator r) | 545 iterator erase(c_iterator r) |
538 { | 546 { |
539 BOOST_ASSERT(r.node_); | 547 BOOST_ASSERT(r.node_); |
548 if (r1 == r2) return iterator(r2.node_); | 556 if (r1 == r2) return iterator(r2.node_); |
549 erase_nodes(r1.node_, r2.node_); | 557 erase_nodes(r1.node_, r2.node_); |
550 return iterator(r2.node_); | 558 return iterator(r2.node_); |
551 } | 559 } |
552 | 560 |
553 void erase_nodes(node_pointer begin, node_pointer end) | 561 void erase_nodes(node_pointer i, node_pointer j) |
554 { | 562 { |
555 std::size_t bucket_index = this->hash_to_bucket(begin->hash_); | 563 std::size_t bucket_index = this->hash_to_bucket(i->hash_); |
556 | 564 |
557 // Find the node before begin. | 565 // Find the node before i. |
558 link_pointer prev = this->get_previous_start(bucket_index); | 566 link_pointer prev = this->get_previous_start(bucket_index); |
559 while(prev->next_ != begin) prev = prev->next_; | 567 while(prev->next_ != i) prev = prev->next_; |
560 | 568 |
561 // Delete the nodes. | 569 // Delete the nodes. |
562 do { | 570 do { |
563 this->delete_node(prev); | 571 this->delete_node(prev); |
564 bucket_index = this->fix_bucket(bucket_index, prev); | 572 bucket_index = this->fix_bucket(bucket_index, prev); |
565 } while (prev->next_ != end); | 573 } while (prev->next_ != j); |
566 } | 574 } |
567 | 575 |
568 //////////////////////////////////////////////////////////////////////// | 576 //////////////////////////////////////////////////////////////////////// |
569 // fill_buckets | 577 // fill_buckets |
570 | 578 |