| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- // boost heap: concepts
- //
- // Copyright (C) 2010 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_CONCEPTS_HPP
- #define BOOST_HEAP_CONCEPTS_HPP
- #include <boost/concept_check.hpp>
- namespace boost { namespace heap {
- template < class C >
- struct PriorityQueue : boost::ForwardContainer< C >
- {
- typedef typename C::iterator iterator;
- typedef typename C::const_iterator const_iterator;
- typedef typename C::allocator_type allocator_type;
- typedef typename C::value_compare value_compare;
- typedef typename C::value_type value_type;
- typedef typename C::const_reference const_reference;
- BOOST_CONCEPT_USAGE( PriorityQueue )
- {
- BOOST_CONCEPT_ASSERT( (boost::Assignable< value_type >));
- BOOST_CONCEPT_ASSERT( (boost::Container< C >));
- BOOST_CONCEPT_ASSERT( (boost::EqualityComparable< C >));
- BOOST_CONCEPT_ASSERT( (boost::Comparable< C >));
- BOOST_CONCEPT_ASSERT( (boost::Const_BinaryPredicate< value_compare, value_type, value_type >));
- c.swap( c2 );
- c.clear();
- a = c.get_allocator();
- typename PriorityQueue::value_type v;
- c.push( v );
- v = c.top();
- c.pop();
- cmp = c.value_comp();
- // verify tags
- has_ordered_iterators = C::has_ordered_iterators;
- is_mergable = C::is_mergable;
- is_stable = C::is_stable;
- }
- private:
- C c, c2;
- allocator_type a;
- typename C::value_type v;
- value_compare cmp;
- bool has_ordered_iterators, is_mergable, is_stable;
- };
- template < class C >
- struct MergablePriorityQueue : PriorityQueue< C >
- {
- BOOST_CONCEPT_USAGE( MergablePriorityQueue )
- {
- C c, c2;
- c.merge( c2 );
- }
- };
- template < class C >
- struct MutablePriorityQueue : PriorityQueue< C >
- {
- typedef typename C::handle_type handle_type;
- BOOST_CONCEPT_USAGE( MutablePriorityQueue )
- {
- BOOST_CONCEPT_ASSERT( (boost::Assignable< typename MutablePriorityQueue::handle_type >));
- typename MutablePriorityQueue::value_type v;
- typename MutablePriorityQueue::handle_type h = c.push( v );
- typename MutablePriorityQueue::handle_type h2 = c.push( v );
- c.update( h, v );
- c.increase( h, v );
- c.decrease( h, v );
- c.update( h );
- c.increase( h );
- c.decrease( h );
- equal = ( h == h2 );
- not_equal = ( h != h2 );
- h2 = h;
- }
- C c;
- bool equal, not_equal;
- };
- }} // namespace boost::heap
- #endif /* BOOST_HEAP_CONCEPTS_HPP */
|