#include <boost/heap/detail/heap_node.hpp>
#include <boost/heap/detail/stable_heap.hpp>
#include <boost/heap/detail/tree_iterator.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
{
static const bool constant_time_size = parameter::binding<Parspec,
tag::constant_time_size,
- boost::mpl::true_
+ boost::true_type
>::type::value;
typedef typename detail::make_heap_base<T, Parspec, constant_time_size>::type base_type;
typedef typename detail::make_heap_base<T, Parspec, constant_time_size>::compare_argument compare_argument;
typedef marked_heap_node<typename base_type::internal_type> node_type;
+#ifdef BOOST_NO_CXX11_ALLOCATOR
typedef typename allocator_argument::template rebind<node_type>::other allocator_type;
+#else
+ typedef typename std::allocator_traits<allocator_argument>::template rebind_alloc<node_type> allocator_type;
+#endif
struct type:
base_type,
typedef typename base_maker::compare_argument value_compare;
typedef typename base_maker::allocator_type allocator_type;
+#ifdef BOOST_NO_CXX11_ALLOCATOR
typedef typename allocator_type::pointer node_pointer;
typedef typename allocator_type::const_pointer const_node_pointer;
+#else
+ typedef std::allocator_traits<allocator_type> allocator_traits;
+ typedef typename allocator_traits::pointer node_pointer;
+ typedef typename allocator_traits::const_pointer const_node_pointer;
+#endif
typedef detail::heap_node_list node_list_type;
typedef typename node_list_type::iterator node_list_iterator;
typedef typename implementation_defined::difference_type difference_type;
typedef typename implementation_defined::value_compare value_compare;
typedef typename implementation_defined::allocator_type allocator_type;
+#ifndef BOOST_NO_CXX11_ALLOCATOR
+ typedef typename implementation_defined::allocator_traits allocator_traits;
+#endif
typedef typename implementation_defined::reference reference;
typedef typename implementation_defined::const_reference const_reference;
typedef typename implementation_defined::pointer pointer;
/// \copydoc boost::heap::priority_queue::max_size
size_type max_size(void) const
{
+#ifdef BOOST_NO_CXX11_ALLOCATOR
return allocator_type::max_size();
+#else
+ const allocator_type& alloc = *this;
+ return allocator_traits::max_size(alloc);
+#endif
}
/// \copydoc boost::heap::priority_queue::clear
{
size_holder::increment();
+#ifdef BOOST_NO_CXX11_ALLOCATOR
node_pointer n = allocator_type::allocate(1);
-
new(n) node(super_t::make_node(v));
+#else
+ allocator_type& alloc = *this;
+ node_pointer n = allocator_traits::allocate(alloc, 1);
+ allocator_traits::construct(alloc, n, super_t::make_node(v));
+#endif
roots.push_front(*n);
if (!top_element || super_t::operator()(top_element->value, n->value))
{
size_holder::increment();
+#ifdef BOOST_NO_CXX11_ALLOCATOR
node_pointer n = allocator_type::allocate(1);
-
new(n) node(super_t::make_node(std::forward<Args>(args)...));
+#else
+ allocator_type& alloc = *this;
+ node_pointer n = allocator_traits::allocate(alloc, 1);
+ allocator_traits::construct(alloc, n, super_t::make_node(std::forward<Args>(args)...));
+#endif
roots.push_front(*n);
if (!top_element || super_t::operator()(top_element->value, n->value))
{
add_children_to_root(erased_node);
+#ifdef BOOST_NO_CXX11_ALLOCATOR
erased_node->~node();
allocator_type::deallocate(erased_node, 1);
+#else
+ allocator_type& alloc = *this;
+ allocator_traits::destroy(alloc, erased_node);
+ allocator_traits::deallocate(alloc, erased_node, 1);
+#endif
size_holder::decrement();
if (!empty())