e9353a78cd4e806de1782fd962c62946c5d52485
[libcds.git] / tests / test-hdr / misc / hash_tuple.cpp
1 //$$CDS-header$$
2
3 #include <cds/opt/hash.h>
4
5 #include "cppunit/cppunit_proxy.h"
6
7 namespace misc {
8     namespace {
9         typedef cds::opt::v::hash_selector< cds::opt::none >::type hashing;
10
11 #define HASHING(_n) \
12         struct hash##_n: public hashing { \
13             template <typename T> size_t operator()( T const& v ) const { return hashing::operator()(v) + _n ; } \
14         };
15
16         HASHING(2)
17         HASHING(3)
18         HASHING(4)
19         HASHING(5)
20         HASHING(6)
21         HASHING(7)
22         HASHING(8)
23         HASHING(9)
24         HASHING(10)
25 #undef HASHING
26     }
27
28     class HashTuple: public CppUnitMini::TestCase
29     {
30         void test()
31         {
32             int nVal = 5;
33             size_t nHash = hashing()(nVal);
34
35             size_t val[16];
36
37             cds::opt::hash< std::tuple< hashing, hash2 > >::pack<cds::opt::none>::hash  h2;
38             h2( val, nVal );
39             CPPUNIT_ASSERT( val[0] == nHash );
40             CPPUNIT_ASSERT( val[1] == nHash + 2 );
41
42             cds::opt::hash< std::tuple< hashing, hash2, hash3 > >::pack<cds::opt::none>::hash  h3;
43             h3( val, nVal );
44             CPPUNIT_ASSERT( val[0] == nHash );
45             CPPUNIT_ASSERT( val[1] == nHash + 2 );
46             CPPUNIT_ASSERT( val[2] == nHash + 3 );
47
48             cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4 > >::pack<cds::opt::none>::hash  h4;
49             h4( val, nVal );
50             CPPUNIT_ASSERT( val[0] == nHash );
51             CPPUNIT_ASSERT( val[1] == nHash + 2 );
52             CPPUNIT_ASSERT( val[2] == nHash + 3 );
53             CPPUNIT_ASSERT( val[3] == nHash + 4 );
54
55             cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5 > >::pack<cds::opt::none>::hash  h5;
56             h5( val, nVal );
57             CPPUNIT_ASSERT( val[0] == nHash );
58             CPPUNIT_ASSERT( val[1] == nHash + 2 );
59             CPPUNIT_ASSERT( val[2] == nHash + 3 );
60             CPPUNIT_ASSERT( val[3] == nHash + 4 );
61             CPPUNIT_ASSERT( val[4] == nHash + 5 );
62
63 #if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1700)
64             // MS VC 11: std::tuple suports up to 5 template params only
65
66             cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6 > >::pack<cds::opt::none>::hash  h6;
67             h6( val, nVal );
68             CPPUNIT_ASSERT( val[0] == nHash );
69             CPPUNIT_ASSERT( val[1] == nHash + 2 );
70             CPPUNIT_ASSERT( val[2] == nHash + 3 );
71             CPPUNIT_ASSERT( val[3] == nHash + 4 );
72             CPPUNIT_ASSERT( val[4] == nHash + 5 );
73             CPPUNIT_ASSERT( val[5] == nHash + 6 );
74
75             cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7 > >::pack<cds::opt::none>::hash  h7;
76             h7( val, nVal );
77             CPPUNIT_ASSERT( val[0] == nHash );
78             CPPUNIT_ASSERT( val[1] == nHash + 2 );
79             CPPUNIT_ASSERT( val[2] == nHash + 3 );
80             CPPUNIT_ASSERT( val[3] == nHash + 4 );
81             CPPUNIT_ASSERT( val[4] == nHash + 5 );
82             CPPUNIT_ASSERT( val[5] == nHash + 6 );
83             CPPUNIT_ASSERT( val[6] == nHash + 7 );
84
85             cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8 > >::pack<cds::opt::none>::hash  h8;
86             h8( val, nVal );
87             CPPUNIT_ASSERT( val[0] == nHash );
88             CPPUNIT_ASSERT( val[1] == nHash + 2 );
89             CPPUNIT_ASSERT( val[2] == nHash + 3 );
90             CPPUNIT_ASSERT( val[3] == nHash + 4 );
91             CPPUNIT_ASSERT( val[4] == nHash + 5 );
92             CPPUNIT_ASSERT( val[5] == nHash + 6 );
93             CPPUNIT_ASSERT( val[6] == nHash + 7 );
94             CPPUNIT_ASSERT( val[7] == nHash + 8 );
95
96             cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9 > >::pack<cds::opt::none>::hash  h9;
97             h9( val, nVal );
98             CPPUNIT_ASSERT( val[0] == nHash );
99             CPPUNIT_ASSERT( val[1] == nHash + 2 );
100             CPPUNIT_ASSERT( val[2] == nHash + 3 );
101             CPPUNIT_ASSERT( val[3] == nHash + 4 );
102             CPPUNIT_ASSERT( val[4] == nHash + 5 );
103             CPPUNIT_ASSERT( val[5] == nHash + 6 );
104             CPPUNIT_ASSERT( val[6] == nHash + 7 );
105             CPPUNIT_ASSERT( val[7] == nHash + 8 );
106             CPPUNIT_ASSERT( val[8] == nHash + 9 );
107
108             cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9, hash10 > >::pack<cds::opt::none>::hash  h10;
109             h10( val, nVal );
110             CPPUNIT_ASSERT( val[0] == nHash );
111             CPPUNIT_ASSERT( val[1] == nHash + 2 );
112             CPPUNIT_ASSERT( val[2] == nHash + 3 );
113             CPPUNIT_ASSERT( val[3] == nHash + 4 );
114             CPPUNIT_ASSERT( val[4] == nHash + 5 );
115             CPPUNIT_ASSERT( val[5] == nHash + 6 );
116             CPPUNIT_ASSERT( val[6] == nHash + 7 );
117             CPPUNIT_ASSERT( val[7] == nHash + 8 );
118             CPPUNIT_ASSERT( val[8] == nHash + 9 );
119             CPPUNIT_ASSERT( val[9] == nHash + 10 );
120 #endif
121         }
122
123     public:
124         CPPUNIT_TEST_SUITE(HashTuple)
125             CPPUNIT_TEST( test )
126         CPPUNIT_TEST_SUITE_END()
127
128     };
129 } // namespace misc
130
131 CPPUNIT_TEST_SUITE_REGISTRATION(misc::HashTuple);