From: khizmax Date: Sat, 23 Jan 2016 14:33:47 +0000 (+0300) Subject: Added move semantics push(), doc fixed X-Git-Tag: v2.2.0~418 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=15519fbb3919984ca5e019b7dcd810a9e85fb3b9;p=libcds.git Added move semantics push(), doc fixed --- diff --git a/cds/algo/atomic.h b/cds/algo/atomic.h index c2306e86..a30737aa 100644 --- a/cds/algo/atomic.h +++ b/cds/algo/atomic.h @@ -189,12 +189,11 @@ namespace cds { { m_counter.store( 0, atomics::memory_order_release ); } - }; /// Atomic item counter /** - This class is simplified interface around std::atomic_size_t. + This class is simplified interface around \p std::atomic_size_t. The class supports getting of current value of the counter and increment/decrement its value. */ class item_counter diff --git a/cds/container/segmented_queue.h b/cds/container/segmented_queue.h index fa981e26..886a9de6 100644 --- a/cds/container/segmented_queue.h +++ b/cds/container/segmented_queue.h @@ -281,6 +281,17 @@ namespace cds { namespace container { return false; } + /// Inserts a new element at last segment of 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. @@ -304,12 +315,18 @@ namespace cds { namespace container { } - /// Synonym for \p enqueue() member function + /// Synonym for \p enqueue( value_type const& ) member function bool push( value_type const& val ) { return enqueue( val ); } + /// Synonym for \p enqueue( value_type&& ) member function + bool push( value_type&& val ) + { + return enqueue( std::move( val )); + } + /// Synonym for \p enqueue_with() member function template bool push_with( Func f ) @@ -390,7 +407,7 @@ namespace cds { namespace container { /// Clear the queue /** - The function repeatedly calls \ref dequeue until it returns \p nullptr. + The function repeatedly calls \p dequeue() until it returns \p nullptr. The disposer specified in \p Traits template argument is called for each removed item. */ void clear() diff --git a/cds/container/tsigas_cycle_queue.h b/cds/container/tsigas_cycle_queue.h index f87da37c..4893e180 100644 --- a/cds/container/tsigas_cycle_queue.h +++ b/cds/container/tsigas_cycle_queue.h @@ -284,6 +284,17 @@ namespace cds { namespace container { return false; } + /// Enqueues \p val value into 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. @@ -318,12 +329,18 @@ namespace cds { namespace container { return false; } - /// Synonym for template version of \p enqueue() function + /// Synonym for \p enqueue( value_type const& ) bool push( value_type const& data ) { return enqueue( data ); } + /// Synonym for \p enqueue( value_type&& ) + bool push( value_type&& data ) + { + return enqueue( std::move( data )); + } + /// Synonym for \p enqueue_with() function template bool push_with( Func f ) diff --git a/cds/container/vyukov_mpmc_cycle_queue.h b/cds/container/vyukov_mpmc_cycle_queue.h index 783a912c..41dd96ad 100644 --- a/cds/container/vyukov_mpmc_cycle_queue.h +++ b/cds/container/vyukov_mpmc_cycle_queue.h @@ -306,12 +306,24 @@ namespace cds { namespace container { return enqueue_with( [&val]( value_type& dest ){ new ( &dest ) value_type( val ); }); } - /// Synonym for \p enqueue() + /// Enqueues \p val value into the queue, move semantics + bool enqueue( value_type&& val ) + { + return enqueue_with( [&val]( value_type& dest ) { new (&dest) value_type( std::move( val ));}); + } + + /// Synonym for \p enqueue( valuetype const& ) bool push( value_type const& data ) { return enqueue( data ); } + /// Synonym for \p enqueue( value_type&& ) + bool push( value_type&& data ) + { + return enqueue( std::move( data )); + } + /// Synonym for \p enqueue_with() template bool push_with( Func f ) @@ -384,7 +396,7 @@ namespace cds { namespace container { dequeued value. The assignment operator for type \ref value_type is invoked. If queue is empty, the function returns \p false, \p dest is unchanged. */ - bool dequeue(value_type & dest ) + bool dequeue(value_type& dest ) { return dequeue_with( [&dest]( value_type& src ){ dest = std::move( src );}); } diff --git a/cds/opt/options.h b/cds/opt/options.h index 2b1c3ec6..a23aea04 100644 --- a/cds/opt/options.h +++ b/cds/opt/options.h @@ -302,17 +302,17 @@ namespace opt { This option allows to set up appropriate item counting policy for that data structure. Predefined option \p Type: - - atomicity::empty_item_counter - no item counting performed. It is default policy for many + - \p atomicity::empty_item_counter - no item counting performed. It is default policy for many containers - - atomicity::item_counter - the class that provides atomically item counting - - opt::v::sequential_item_counter - simple non-atomic item counter. This item counter is not intended for + - \p atomicity::item_counter - the class that provides atomically item counting + - \p opt::v::sequential_item_counter - simple non-atomic item counter. This item counter is not intended for concurrent containers and may be used only if it is explicitly noted. - You may provide other implementation of atomicity::item_counter interface for your needs. + You may provide other implementation of \p atomicity::item_counter interface for your needs. Note, the item counting in lock-free containers cannot be exact; for example, if item counter for a container returns zero it is not mean that the container is empty. - Thus, item counter may be used for statistical purposes only. + Thus, the item counter may be used for statistical purposes only. */ template struct item_counter {