diff options
Diffstat (limited to 'boost/heap/detail')
-rw-r--r-- | boost/heap/detail/mutable_heap.hpp | 45 | ||||
-rw-r--r-- | boost/heap/detail/stable_heap.hpp | 5 | ||||
-rw-r--r-- | boost/heap/detail/tree_iterator.hpp | 10 |
3 files changed, 49 insertions, 11 deletions
diff --git a/boost/heap/detail/mutable_heap.hpp b/boost/heap/detail/mutable_heap.hpp index 37f6ddfebb..02731f59cb 100644 --- a/boost/heap/detail/mutable_heap.hpp +++ b/boost/heap/detail/mutable_heap.hpp @@ -94,6 +94,10 @@ public: handle_type (void) {} + handle_type(handle_type const & rhs): + iterator(rhs.iterator) + {} + private: explicit handle_type(list_iterator const & it): iterator(it) @@ -166,25 +170,27 @@ protected: public: - class iterator: - public boost::iterator_adaptor<iterator, - const_list_iterator, + template <typename iterator_type> + class iterator_base: + public boost::iterator_adaptor<iterator_base<iterator_type>, + iterator_type, value_type const, boost::bidirectional_traversal_tag> { - typedef boost::iterator_adaptor<iterator, - const_list_iterator, + typedef boost::iterator_adaptor<iterator_base<iterator_type>, + iterator_type, value_type const, boost::bidirectional_traversal_tag> super_t; friend class boost::iterator_core_access; friend class priority_queue_mutable_wrapper; - iterator(void): + iterator_base(void): super_t(0) {} - explicit iterator(const_list_iterator const & it): + template <typename T> + explicit iterator_base(T const & it): super_t(it) {} @@ -192,9 +198,16 @@ public: { return super_t::base()->first; } + + iterator_type get_list_iterator() const + { + return super_t::base_reference(); + } }; - typedef iterator const_iterator; + typedef iterator_base<list_iterator> iterator; + typedef iterator_base<const_list_iterator> const_iterator; + typedef typename object_list::difference_type difference_type; class ordered_iterator: @@ -464,12 +477,22 @@ public: objects.erase(it); } - iterator begin(void) const + const_iterator begin(void) const + { + return const_iterator(objects.begin()); + } + + const_iterator end(void) const + { + return const_iterator(objects.end()); + } + + iterator begin(void) { return iterator(objects.begin()); } - iterator end(void) const + iterator end(void) { return iterator(objects.end()); } @@ -489,7 +512,7 @@ public: static handle_type s_handle_from_iterator(iterator const & it) { - return handle_type(it); + return handle_type(it.get_list_iterator()); } value_compare const & value_comp(void) const diff --git a/boost/heap/detail/stable_heap.hpp b/boost/heap/detail/stable_heap.hpp index e9f3f2cd87..f9101afd10 100644 --- a/boost/heap/detail/stable_heap.hpp +++ b/boost/heap/detail/stable_heap.hpp @@ -263,6 +263,11 @@ struct heap_base<T, Cmp, constant_time_size, StabilityCounterType, true>: rhs.counter_ = 0; } + heap_base(heap_base & rhs): + Cmp(static_cast<Cmp&>(rhs)), + size_holder_type(static_cast<size_holder_type&>(rhs)), counter_(rhs.counter_) + {} + heap_base & operator=(heap_base && rhs) { Cmp::operator=(std::move(static_cast<Cmp&>(rhs))); diff --git a/boost/heap/detail/tree_iterator.hpp b/boost/heap/detail/tree_iterator.hpp index 7a184310dd..83c8d3fb4c 100644 --- a/boost/heap/detail/tree_iterator.hpp +++ b/boost/heap/detail/tree_iterator.hpp @@ -254,6 +254,11 @@ public: return !operator!=(rhs); } + const Node * get_node() const + { + return adaptor_type::base_reference(); + } + private: void increment(void) { @@ -373,6 +378,11 @@ public: { return static_cast<const Node *>(&*it); } + + const Node * get_node() const + { + return get_node(adaptor_type::base_reference()); + } }; |