3 #ifndef CDSUNIT_SET_TYPE_STD_H
4 #define CDSUNIT_SET_TYPE_STD_H
6 #include <unordered_set>
8 #include <mutex> //unique_lock
10 #include "set2/set_type.h"
14 struct std_implementation_tag;
16 template <typename Value, typename Hash, typename Less, typename EqualTo, typename Lock,
17 class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
20 : public std::unordered_set<
29 typedef std::unique_lock<Lock> scoped_lock;
30 typedef std::unordered_set<
38 typedef typename base_class::value_type value_type;
39 typedef std_implementation_tag implementation_tag;
41 StdHashSet( size_t /*nSetSize*/, size_t /*nLoadFactor*/ )
44 template <typename Key>
45 bool find( const Key& key )
47 scoped_lock al( m_lock );
48 return base_class::find( value_type(key) ) != base_class::end();
51 template <typename Key>
52 bool insert( Key const& key )
54 scoped_lock al( m_lock );
55 std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
59 template <typename Key, typename Func>
60 bool insert( Key const& key, Func func )
62 scoped_lock al( m_lock );
63 std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
71 template <typename T, typename Func>
72 std::pair<bool, bool> ensure( const T& key, Func func )
74 scoped_lock al( m_lock );
75 std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
77 func( true, *pRet.first, key );
78 return std::make_pair( true, true );
81 func( false, *pRet.first, key );
82 return std::make_pair( true, false );
86 template <typename Key>
87 bool erase( const Key& key )
89 scoped_lock al( m_lock );
90 return base_class::erase( value_type(key) ) != 0;
93 template <typename T, typename Func>
94 bool erase( const T& key, Func func )
96 scoped_lock al( m_lock );
97 typename base_class::iterator it = base_class::find( value_type(key) );
98 if ( it != base_class::end() ) {
100 return base_class::erase( it ) != base_class::end();
105 std::ostream& dump( std::ostream& stm ) { return stm; }
108 template <typename Value, typename Less, typename Lock,
109 class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
111 class StdSet: public std::set<Value, Less, Alloc>
114 typedef std::unique_lock<Lock> scoped_lock;
115 typedef std::set<Value, Less, Alloc> base_class;
117 typedef typename base_class::key_type value_type;
118 typedef std_implementation_tag implementation_tag;
120 StdSet( size_t /*nMapSize*/, size_t /*nLoadFactor*/ )
123 template <typename Key>
124 bool find( const Key& key )
127 scoped_lock al( m_lock );
128 return base_class::find( v ) != base_class::end();
131 bool insert( value_type const& v )
133 scoped_lock al( m_lock );
134 return base_class::insert( v ).second;
137 template <typename Key, typename Func>
138 bool insert( Key const& key, Func func )
140 scoped_lock al( m_lock );
141 std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
149 template <typename T, typename Func>
150 std::pair<bool, bool> ensure( const T& key, Func func )
152 scoped_lock al( m_lock );
153 std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
155 func( true, *pRet.first, key );
156 return std::make_pair( true, true );
159 func( false, *pRet.first, key );
160 return std::make_pair( true, false );
164 template <typename Key>
165 bool erase( const Key& key )
167 scoped_lock al( m_lock );
168 return base_class::erase( value_type(key) ) != 0;
171 template <typename T, typename Func>
172 bool erase( const T& key, Func func )
174 scoped_lock al( m_lock );
175 typename base_class::iterator it = base_class::find( value_type(key) );
176 if ( it != base_class::end() ) {
179 base_class::erase( it );
185 std::ostream& dump( std::ostream& stm ) { return stm; }
188 template <typename Key, typename Val>
189 struct set_type< std_implementation_tag, Key, Val >: public set_type_base< Key, Val >
191 typedef set_type_base< Key, Val > base_class;
192 using base_class::key_val;
193 using base_class::compare;
194 using base_class::less;
195 using base_class::hash;
197 typedef StdSet< key_val, less, cds::sync::spin > StdSet_Spin;
198 typedef StdSet< key_val, less, lock::NoLock> StdSet_NoLock;
200 typedef StdHashSet< key_val, hash, less, equal_to, cds::sync::spin > StdHashSet_Spin;
201 typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock > StdHashSet_NoLock;
206 #endif // #ifndef CDSUNIT_SET_TYPE_STD_H