3 #ifndef __CDS_CONTAINER_STRIPED_SET_H
4 #define __CDS_CONTAINER_STRIPED_SET_H
6 #include <cds/intrusive/striped_set.h>
7 #include <cds/container/striped_set/adapter.h>
9 namespace cds { namespace container {
12 /** @ingroup cds_nonintrusive_set
15 - [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"
17 Lock striping is very simple technique.
18 The set consists of the bucket table and the array of locks.
19 Initially, the capacity of lock array and bucket table is the same.
20 When set is resized, bucket table capacity will be doubled but lock array will not.
21 The lock \p i protects each bucket \p j, where <tt> j = i mod L </tt>,
22 where \p L - the size of lock array.
25 - \p Container - the container class that is used as bucket table entry. The \p Container class should support
26 an uniform interface described below.
27 - \p Options - options
29 The \p %StripedSet class does not exactly dictate the type of container that should be used as a \p Container bucket.
30 Instead, the class supports different container type for the bucket, for exampe, \p std::list, \p std::set and others.
32 Remember that \p %StripedSet class algorithm ensures sequential blocking access to its bucket through the mutex type you specify
33 among \p Options template arguments.
36 - opt::mutex_policy - concurrent access policy.
37 Available policies: intrusive::striped_set::striping, intrusive::striped_set::refinable.
38 Default is %striped_set::striping.
39 - opt::hash - hash functor. Default option value see opt::v::hash_selector<opt::none> which selects default hash functor for
41 - opt::compare - key comparison functor. No default functor is provided.
42 If the option is not specified, the opt::less is used.
43 - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
44 - opt::item_counter - item counter type. Default is \p atomicity::item_counter since some operation on the counter is performed
45 without locks. Note that item counting is an essential part of the set algorithm, so dummy type like atomicity::empty_item_counter
47 - opt::allocator - the allocator type using for memory allocation of bucket table and lock array. Default is CDS_DEFAULT_ALLOCATOR.
48 - opt::resizing_policy - the resizing policy that is a functor that decides when to resize the hash set.
49 Default option value depends on bucket container type:
50 for sequential containers like \p std::list, \p std::vector the resizing policy is striped_set::load_factor_resizing<4>;
51 for other type of containers like \p std::set, \p std::unordered_set the resizing policy is striped_set::no_resizing.
52 See \ref striped_set namespace for list of all possible types of the option.
53 Note that the choose of resizing policy depends of \p Container type:
54 for sequential containers like \p std::list, \p std::vector and so on, right choosing of the policy can
55 significantly improve performance.
56 For other, non-sequential types of \p Container (like a \p std::set)
57 the resizing policy is not so important.
58 - opt::copy_policy - the copy policy which is used to copy items from the old set to the new one when resizing.
59 The policy can be optionally used in adapted bucket container for performance reasons of resizing.
60 The detail of copy algorithm depends on type of bucket container and explains below.
62 opt::compare or opt::less options are used in some \p Container class for searching an item.
63 opt::compare option has the highest priority: if opt::compare is specified, opt::less is not used.
65 You can pass other option that would be passed to <tt>adapt</tt> metafunction, see below.
67 <b>Internal details</b>
69 The \p %StripedSet class cannot utilize the \p Container container specified directly, but only its adapted variant which
70 supports an unified interface. Internally, the adaptation is made via striped_set::adapt metafunction that wraps bucket container
71 and provides the unified bucket interface suitable for \p %StripedSet. Such adaptation is completely transparent for you -
72 you don't need to call \p adapt metafunction directly, \p %StripedSet class's internal machinery itself invokes appropriate
73 \p adapt metafunction to adjust your \p Container container class to \p %StripedSet bucket's internal interface.
74 All you need is to include a right header before <tt>striped_hash_set.h</tt>.
76 By default, <tt>striped_set::adapt<AnyContainer, Options...> </tt> metafunction does not make any wrapping to \p AnyContainer,
77 so, the result <tt>%striped_set::adapt<AnyContainer, Options...>::type </tt> is the same as \p AnyContainer.
78 However, there are a lot of specializations of <tt>striped_set::adapt</tt> for well-known containers, see table below.
79 Any of this specialization wraps corresponding container making it suitable for the set's bucket.
80 Remember, you should include the proper header file for \p adapt <b>before</b> including <tt>striped_hash_set.h</tt>.
84 <th>.h-file for \p adapt</th>
89 <td> \p std::list</td>
90 <td><tt><cds/container/striped_set/std_list.h></tt></td>
92 #include <cds/container/striped_set/std_list.h>
93 #include <cds/container/striped_hash_set.h>
94 typedef cds::container::StripedSet<
96 cds::opt::less< std::less<T> >
102 Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
106 <td> \p std::vector</td>
107 <td><tt><cds/container/striped_set/std_vector.h></tt></td>
109 #include <cds/container/striped_set/std_vector.h>
110 #include <cds/container/striped_hash_set.h>
111 typedef cds::container::StripedSet<
113 cds::opt::less< std::less<T> >
118 The vector is ordered.
119 Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
123 <td> \p std::set</td>
124 <td><tt><cds/container/striped_set/std_set.h></tt></td>
126 #include <cds/container/striped_set/std_set.h>
127 #include <cds/container/striped_hash_set.h>
128 typedef cds::container::StripedSet<
129 std::set< T, std::less<T> >
137 <td> \p std::unordered_set</td>
138 <td><tt><cds/container/striped_set/std_hash_set.h></tt></td>
140 #include <cds/container/striped_set/std_hash_set.h>
141 #include <cds/container/striped_hash_set.h>
142 typedef cds::container::StripedSet<
152 You should provide two different hash function \p h1 and \p h2 - one for std::unordered_set and other for \p %StripedSet.
153 For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X.
157 <td>\p stdext::hash_set (only for MS VC++ 2008)</td>
158 <td><tt><cds/container/striped_set/std_hash_set.h></tt></td>
160 #include <cds/container/striped_set/std_hash_set.h>
161 #include <cds/container/striped_hash_set.h>
162 typedef cds::container::StripedSet<
164 stdext::hash_compare<
173 You should provide two different hash function \p h1 and \p h2 - one for stdext::hash_set and other for \p %StripedSet.
174 For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X.
178 <td> \p boost::container::slist</td>
179 <td><tt><cds/container/striped_set/boost_slist.h></tt></td>
181 #include <cds/container/striped_set/boost_slist.h>
182 #include <cds/container/striped_hash_set.h>
183 typedef cds::container::StripedSet<
184 boost::container::slist<T>
190 \p Options <b>must</b> contain cds::opt::less or cds::opt::compare.
194 <td> \p boost::container::list</td>
195 <td><tt><cds/container/striped_set/boost_list.h></tt></td>
197 #include <cds/container/striped_set/boost_list.h>
198 #include <cds/container/striped_hash_set.h>
199 typedef cds::container::StripedSet<
200 boost::container::list<T>
206 \p Options <b>must</b> contain cds::opt::less or cds::opt::compare.
210 <td> \p boost::container::vector</td>
211 <td><tt><cds/container/striped_set/boost_vector.h></tt></td>
213 #include <cds/container/striped_set/boost_vector.h>
214 #include <cds/container/striped_hash_set.h>
215 typedef cds::container::StripedSet<
216 boost::container::vector<T>,
217 cds::opt::less< std::less<T> >
222 The vector is ordered.
223 Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
227 <td> \p boost::container::stable_vector</td>
228 <td><tt><cds/container/striped_set/boost_stable_vector.h></tt></td>
230 #include <cds/container/striped_set/boost_stable_vector.h>
231 #include <cds/container/striped_hash_set.h>
232 typedef cds::container::StripedSet<
233 boost::container::stable_vector<T>,
234 cds::opt::less< std::less<T> >
239 The vector is ordered.
240 Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
244 <td> \p boost::container::set</td>
245 <td><tt><cds/container/striped_set/boost_set.h></tt></td>
247 #include <cds/container/striped_set/boost_set.h>
248 #include <cds/container/striped_hash_set.h>
249 typedef cds::container::StripedSet<
250 boost::container::set< T, std::less<T> >
258 <td> \p boost::container::flat_set</td>
259 <td><tt><cds/container/striped_set/boost_flat_set.h></tt></td>
261 #include <cds/container/striped_set/boost_flat_set.h>
262 #include <cds/container/striped_hash_set.h>
263 typedef cds::container::StripedSet<
264 boost::container::flat_set< T, std::less<T> >
272 <td> \p boost::unordered_set</td>
273 <td><tt><cds/container/striped_set/boost_unordered_set.h></tt></td>
275 #include <cds/container/striped_set/boost_unordered_set.h>
276 #include <cds/container/striped_hash_set.h>
277 typedef cds::container::StripedSet<
278 boost::unordered_set<
287 You should provide two different hash function \p h1 and \p h2 - one for boost::unordered_set and other for \p %StripedSet.
288 For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X.
293 You can use another container type as set's bucket.
294 Suppose, you have a container class \p MyBestContainer and you want to integrate it with \p %StripedSet as bucket type.
295 There are two possibility:
296 - either your \p MyBestContainer class has native support of bucket's interface;
297 in this case, you can use default <tt>striped_set::adapt</tt> metafunction;
298 - or your \p MyBestContainer class does not support bucket's interface, which means, that you should develop a specialization
299 <tt>cds::container::striped_set::adapt<MyBestContainer> </tt> metafunction providing necessary interface.
301 The <tt>striped_set::adapt< Container, Options... ></tt> metafunction has two template argument:
302 - \p Container is the class that should be used as the bucket, for example, <tt>std::list< T ></tt>.
303 - \p Options pack is the options from \p %StripedSet declaration. The \p adapt metafunction can use
304 any option from \p Options for its internal use. For example, a \p compare option can be passed to \p adapt
305 metafunction via \p Options argument of \p %StripedSet declaration.
307 See striped_set::adapt metafunction for the description of interface that the bucket container must provide
308 to be %StripedSet compatible.
311 There are three predefined copy policy:
312 - \p cds::container::striped_set::copy_item - copy item from old bucket to new one when resizing using copy ctor. It is default policy for
313 any compiler that do not support move semantics
314 - \p cds::container::striped_set::move_item - move item from old bucket to new one when resizing using move semantics. It is default policy for
315 any compiler that support move semantics. If compiler does not support move semantics, the move policy is the same as \p copy_item
316 - \p cds::container::striped_set::swap_item - copy item from old bucket to new one when resizing using \p std::swap. Not all containers support
317 this copy policy, see details in table below.
319 You can define your own copy policy specifically for your case.
320 Note, right copy policy can significantly improve the performance of resizing.
333 - \p boost::stable_vector
337 void operator()( std::list<T>& list, std::list<T>::iterator itInsert, std::list<T>::iterator itWhat )
339 list.insert( itInsert, *itWhat );
344 // The type T stored in the list must be swappable
346 void operator()( std::list<T>& list, std::list<T>::iterator itInsert, std::list<T>::iterator itWhat )
348 std::swap( *list.insert( itInsert, T() ), *itWhat );
354 void operator()( std::list<T>& list, std::list<T>::iterator itInsert, std::list<T>::iterator itWhat )
356 list.insert( itInsert, std::move( *itWhat ) );
364 - \p std::unordered_set
365 - \p stdext::hash_set (only for MS VC++ 2008)
369 void operator()( std::set<T>& set, std::set<T>::iterator itWhat )
371 set.insert( *itWhat );
374 \p swap_item is not applicable (same as \p copy_item)
378 void operator()( std::set<T>& set, std::set<T>::iterator itWhat )
380 set.insert( std::move( *itWhat ));
386 - \p boost::container::slist
390 void operator()( bc::slist<T>& list, bc::slist<T>::iterator itInsert, bc::slist<T>::iterator itWhat )
392 list.insert_after( itInsert, *itWhat );
397 // The type T stored in the list must be swappable
399 void operator()( bc::slist<T>& list, bc::slist<T>::iterator itInsert, bc::slist<T>::iterator itWhat )
401 std::swap( *list.insert_after( itInsert, T() ), *itWhat );
407 void operator()( bc::slist<T>& list, bc::slist<T>::iterator itInsert, bc::slist<T>::iterator itWhat )
409 list.insert_after( itInsert, std::move( *itWhat ) );
416 <b>Advanced functions</b>
418 <b>libcds</b> provides some advanced functions like \p erase_with, \p find_with,
419 that cannot be supported by all underlying containers.
420 The table below shows whether underlying container supports those functions
421 (the sign "+" means "container supports the function"):
426 <th>\p find_with</th>
427 <th>\p erse_with</th>
430 <td> \p std::list</td>
435 <td> \p std::vector</td>
440 <td> \p std::set</td>
445 <td> \p std::unordered_set</td>
450 <td>\p stdext::hash_set (only for MS VC++ 2008)</td>
455 <td> \p boost::container::slist</td>
460 <td> \p boost::container::list</td>
465 <td> \p boost::container::vector</td>
470 <td> \p boost::container::stable_vector</td>
475 <td> \p boost::container::set</td>
480 <td> \p boost::container::flat_set</td>
485 <td> \p boost::unordered_set</td>
491 template <class Container, CDS_DECL_OPTIONS9>
492 class StripedSet: protected intrusive::StripedSet<Container, CDS_OPTIONS9>
495 typedef intrusive::StripedSet<Container, CDS_OPTIONS9> base_class;
499 typedef typename base_class::default_options default_options;
500 typedef typename base_class::options options;
503 typedef Container underlying_container_type ; ///< original intrusive container type for the bucket
504 typedef typename base_class::bucket_type bucket_type ; ///< container type adapted for hash set
505 typedef typename bucket_type::value_type value_type ; ///< value type stored in the set
507 typedef typename base_class::hash hash ; ///< Hash functor
508 typedef typename base_class::item_counter item_counter ; ///< Item counter
509 typedef typename base_class::resizing_policy resizing_policy ; ///< Resizing policy
510 typedef typename base_class::allocator_type allocator_type ; ///< allocator type specified in options.
511 typedef typename base_class::mutex_policy mutex_policy ; ///< Mutex policy
515 typedef typename base_class::scoped_cell_lock scoped_cell_lock;
516 typedef typename base_class::scoped_full_lock scoped_full_lock;
517 typedef typename base_class::scoped_resize_lock scoped_resize_lock;
522 # ifndef CDS_CXX11_LAMBDA_SUPPORT
523 struct empty_insert_functor {
524 void operator()( value_type& )
528 struct empty_erase_functor {
529 void operator()( value_type const& )
533 struct empty_find_functor {
534 template <typename Q>
535 void operator()( value_type& item, Q& val )
542 /// Default ctor. The initial capacity is 16.
547 /// Ctor with initial capacity specified
549 size_t nCapacity ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
550 ) : base_class( nCapacity )
553 /// Ctor with resizing policy (copy semantics)
555 This constructor initializes m_ResizingPolicy member with copy of \p resizingPolicy parameter
558 size_t nCapacity ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
559 ,resizing_policy const& resizingPolicy ///< Resizing policy
560 ) : base_class( nCapacity, resizingPolicy )
563 #ifdef CDS_RVALUE_SUPPORT
564 /// Ctor with resizing policy (move semantics)
566 This constructor initializes m_ResizingPolicy member moving \p resizingPolicy parameter
567 Move semantics is used. Available only for the compilers that supports C++11 rvalue reference.
570 size_t nCapacity ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
571 ,resizing_policy&& resizingPolicy ///< Resizing policy
572 ) : base_class( nCapacity, std::forward<resizing_policy>(resizingPolicy) )
576 /// Destructor destroys internal data
583 The function creates a node with copy of \p val value
584 and then inserts the node created into the set.
586 The type \p Q should contain as minimum the complete key for the node.
587 The object of \ref value_type should be constructible from a value of type \p Q.
588 In trivial case, \p Q is equal to \ref value_type.
590 Returns \p true if \p val is inserted into the set, \p false otherwise.
592 template <typename Q>
593 bool insert( Q const& val )
595 # ifdef CDS_CXX11_LAMBDA_SUPPORT
596 return insert( val, []( value_type& ) {} );
598 return insert( val, empty_insert_functor() );
604 The function allows to split creating of new item into two part:
605 - create item with key only
606 - insert new item into the set
607 - if inserting is success, calls \p f functor to initialize value-field of new item .
609 The functor signature is:
611 void func( value_type& item );
613 where \p item is the item inserted.
615 The type \p Q can differ from \ref value_type of items storing in the set.
616 Therefore, the \p value_type should be constructible from type \p Q.
618 The user-defined functor is called only if the inserting is success. It can be passed by reference
619 using <tt>boost::ref</tt>
621 template <typename Q, typename Func>
622 bool insert( Q const& val, Func f )
626 size_t nHash = base_class::hashing( val );
627 bucket_type * pBucket;
629 scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
630 pBucket = base_class::bucket( nHash );
631 bOk = pBucket->insert( val, f );
632 bResize = bOk && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
636 base_class::resize();
640 # ifdef CDS_EMPLACE_SUPPORT
641 /// Inserts data of type \p %value_type constructed with <tt>std::forward<Args>(args)...</tt>
643 Returns \p true if inserting successful, \p false otherwise.
645 This function is available only for compiler that supports
646 variadic template and move semantics
648 template <typename... Args>
649 bool emplace( Args&&... args )
653 size_t nHash = base_class::hashing( value_type( std::forward<Args>(args)...));
654 bucket_type * pBucket;
656 scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
657 pBucket = base_class::bucket( nHash );
659 bOk = pBucket->emplace( std::forward<Args>(args)...);
660 bResize = bOk && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
664 base_class::resize();
669 /// Ensures that the \p val exists in the set
671 The operation performs inserting or changing data.
673 If the \p val key not found in the set, then the new item created from \p val
674 is inserted into the set. Otherwise, the functor \p func is called with the item found.
675 The functor \p Func should be a function with signature:
677 void func( bool bNew, value_type& item, const Q& val );
682 void operator()( bool bNew, value_type& item, const Q& val );
687 - \p bNew - \p true if the item has been inserted, \p false otherwise
688 - \p item - item of the list
689 - \p val - argument \p val passed into the \p ensure function
691 The functor can change non-key fields of the \p item.
693 You can pass \p func argument by value or by reference using <tt>boost::ref</tt>.
695 Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
696 \p second is true if new item has been added or \p false if the item with \p val key
699 template <typename Q, typename Func>
700 std::pair<bool, bool> ensure( Q const& val, Func func )
702 std::pair<bool, bool> result;
704 size_t nHash = base_class::hashing( val );
705 bucket_type * pBucket;
707 scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
708 pBucket = base_class::bucket( nHash );
710 result = pBucket->ensure( val, func );
711 bResize = result.first && result.second && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
715 base_class::resize();
719 /// Delete \p key from the set
720 /** \anchor cds_nonintrusive_StripedSet_erase
722 The set item comparator should be able to compare the type \p value_type and the type \p Q.
723 Return \p true if key is found and deleted, \p false otherwise
725 template <typename Q>
726 bool erase( Q const& key )
728 # ifdef CDS_CXX11_LAMBDA_SUPPORT
729 return erase( key, [](value_type const&) {} );
731 return erase( key, empty_erase_functor() );
735 #ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
736 /// Deletes the item from the set using \p pred predicate for searching
738 The function is an analog of \ref cds_nonintrusive_StripedSet_erase "erase(Q const&)"
739 but \p pred is used for key comparing.
740 \p Less functor has the interface like \p std::less.
741 \p pred must imply the same element order as the comparator used for building the set.
743 @note This function is enabled if the compiler supports C++11
744 default template arguments for function template <b>and</b> the underlying container
745 supports \p %erase_with feature.
747 template < typename Q, typename Less
748 ,typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_erase_with >::type >
749 bool erase_with( Q const& key, Less pred )
751 # ifdef CDS_CXX11_LAMBDA_SUPPORT
752 return erase_with( key, pred, [](value_type const&) {} );
754 return erase_with( key, pred, empty_erase_functor() );
759 /// Delete \p key from the set
760 /** \anchor cds_nonintrusive_StripedSet_erase_func
762 The function searches an item with key \p key, calls \p f functor with item found
763 and deletes it. If \p key is not found, the functor is not called.
765 The functor \p Func interface is:
768 void operator()(value_type const& val);
771 The functor can be passed by value or by reference using <tt>boost:ref</tt>
773 Return \p true if key is found and deleted, \p false otherwise
775 template <typename Q, typename Func>
776 bool erase( Q const& key, Func f )
779 size_t nHash = base_class::hashing( key );
781 scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
782 bucket_type * pBucket = base_class::bucket( nHash );
784 bOk = pBucket->erase( key, f );
788 --base_class::m_ItemCounter;
792 #ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
793 /// Deletes the item from the set using \p pred predicate for searching
795 The function is an analog of \ref cds_nonintrusive_StripedSet_erase_func "erase(Q const&, Func)"
796 but \p pred is used for key comparing.
797 \p Less functor has the interface like \p std::less.
798 \p pred must imply the same element order as the comparator used for building the set.
800 @note This function is enabled if the compiler supports C++11
801 default template arguments for function template <b>and</b> the underlying container
802 supports \p %erase_with feature.
804 template < typename Q, typename Less, typename Func
805 , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_erase_with >::type >
806 bool erase_with( Q const& key, Less pred, Func f )
809 size_t nHash = base_class::hashing( key );
811 scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
812 bucket_type * pBucket = base_class::bucket( nHash );
814 bOk = pBucket->erase( key, pred, f );
818 --base_class::m_ItemCounter;
823 /// Find the key \p val
824 /** \anchor cds_nonintrusive_StripedSet_find_func
826 The function searches the item with key equal to \p val and calls the functor \p f for item found.
827 The interface of \p Func functor is:
830 void operator()( value_type& item, Q& val );
833 where \p item is the item found, \p val is the <tt>find</tt> function argument.
835 You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
837 The functor can change non-key fields of \p item.
838 The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
839 can modify both arguments.
841 The type \p Q can differ from \ref value_type of items storing in the container.
842 Therefore, the \p value_type should be comparable with type \p Q.
844 The function returns \p true if \p val is found, \p false otherwise.
846 template <typename Q, typename Func>
847 bool find( Q& val, Func f )
849 return base_class::find( val, f );
852 #ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
853 /// Find the key \p val using \p pred predicate
855 The function is an analog of \ref cds_nonintrusive_StripedSet_find_func "find(Q&, Func)"
856 but \p pred is used for key comparing
857 \p Less has the interface like \p std::less.
858 \p pred must imply the same element order as the comparator used for building the set.
860 @note This function is enabled if the compiler supports C++11
861 default template arguments for function template <b>and</b> the underlying container
862 supports \p %find_with feature.
864 template <typename Q, typename Less, typename Func
865 , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
866 bool find_with( Q& val, Less pred, Func f )
868 return base_class::find_with( val, pred, f );
872 /// Find the key \p val
873 /** \anchor cds_nonintrusive_StripedSet_find_cfunc
875 The function searches the item with key equal to \p val and calls the functor \p f for item found.
876 The interface of \p Func functor is:
879 void operator()( value_type& item, Q const& val );
882 where \p item is the item found, \p val is the <tt>find</tt> function argument.
884 You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
886 The functor can change non-key fields of \p item.
888 The type \p Q can differ from \ref value_type of items storing in the container.
889 Therefore, the \p value_type should be comparable with type \p Q.
891 The function returns \p true if \p val is found, \p false otherwise.
893 template <typename Q, typename Func>
894 bool find( Q const& val, Func f )
896 return base_class::find( val, f );
899 #ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
900 /// Find the key \p val using \p pred predicate
902 The function is an analog of \ref cds_nonintrusive_StripedSet_find_cfunc "find(Q const&, Func)"
903 but \p pred is used for key comparing
904 \p Less has the interface like \p std::less.
905 \p pred must imply the same element order as the comparator used for building the set.
907 @note This function is enabled if the compiler supports C++11
908 default template arguments for function template <b>and</b> the underlying container
909 supports \p %find_with feature.
911 template <typename Q, typename Less, typename Func
912 , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
913 bool find_with( Q const& val, Less pred, Func f )
915 return base_class::find_with( val, pred, f );
919 /// Find the key \p val
920 /** \anchor cds_nonintrusive_StripedSet_find_val
922 The function searches the item with key equal to \p val
923 and returns \p true if it is found, and \p false otherwise.
925 Note the hash functor specified for class \p Traits template parameter
926 should accept a parameter of type \p Q that can be not the same as \ref value_type.
928 template <typename Q>
929 bool find( Q const& val )
931 return base_class::find( val );
934 #ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
935 /// Find the key \p val using \p pred predicate
937 The function is an analog of \ref cds_nonintrusive_StripedSet_find_val "find(Q const&)"
938 but \p pred is used for key comparing
939 \p Less has the interface like \p std::less.
940 \p pred must imply the same element order as the comparator used for building the set.
942 @note This function is enabled if the compiler supports C++11
943 default template arguments for function template <b>and</b> the underlying container
944 supports \p %find_with feature.
946 template <typename Q, typename Less
947 , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
948 bool find_with( Q const& val, Less pred )
950 return base_class::find_with( val, pred );
956 The function erases all items from the set.
960 return base_class::clear();
963 /// Checks if the set is empty
965 Emptiness is checked by item counting: if item count is zero then the set is empty.
969 return base_class::empty();
972 /// Returns item count in the set
975 return base_class::size();
978 /// Returns the size of hash table
980 The hash table size is non-constant and can be increased via resizing.
982 size_t bucket_count() const
984 return base_class::bucket_count();
987 /// Returns lock array size
988 size_t lock_count() const
990 return base_class::lock_count();
993 /// Returns resizing policy object
994 resizing_policy& get_resizing_policy()
996 return base_class::get_resizing_policy();
999 /// Returns resizing policy (const version)
1000 resizing_policy const& get_resizing_policy() const
1002 return base_class::get_resizing_policy();
1006 }} // namespace cds::container
1009 #endif // #ifndef __CDS_CONTAINER_STRIPED_SET_H