3 #include <cds/opt/hash.h>
5 #include "cppunit/cppunit_proxy.h"
9 typedef cds::opt::v::hash_selector< cds::opt::none >::type hashing;
12 struct hash##_n: public hashing { \
13 template <typename T> size_t operator()( T const& v ) const { return hashing::operator()(v) + _n ; } \
28 class HashTuple: public CppUnitMini::TestCase
33 size_t nHash = hashing()(nVal);
37 cds::opt::hash< std::tuple< hashing, hash2 > >::pack<cds::opt::none>::hash h2;
39 CPPUNIT_ASSERT( val[0] == nHash );
40 CPPUNIT_ASSERT( val[1] == nHash + 2 );
42 cds::opt::hash< std::tuple< hashing, hash2, hash3 > >::pack<cds::opt::none>::hash h3;
44 CPPUNIT_ASSERT( val[0] == nHash );
45 CPPUNIT_ASSERT( val[1] == nHash + 2 );
46 CPPUNIT_ASSERT( val[2] == nHash + 3 );
48 cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4 > >::pack<cds::opt::none>::hash h4;
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 );
55 cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5 > >::pack<cds::opt::none>::hash h5;
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 );
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
66 cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6 > >::pack<cds::opt::none>::hash h6;
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 );
75 cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7 > >::pack<cds::opt::none>::hash h7;
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 );
85 cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8 > >::pack<cds::opt::none>::hash h8;
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 );
96 cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9 > >::pack<cds::opt::none>::hash h9;
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 );
108 cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9, hash10 > >::pack<cds::opt::none>::hash h10;
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 );
124 CPPUNIT_TEST_SUITE(HashTuple)
126 CPPUNIT_TEST_SUITE_END()
131 CPPUNIT_TEST_SUITE_REGISTRATION(misc::HashTuple);