X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fcontainer%2Fmsqueue.h;h=db42d3d46325e5864339b63498b7e839757508b8;hb=ce2dd1bbea6a48e0a142f2d726c51a6db48c3f04;hp=f3d558f198aeb7e41da94c0909804b0e8d4ef3fe;hpb=cd515d6402be81b84e2eb0c9d4cf0a1ca9e4d95a;p=libcds.git diff --git a/cds/container/msqueue.h b/cds/container/msqueue.h index f3d558f1..db42d3d4 100644 --- a/cds/container/msqueue.h +++ b/cds/container/msqueue.h @@ -218,6 +218,8 @@ namespace cds { namespace container { typedef typename base_class::stat stat; ///< Internal statistics policy used typedef typename base_class::memory_model memory_model; ///< Memory ordering. See cds::opt::memory_model option + static CDS_CONSTEXPR const size_t c_nHazardPtrCount = base_class::c_nHazardPtrCount; ///< Count of hazard pointer required for the algorithm + protected: //@cond typedef typename maker::node_type node_type; ///< queue node type (derived from \p intrusive::msqueue::node) @@ -268,7 +270,7 @@ namespace cds { namespace container { /// Enqueues \p val value into the queue. /** The function makes queue node in dynamic memory calling copy constructor for \p val - and then it calls intrusive::MSQueue::enqueue. + and then it calls \p intrusive::MSQueue::enqueue. Returns \p true if success, \p false otherwise. */ bool enqueue( value_type const& val ) @@ -281,6 +283,17 @@ namespace cds { namespace container { return false; } + /// Enqueues \p val in the queue, move semantics + bool enqueue( value_type&& val ) + { + scoped_node_ptr p( alloc_node_move( std::move( val ))); + if ( base_class::enqueue( *p ) ) { + p.release(); + return true; + } + return false; + } + /// Enqueues data to the queue using a functor /** \p Func is a functor called to create node. @@ -321,6 +334,12 @@ namespace cds { namespace container { return enqueue( val ); } + /// Synonym for \p enqueue() function + bool push( value_type&& val ) + { + return enqueue( std::move( val )); + } + /// Synonym for \p enqueue_with() function template bool push_with( Func f ) @@ -336,7 +355,7 @@ namespace cds { namespace container { */ bool dequeue( value_type& dest ) { - return dequeue_with( [&dest]( value_type& src ) { dest = src; } ); + return dequeue_with( [&dest]( value_type& src ) { dest = std::move( src );}); } /// Dequeues a value using a functor