3 #ifndef CDSUNIT_STD_PQUEUE_H
4 #define CDSUNIT_STD_PQUEUE_H
7 #include <mutex> //unique_lock
13 template <typename T, typename Container, typename Lock, typename Less=std::less<typename Container::value_type> >
17 typedef std::priority_queue<value_type, Container, Less> pqueue_type;
22 typedef std::unique_lock<Lock> scoped_lock;
25 bool push( value_type const& val )
27 scoped_lock l( m_Lock );
32 bool pop( value_type& dest )
34 scoped_lock l( m_Lock );
35 if ( !m_PQueue.empty() ) {
36 dest = m_PQueue.top();
43 template <typename Q, typename MoveFunc>
44 bool pop_with( Q& dest, MoveFunc f )
46 scoped_lock l( m_Lock );
47 if ( !m_PQueue.empty() ) {
48 f( dest, m_PQueue.top());
57 scoped_lock l( m_Lock );
58 while ( !m_PQueue.empty() )
62 template <typename Func>
63 void clear_with( Func f )
65 scoped_lock l( m_Lock );
66 while ( !m_PQueue.empty() ) {
74 return m_PQueue.empty();
79 return m_PQueue.size();
82 dummy_stat statistics() const
91 static inline ostream& operator <<( ostream& o, pqueue::dummy_stat )
97 #endif // #ifndef CDSUNIT_STD_PQUEUE_H