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