X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fcontainer%2Fskip_list_map_nogc.h;h=2171c65053555fc760121747a439303939cdc9ee;hb=f3d187182434846ab9608307037258421101feb9;hp=ffa37b53ebc983bdd1530120e0c74e23e6f16e45;hpb=3caf0699346f9cb714809664697aa29efc7eb429;p=libcds.git diff --git a/cds/container/skip_list_map_nogc.h b/cds/container/skip_list_map_nogc.h index ffa37b53..2171c650 100644 --- a/cds/container/skip_list_map_nogc.h +++ b/cds/container/skip_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-2016 + + 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_SKIP_LIST_MAP_NOGC_H #define CDSLIB_CONTAINER_SKIP_LIST_MAP_NOGC_H @@ -94,10 +122,13 @@ namespace cds { namespace container { {} public: + ///@name Forward ordered 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 a split-list has some features: + - it has no post-increment operator + - it depends on iterator of underlying \p OrderedList */ typedef typename base_class::iterator iterator; @@ -129,6 +160,7 @@ namespace cds { namespace container { { return base_class::begin(); } + /// Returns a forward const iterator addressing the first element in a map const_iterator cbegin() const { @@ -140,11 +172,13 @@ namespace cds { namespace container { { 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: /// Inserts new node with key and default value @@ -162,7 +196,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::insert( std::make_pair( key_type( key ), mapped_type() ) ); } /// Inserts new node @@ -180,7 +214,7 @@ namespace cds { namespace container { 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::insert( std::make_pair( key_type( key ), mapped_type( val ))); } /// Inserts new node and initialize it by a functor @@ -228,50 +262,73 @@ 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)... )); } - /// Ensures that the key \p key exists in the map + /// UPdates data by \p key /** - The operation inserts new item if the key \p key is not found in the map. - Otherwise, the function returns an iterator that points to item found. + The operation inserts new item if \p key is not found in the map and \p bInsert is \p true. + Otherwise, if \p key is found, the function returns an iterator that points to item found. Returns std::pair where \p first is an iterator pointing to - item found or inserted, \p second is true if new item has been added or \p false if the item - already is in the list. + item found or inserted or \p end() if \p key is not found and insertion is not allowed (\p bInsert is \p false), + \p second is \p true if new item has been added or \p false if the item already exists. */ template - std::pair ensure( K const& key ) + std::pair update( K const& key, bool bInsert = true ) { //TODO: pass arguments by reference (make_pair makes copy) - return base_class::ensure( std::make_pair( key, mapped_type() )); + return base_class::update( std::make_pair( key_type( key ), mapped_type() ), bInsert ); } + //@cond + template + CDS_DEPRECATED("ensure() is deprecated, use update()") + std::pair ensure( K const& key ) + { + return update( key, true ); + } + //@endcond - /// Finds the key \p key - /** \anchor cds_nonintrusive_SkipListMap_nogc_find_val - + /// Checks whether the map contains \p key + /** The function searches the item with key equal to \p key and returns an iterator pointed to item found if the key is found, and \ref end() otherwise */ template + iterator contains( K const& key ) + { + return base_class::contains( key ); + } + //@cond + + template + CDS_DEPRECATED("deprecated, use contains()") iterator find( K const& key ) { - return base_class::find( key ); + return contains( key ); } + //@endcond - /// Finds the key \p key with comparing functor \p cmp + /// Checks whether the map contains \p key using \p pred predicate for searching /** - The function is an analog of \ref cds_nonintrusive_SkipListMap_nogc_find_val "find(K const&)" - but \p pred is used for key comparing. + The function is similar to contains( key ) but \p pred is used for key comparing. \p Less functor has the interface like \p std::less. - \p Less must imply the same element order as the comparator used for building the set. + \p Less must imply the same element order as the comparator used for building the map. */ template + iterator contains( K const& key, Less pred ) const + { + return base_class::contains( key, pred ); + } + //@cond + template + CDS_DEPRECATED("deprecated, use contains()") iterator find_with( K const& key, Less pred ) const { - return base_class::find_with( key, pred ); + return contains( key, pred ); } + //@endcond /// Gets minimum key from the map /**