1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
// Copyright (c) 2006-2018 Maxim Khizhinsky
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <cds_test/ext_gtest.h>
#include <cds/opt/hash.h>
namespace {
typedef cds::opt::v::hash_selector< cds::opt::none >::type hashing;
#define HASHING(_n) \
struct hash##_n: public hashing { \
template <typename T> size_t operator()( T const& v ) const { return hashing::operator()(v) + _n ; } \
};
HASHING(2)
HASHING(3)
HASHING(4)
HASHING(5)
HASHING(6)
HASHING(7)
HASHING(8)
HASHING(9)
HASHING(10)
#undef HASHING
TEST( HashTuple, test )
{
int nVal = 5;
size_t nHash = hashing()(nVal);
size_t val[16];
cds::opt::hash< std::tuple< hashing, hash2 > >::pack<cds::opt::none>::hash h2;
h2( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
cds::opt::hash< std::tuple< hashing, hash2, hash3 > >::pack<cds::opt::none>::hash h3;
h3( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4 > >::pack<cds::opt::none>::hash h4;
h4( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
EXPECT_EQ( val[3], nHash + 4 );
cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5 > >::pack<cds::opt::none>::hash h5;
h5( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
EXPECT_EQ( val[3], nHash + 4 );
EXPECT_EQ( val[4], nHash + 5 );
cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6 > >::pack<cds::opt::none>::hash h6;
h6( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
EXPECT_EQ( val[3], nHash + 4 );
EXPECT_EQ( val[4], nHash + 5 );
EXPECT_EQ( val[5], nHash + 6 );
cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7 > >::pack<cds::opt::none>::hash h7;
h7( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
EXPECT_EQ( val[3], nHash + 4 );
EXPECT_EQ( val[4], nHash + 5 );
EXPECT_EQ( val[5], nHash + 6 );
EXPECT_EQ( val[6], nHash + 7 );
cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8 > >::pack<cds::opt::none>::hash h8;
h8( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
EXPECT_EQ( val[3], nHash + 4 );
EXPECT_EQ( val[4], nHash + 5 );
EXPECT_EQ( val[5], nHash + 6 );
EXPECT_EQ( val[6], nHash + 7 );
EXPECT_EQ( val[7], nHash + 8 );
cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9 > >::pack<cds::opt::none>::hash h9;
h9( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
EXPECT_EQ( val[3], nHash + 4 );
EXPECT_EQ( val[4], nHash + 5 );
EXPECT_EQ( val[5], nHash + 6 );
EXPECT_EQ( val[6], nHash + 7 );
EXPECT_EQ( val[7], nHash + 8 );
EXPECT_EQ( val[8], nHash + 9 );
cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9, hash10 > >::pack<cds::opt::none>::hash h10;
h10( val, nVal );
EXPECT_EQ( val[0], nHash );
EXPECT_EQ( val[1], nHash + 2 );
EXPECT_EQ( val[2], nHash + 3 );
EXPECT_EQ( val[3], nHash + 4 );
EXPECT_EQ( val[4], nHash + 5 );
EXPECT_EQ( val[5], nHash + 6 );
EXPECT_EQ( val[6], nHash + 7 );
EXPECT_EQ( val[7], nHash + 8 );
EXPECT_EQ( val[8], nHash + 9 );
EXPECT_EQ( val[9], nHash + 10 );
}
} // namespace
|