X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fcontainer%2Fsplit_list_map_nogc.h;h=3ae82f235d3a2ac60de90f074518cd347c4c7ef0;hb=4862d76f4493b907bea9820b215209a26cf851f4;hp=32e97330781ac220e9c2d9e2dc4362e90fc4d79a;hpb=e8a786c9556cb001ef5b0c4e3a975721fc1d2cbc;p=libcds.git diff --git a/cds/container/split_list_map_nogc.h b/cds/container/split_list_map_nogc.h index 32e97330..3ae82f23 100644 --- a/cds/container/split_list_map_nogc.h +++ b/cds/container/split_list_map_nogc.h @@ -1,4 +1,32 @@ -//$$CDS-header$$ +/* + This file is a part of libcds - Concurrent Data Structures library + + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 + + Source code repo: http://github.com/khizmax/libcds/ + Download: http://sourceforge.net/projects/libcds/files/ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ #ifndef CDSLIB_CONTAINER_SPLIT_LIST_MAP_NOGC_H #define CDSLIB_CONTAINER_SPLIT_LIST_MAP_NOGC_H @@ -58,24 +86,51 @@ namespace cds { namespace container { typedef typename base_class::item_counter item_counter; ///< Item counter type typedef typename base_class::stat stat; ///< Internal statistics - //@cond - typedef cds::container::split_list::implementation_tag implementation_tag; - //@endcond - protected: //@cond typedef typename base_class::traits::key_accessor key_accessor; //@endcond public: - /// Forward iterator (see \p SplitListSet::iterator) + ///@name Forward iterators + //@{ + /// Forward iterator /** - Remember, the iterator operator -> and operator * returns \ref value_type pointer and reference. - To access item key and value use it->first and it->second respectively. + The forward iterator for split-list is based on \p OrderedList forward iterator and has some features: + - it has no post-increment operator + - it iterates items in unordered fashion + + The iterator interface: + \code + class iterator { + public: + // Default constructor + iterator(); + + // Copy construtor + iterator( iterator const& src ); + + // Dereference operator + value_type * operator ->() const; + + // Dereference operator + value_type& operator *() const; + + // Preincrement operator + iterator& operator ++(); + + // Assignment operator + iterator& operator = (iterator const& src); + + // Equality operators + bool operator ==(iterator const& i ) const; + bool operator !=(iterator const& i ) const; + }; + \endcode */ typedef typename base_class::iterator iterator; - /// Const forward iterator (see SplitListSet::const_iterator) + /// Const forward iterator typedef typename base_class::const_iterator const_iterator; /// Returns a forward iterator addressing the first element in a map @@ -99,28 +154,29 @@ namespace cds { namespace container { } /// Returns a forward const iterator addressing the first element in a map - //@{ const_iterator begin() const { return base_class::begin(); } + + /// Returns a forward const iterator addressing the first element in a map const_iterator cbegin() const { return base_class::cbegin(); } - //@} /// Returns an const iterator that addresses the location succeeding the last element in a map - //@{ const_iterator end() const { return base_class::end(); } + + /// Returns an const iterator that addresses the location succeeding the last element in a map const_iterator cend() const { return base_class::cend(); } - //@} + //@} public: /// Initialize split-ordered map of default capacity @@ -157,7 +213,7 @@ namespace cds { namespace container { iterator insert( K const& key ) { //TODO: pass arguments by reference (make_pair makes copy) - return base_class::insert( std::make_pair( key, mapped_type() ) ); + return base_class::emplace( key_type( key ), mapped_type()); } /// Inserts new node @@ -174,8 +230,7 @@ namespace cds { namespace container { template iterator insert( K const& key, V const& val ) { - //TODO: pass arguments by reference (make_pair makes copy) - return base_class::insert( std::make_pair( key, val ) ); + return base_class::emplace( key_type( key ), mapped_type( val )); } /// Inserts new node and initialize it by a functor @@ -210,8 +265,8 @@ namespace cds { namespace container { iterator insert_with( const K& key, Func func ) { iterator it = insert( key ); - if ( it != end() ) - func( (*it) ); + if ( it != end()) + func( (*it)); return it; } @@ -224,7 +279,7 @@ namespace cds { namespace container { template iterator emplace( K&& key, Args&&... args ) { - return base_class::emplace( std::forward(key), std::move(mapped_type(std::forward(args)...))); + return base_class::emplace( key_type( std::forward( key )), mapped_type( std::forward( args )...)); } /// Updates the item @@ -233,7 +288,8 @@ namespace cds { namespace container { Otherwise, the function returns an iterator pointing to the item found. Returns std::pair where \p first is an iterator pointing to - item found or inserted (if inserting is not allowed and \p key is not found, the iterator will be \p end()), + item found or inserted (if inserting is not allowed and \p key is not found, the iterator will be \p end()), + \p second is true if new item has been added or \p false if the item already is in the map. */ @@ -241,11 +297,11 @@ namespace cds { namespace container { std::pair update( K const& key, bool bAllowInsert = true ) { //TODO: pass arguments by reference (make_pair makes copy) - return base_class::update( std::make_pair( key, mapped_type() ), bAllowInsert ); + return base_class::update( std::make_pair( key_type( key ), mapped_type()), bAllowInsert ); } //@cond - // Deprecated, use update() template + CDS_DEPRECATED("ensure() is deprecated, use update()") std::pair ensure( K const& key ) { return update( key, true ); @@ -263,8 +319,8 @@ namespace cds { namespace container { return base_class::contains( key ); } //@cond - // Deprecated, use contains() template + CDS_DEPRECATED("deprecated, use contains()") iterator find( K const& key ) { return contains( key ); @@ -281,17 +337,24 @@ namespace cds { namespace container { iterator contains( K const& key, Less pred ) { CDS_UNUSED( pred ); - return base_class::contains( key, cds::details::predicate_wrapper() ); + return base_class::contains( key, cds::details::predicate_wrapper()); } //@cond - // Deprecated, use contains() template + CDS_DEPRECATED("deprecated, use contains()") iterator find_with( K const& key, Less pred ) { return contains( key, pred ); } //@endcond + + /// Clears the set (not atomic, for debugging purposes only) + void clear() + { + base_class::clear(); + } + /// Checks if the map is empty /** Emptiness is checked by item counting: if item count is zero then the map is empty. @@ -313,6 +376,12 @@ namespace cds { namespace container { { return base_class::statistics(); } + + /// Returns internal statistics for \p ordered_list + typename ordered_list::stat const& list_statistics() const + { + return base_class::list_statistics(); + } }; }} // namespace cds::container