| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- // boost heap
- //
- // Copyright (C) 2010-2011 Tim Blechmann
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_HEAP_POLICIES_HPP
- #define BOOST_HEAP_POLICIES_HPP
- #include <boost/concept_check.hpp>
- #include <boost/parameter/aux_/void.hpp>
- #include <boost/parameter/binding.hpp>
- #include <boost/parameter/name.hpp>
- #include <boost/parameter/parameters.hpp>
- #include <boost/parameter/template_keyword.hpp>
- #include <type_traits>
- #ifdef BOOST_HAS_PRAGMA_ONCE
- # pragma once
- #endif
- namespace boost { namespace heap {
- #ifndef BOOST_DOXYGEN_INVOKED
- BOOST_PARAMETER_TEMPLATE_KEYWORD( allocator )
- BOOST_PARAMETER_TEMPLATE_KEYWORD( compare )
- namespace tag {
- struct stable;
- } // namespace tag
- template < bool T >
- struct stable : boost::parameter::template_keyword< tag::stable, std::integral_constant< bool, T > >
- {};
- namespace tag {
- struct mutable_;
- } // namespace tag
- template < bool T >
- struct mutable_ : boost::parameter::template_keyword< tag::mutable_, std::integral_constant< bool, T > >
- {};
- namespace tag {
- struct constant_time_size;
- } // namespace tag
- template < bool T >
- struct constant_time_size :
- boost::parameter::template_keyword< tag::constant_time_size, std::integral_constant< bool, T > >
- {};
- namespace tag {
- struct store_parent_pointer;
- } // namespace tag
- template < bool T >
- struct store_parent_pointer :
- boost::parameter::template_keyword< tag::store_parent_pointer, std::integral_constant< bool, T > >
- {};
- namespace tag {
- struct arity;
- } // namespace tag
- template < unsigned int T >
- struct arity : boost::parameter::template_keyword< tag::arity, std::integral_constant< int, T > >
- {};
- namespace tag {
- struct objects_per_page;
- } // namespace tag
- template < unsigned int T >
- struct objects_per_page : boost::parameter::template_keyword< tag::objects_per_page, std::integral_constant< int, T > >
- {};
- BOOST_PARAMETER_TEMPLATE_KEYWORD( stability_counter_type )
- namespace detail {
- template < typename bound_args, typename tag_type >
- struct has_arg
- {
- typedef typename boost::parameter::binding< bound_args, tag_type, void >::type type;
- static const bool value = !std::is_void< type >::value;
- };
- template < typename bound_args >
- struct extract_stable
- {
- static const bool has_stable = has_arg< bound_args, tag::stable >::value;
- typedef
- typename std::conditional< has_stable, typename has_arg< bound_args, tag::stable >::type, std::false_type >::type
- stable_t;
- static const bool value = stable_t::value;
- };
- template < typename bound_args >
- struct extract_mutable
- {
- static const bool has_mutable = has_arg< bound_args, tag::mutable_ >::value;
- typedef
- typename std::conditional< has_mutable, typename has_arg< bound_args, tag::mutable_ >::type, std::false_type >::type
- mutable_t;
- static const bool value = mutable_t::value;
- };
- } // namespace detail
- #else
- /** \brief Specifies the predicate for the heap order
- */
- template < typename T >
- struct compare
- {};
- /** \brief Configure heap as mutable
- *
- * Certain heaps need to be configured specifically do be mutable.
- *
- * */
- template < bool T >
- struct mutable_
- {};
- /** \brief Specifies allocator for the internal memory management
- */
- template < typename T >
- struct allocator
- {};
- /** \brief Configure a heap as \b stable
- *
- * A priority queue is stable, if elements with the same priority are popped from the heap, in the same order as
- * they are inserted.
- * */
- template < bool T >
- struct stable
- {};
- /** \brief Specifies the type for stability counter
- *
- * */
- template < typename IntType >
- struct stability_counter_type
- {};
- /** \brief Configures complexity of <tt> size() </tt>
- *
- * Specifies, whether size() should have linear or constant complexity.
- * */
- template < bool T >
- struct constant_time_size
- {};
- /** \brief Store parent pointer in heap node.
- *
- * Maintaining a parent pointer adds some maintenance and size overhead, but iterating a heap is more efficient.
- * */
- template < bool T >
- struct store_parent_pointer
- {};
- /** \brief Specify arity.
- *
- * Specifies the arity of a D-ary heap
- * */
- template < unsigned int T >
- struct arity
- {};
- #endif
- }} // namespace boost::heap
- #endif /* BOOST_HEAP_POLICIES_HPP */
|