Fixed tests and gcc incompatibilities
[libcds.git] / test / unit / intrusive-set / test_intrusive_feldman_hashset_rcu.h
index a8db5437ce89587ae90b2f1a31b4561e02f6e3b5..6099a8e796b252837265e1097ebb928735b27c0f 100644 (file)
@@ -5,7 +5,7 @@
 
     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:
 
@@ -25,7 +25,7 @@
     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.     
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 #ifndef CDSUNIT_SET_TEST_INTRUSIVE_FELDMAN_HASHSET_RCU_H
@@ -54,21 +54,21 @@ protected:
 
         base_class::test( s );
 
-        ASSERT_TRUE( s.empty() );
+        ASSERT_TRUE( s.empty());
         ASSERT_CONTAINER_SIZE( s, 0 );
 
         typedef typename Set::value_type value_type;
-        size_t const nSetSize = std::max( s.head_size() * 2, static_cast<size_t>(100) );
+        size_t const nSetSize = std::max( s.head_size() * 2, static_cast<size_t>(100));
 
         std::vector< value_type > data;
         std::vector< size_t> indices;
         data.reserve( nSetSize );
         indices.reserve( nSetSize );
         for ( size_t key = 0; key < nSetSize; ++key ) {
-            data.push_back( value_type( static_cast<int>(key) ) );
+            data.push_back( value_type( static_cast<int>(key)));
             indices.push_back( key );
         }
-        shuffle( indices.begin(), indices.end() );
+        shuffle( indices.begin(), indices.end());
 
         typename Set::exempt_ptr xp;
         value_type * rp;
@@ -80,18 +80,18 @@ protected:
 
             {
                 rcu_lock l;
-                rp = s.get( i.key() );
+                rp = s.get( i.key());
                 ASSERT_TRUE( !rp );
             }
 
-            xp = s.extract( i.key() );
+            xp = s.extract( i.key());
             ASSERT_TRUE( !xp );
         }
 
         // fill set
         for ( auto& i : data ) {
             i.nDisposeCount = 0;
-            ASSERT_TRUE( s.insert( i ) );
+            ASSERT_TRUE( s.insert( i ));
         }
 
         // get/extract
@@ -100,30 +100,30 @@ protected:
 
             {
                 rcu_lock l;
-                EXPECT_EQ( i.nFindCount, 0 );
-                rp = s.get( i.key() );
+                EXPECT_EQ( i.nFindCount, 0u );
+                rp = s.get( i.key());
                 ASSERT_FALSE( !rp );
                 ++rp->nFindCount;
-                EXPECT_EQ( i.nFindCount, 1 );
+                EXPECT_EQ( i.nFindCount, 1u );
             }
 
-            EXPECT_EQ( i.nEraseCount, 0 );
+            EXPECT_EQ( i.nEraseCount, 0u );
             xp = s.extract( i.key());
             ASSERT_FALSE( !xp );
             ++xp->nEraseCount;
-            EXPECT_EQ( i.nEraseCount, 1 );
+            EXPECT_EQ( i.nEraseCount, 1u );
 
-            xp = s.extract( i.key() );
+            xp = s.extract( i.key());
             ASSERT_TRUE( !xp );
         }
 
-        ASSERT_TRUE( s.empty() );
+        ASSERT_TRUE( s.empty());
         ASSERT_CONTAINER_SIZE( s, 0 );
 
         // Force retiring cycle
         Set::gc::force_dispose();
         for ( auto& i : data ) {
-            EXPECT_EQ( i.nDisposeCount, 1 );
+            EXPECT_EQ( i.nDisposeCount, 1u );
         }
     }
 
@@ -223,10 +223,29 @@ TYPED_TEST_P( IntrusiveFeldmanHashSet, stat )
     this->test( s );
 }
 
+TYPED_TEST_P( IntrusiveFeldmanHashSet, explicit_hash_size )
+{
+    struct traits: public ci::feldman_hashset::traits
+    {
+        typedef typename TestFixture::hash_accessor2 hash_accessor;
+        enum: size_t {
+            hash_size = sizeof( std::declval<typename TestFixture::key_val>().nKey )
+        };
+        typedef typename TestFixture::cmp2 compare;
+        typedef typename TestFixture::mock_disposer disposer;
+        typedef ci::feldman_hashset::stat<> stat;
+    };
+
+    typedef ci::FeldmanHashSet< typename TestFixture::rcu_type, typename TestFixture::int_item2, traits > set_type;
+
+    set_type s( 8, 3 );
+    this->test( s );
+}
+
 // GCC 5: All test names should be written on single line, otherwise a runtime error will be encountered like as
 // "No test named <test_name> can be found in this test case"
 REGISTER_TYPED_TEST_CASE_P( IntrusiveFeldmanHashSet,
-    compare, less, cmpmix, backoff, stat
+    compare, less, cmpmix, backoff, stat, explicit_hash_size
     );