File: hash_tuple.cpp

package info (click to toggle)
libcds 2.3.3-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,632 kB
  • sloc: cpp: 135,002; ansic: 7,234; perl: 243; sh: 237; makefile: 6
file content (117 lines) | stat: -rw-r--r-- 4,267 bytes parent folder | download | duplicates (3)
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