71d6091b59bd2e314f7a0a050f9722dbae170ecb
[libcds.git] / tests / unit / map2 / map_type_multilevel_hashmap.h
1 //$$CDS-header$$
2
3 #ifndef CDSUNIT_MAP_TYPE_MULTILEVEL_HASHMAP_H
4 #define CDSUNIT_MAP_TYPE_MULTILEVEL_HASHMAP_H
5
6 #include "map2/map_type.h"
7
8 #include <cds/container/multilevel_hashmap_hp.h>
9 #include <cds/container/multilevel_hashmap_dhp.h>
10
11 #include "print_multilevel_hashset_stat.h"
12 #include "hashing/hash_func.h"
13
14 namespace map2 {
15
16     template <class GC, typename Key, typename T, typename Traits = cc::multilevel_hashmap::traits>
17     class MultiLevelHashMap : public cc::MultiLevelHashMap< GC, Key, T, Traits >
18     {
19         typedef cc::MultiLevelHashMap< GC, Key, T, Traits > base_class;
20     public:
21         template <typename Config>
22         MultiLevelHashMap( Config const& cfg)
23             : base_class( cfg.c_nMultiLevelMap_HeadBits, cfg.c_nMultiLevelMap_ArrayBits )
24         {}
25
26         // for testing
27         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
28         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = false;
29     };
30
31     struct tag_MultiLevelHashMap;
32
33     template <typename Key, typename Value>
34     struct map_type< tag_MultiLevelHashMap, Key, Value >: public map_type_base< Key, Value >
35     {
36         typedef map_type_base< Key, Value > base_class;
37         typedef typename base_class::compare    compare;
38         typedef typename base_class::less       less;
39
40         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value >    MultiLevelHashMap_hp_stdhash;
41         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value >    MultiLevelHashMap_dhp_stdhash;
42
43         struct traits_MultiLevelHashMap_stat: public cc::multilevel_hashmap::make_traits<
44                 co::stat< cc::multilevel_hashmap::stat<>>
45             >::type
46         {};
47
48         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_stat >    MultiLevelHashMap_hp_stdhash_stat;
49         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_stat >    MultiLevelHashMap_dhp_stdhash_stat;
50
51         // SHA256
52         struct traits_MultiLevelHashMap_sha256 : public cc::multilevel_hashmap::traits
53         {
54             typedef ::hashing::sha256 hash;
55         };
56         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_sha256 >    MultiLevelHashMap_hp_sha256;
57         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_sha256 >    MultiLevelHashMap_dhp_sha256;
58
59         struct traits_MultiLevelHashMap_sha256_stat : public traits_MultiLevelHashMap_sha256
60         {
61             typedef cc::multilevel_hashmap::stat<> stat;
62         };
63         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_sha256_stat >    MultiLevelHashMap_hp_sha256_stat;
64         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_sha256_stat >    MultiLevelHashMap_dhp_sha256_stat;
65
66         //MD5
67         struct traits_MultiLevelHashMap_md5 : public cc::multilevel_hashmap::traits
68         {
69             typedef ::hashing::md5 hash;
70         };
71         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_md5 >    MultiLevelHashMap_hp_md5;
72         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_md5 >    MultiLevelHashMap_dhp_md5;
73
74         struct traits_MultiLevelHashMap_md5_stat : public traits_MultiLevelHashMap_md5
75         {
76             typedef cc::multilevel_hashmap::stat<> stat;
77         };
78         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_md5_stat >    MultiLevelHashMap_hp_md5_stat;
79         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_md5_stat >    MultiLevelHashMap_dhp_md5_stat;
80
81         // CityHash
82 #if CDS_BUILD_BITS == 64
83         struct traits_MultiLevelHashMap_city64 : public cc::multilevel_hashmap::traits
84         {
85             typedef ::hashing::city64 hash;
86             typedef ::hashing::city64::less less;
87         };
88         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_city64 >    MultiLevelHashMap_hp_city64;
89         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_city64 >    MultiLevelHashMap_dhp_city64;
90
91         struct traits_MultiLevelHashMap_city64_stat : public traits_MultiLevelHashMap_city64
92         {
93             typedef cc::multilevel_hashmap::stat<> stat;
94         };
95         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_city64_stat >    MultiLevelHashMap_hp_city64_stat;
96         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_city64_stat >    MultiLevelHashMap_dhp_city64_stat;
97
98         struct traits_MultiLevelHashMap_city128 : public cc::multilevel_hashmap::traits
99         {
100             typedef ::hashing::city128 hash;
101             typedef ::hashing::city128::less less;
102         };
103         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_city128 >    MultiLevelHashMap_hp_city128;
104         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_city128 >    MultiLevelHashMap_dhp_city128;
105
106         struct traits_MultiLevelHashMap_city128_stat : public traits_MultiLevelHashMap_city128
107         {
108             typedef cc::multilevel_hashmap::stat<> stat;
109         };
110         typedef MultiLevelHashMap< cds::gc::HP,  Key, Value, traits_MultiLevelHashMap_city128_stat >    MultiLevelHashMap_hp_city128_stat;
111         typedef MultiLevelHashMap< cds::gc::DHP, Key, Value, traits_MultiLevelHashMap_city128_stat >    MultiLevelHashMap_dhp_city128_stat;
112 #endif // CDS_BUILD_BITS == 64
113     };
114
115     template <typename GC, typename K, typename T, typename Traits >
116     static inline void print_stat( MultiLevelHashMap< GC, K, T, Traits > const& m )
117     {
118         CPPUNIT_MSG( m.statistics() );
119     }
120
121 }   // namespace map2
122
123 #endif // #ifndef CDSUNIT_MAP_TYPE_MULTILEVEL_HASHMAP_H