summaryrefslogtreecommitdiff
path: root/boost/heap/detail
diff options
context:
space:
mode:
Diffstat (limited to 'boost/heap/detail')
-rw-r--r--boost/heap/detail/mutable_heap.hpp45
-rw-r--r--boost/heap/detail/stable_heap.hpp5
-rw-r--r--boost/heap/detail/tree_iterator.hpp10
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());
+ }
};