]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/unordered/test/unordered/equality_tests.cpp
bump version to 18.2.4-pve3
[ceph.git] / ceph / src / boost / libs / unordered / test / unordered / equality_tests.cpp
CommitLineData
7c673cae
FG
1
2// Copyright 2008-2009 Daniel James.
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
b32b8144 6// clang-format off
7c673cae
FG
7#include "../helpers/prefix.hpp"
8#include <boost/unordered_set.hpp>
9#include <boost/unordered_map.hpp>
10#include "../helpers/postfix.hpp"
b32b8144 11// clang-format on
7c673cae
FG
12
13#include <boost/preprocessor/seq.hpp>
14#include <list>
15#include "../helpers/test.hpp"
16
b32b8144
FG
17namespace equality_tests {
18 struct mod_compare
19 {
20 bool alt_hash_;
7c673cae 21
b32b8144 22 explicit mod_compare(bool alt_hash = false) : alt_hash_(alt_hash) {}
7c673cae 23
b32b8144 24 bool operator()(int x, int y) const { return x % 1000 == y % 1000; }
7c673cae 25
b32b8144 26 std::size_t operator()(int x) const
7c673cae 27 {
b32b8144
FG
28 return alt_hash_ ? static_cast<std::size_t>(x % 250)
29 : static_cast<std::size_t>((x + 5) % 250);
7c673cae 30 }
b32b8144
FG
31 };
32
33#define UNORDERED_EQUALITY_SET_TEST(seq1, op, seq2) \
11fdf7f2 34 { \
b32b8144
FG
35 boost::unordered_set<int, mod_compare, mod_compare> set1, set2; \
36 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set1, seq1) \
37 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set2, seq2) \
38 BOOST_TEST(set1 op set2); \
11fdf7f2 39 }
b32b8144
FG
40
41#define UNORDERED_EQUALITY_MULTISET_TEST(seq1, op, seq2) \
11fdf7f2 42 { \
b32b8144
FG
43 boost::unordered_multiset<int, mod_compare, mod_compare> set1, set2; \
44 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set1, seq1) \
45 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set2, seq2) \
46 BOOST_TEST(set1 op set2); \
11fdf7f2 47 }
b32b8144
FG
48
49#define UNORDERED_EQUALITY_MAP_TEST(seq1, op, seq2) \
11fdf7f2 50 { \
b32b8144
FG
51 boost::unordered_map<int, int, mod_compare, mod_compare> map1, map2; \
52 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map1, seq1) \
53 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map2, seq2) \
54 BOOST_TEST(map1 op map2); \
11fdf7f2 55 }
b32b8144
FG
56
57#define UNORDERED_EQUALITY_MULTIMAP_TEST(seq1, op, seq2) \
11fdf7f2 58 { \
b32b8144
FG
59 boost::unordered_multimap<int, int, mod_compare, mod_compare> map1, map2; \
60 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map1, seq1) \
61 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map2, seq2) \
62 BOOST_TEST(map1 op map2); \
11fdf7f2 63 }
7c673cae 64
b32b8144
FG
65#define UNORDERED_SET_INSERT(r, set, item) set.insert(item);
66#define UNORDERED_MAP_INSERT(r, map, item) \
67 map.insert(std::pair<int const, int> BOOST_PP_SEQ_TO_TUPLE(item));
68
69 UNORDERED_AUTO_TEST (equality_size_tests) {
70 boost::unordered_set<int> x1, x2;
71 BOOST_TEST(x1 == x2);
72 BOOST_TEST(!(x1 != x2));
73
74 x1.insert(1);
75 BOOST_TEST(x1 != x2);
76 BOOST_TEST(!(x1 == x2));
77 BOOST_TEST(x2 != x1);
78 BOOST_TEST(!(x2 == x1));
79
80 x2.insert(1);
81 BOOST_TEST(x1 == x2);
82 BOOST_TEST(!(x1 != x2));
83
84 x2.insert(2);
85 BOOST_TEST(x1 != x2);
86 BOOST_TEST(!(x1 == x2));
87 BOOST_TEST(x2 != x1);
88 BOOST_TEST(!(x2 == x1));
89 }
90
91 UNORDERED_AUTO_TEST (equality_key_value_tests) {
11fdf7f2
TL
92 UNORDERED_EQUALITY_MULTISET_TEST((1), !=, (2))
93 UNORDERED_EQUALITY_SET_TEST((2), ==, (2))
94 UNORDERED_EQUALITY_MAP_TEST(((1)(1))((2)(1)), !=, ((1)(1))((3)(1)))
b32b8144
FG
95 }
96
97 UNORDERED_AUTO_TEST (equality_collision_test) {
11fdf7f2
TL
98 UNORDERED_EQUALITY_MULTISET_TEST((1), !=, (501))
99 UNORDERED_EQUALITY_MULTISET_TEST((1)(251), !=, (1)(501))
100 UNORDERED_EQUALITY_MULTIMAP_TEST(((251)(1))((1)(1)), !=, ((501)(1))((1)(1)))
101 UNORDERED_EQUALITY_MULTISET_TEST((1)(501), ==, (1)(501))
102 UNORDERED_EQUALITY_SET_TEST((1)(501), ==, (501)(1))
b32b8144
FG
103 }
104
105 UNORDERED_AUTO_TEST (equality_group_size_test) {
11fdf7f2 106 UNORDERED_EQUALITY_MULTISET_TEST((10)(20)(20), !=, (10)(10)(20))
b32b8144 107 UNORDERED_EQUALITY_MULTIMAP_TEST(
11fdf7f2 108 ((10)(1))((20)(1))((20)(1)), !=, ((10)(1))((20)(1))((10)(1)))
b32b8144 109 UNORDERED_EQUALITY_MULTIMAP_TEST(
11fdf7f2 110 ((20)(1))((10)(1))((10)(1)), ==, ((10)(1))((20)(1))((10)(1)))
b32b8144
FG
111 }
112
113 UNORDERED_AUTO_TEST (equality_map_value_test) {
11fdf7f2
TL
114 UNORDERED_EQUALITY_MAP_TEST(((1)(1)), !=, ((1)(2)))
115 UNORDERED_EQUALITY_MAP_TEST(((1)(1)), ==, ((1)(1)))
116 UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(1)), !=, ((1)(2)))
117 UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(1))((1)(1)), !=, ((1)(1))((1)(2)))
118 UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(2))((1)(1)), ==, ((1)(1))((1)(2)))
119 UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(2))((1)(1)), !=, ((1)(1))((1)(3)))
b32b8144
FG
120 }
121
122 UNORDERED_AUTO_TEST (equality_predicate_test) {
11fdf7f2
TL
123 UNORDERED_EQUALITY_SET_TEST((1), !=, (1001))
124 UNORDERED_EQUALITY_MAP_TEST(((1)(2))((1001)(1)), !=, ((1001)(2))((1)(1)))
b32b8144
FG
125 }
126
127 UNORDERED_AUTO_TEST (equality_multiple_group_test) {
128 UNORDERED_EQUALITY_MULTISET_TEST(
129 (1)(1)(1)(1001)(2001)(2001)(2)(1002)(3)(1003)(2003), ==,
11fdf7f2 130 (3)(1003)(2003)(1002)(2)(2001)(2001)(1)(1001)(1)(1))
b32b8144
FG
131 }
132
133 // Test that equality still works when the two containers have
134 // different hash functions but the same equality predicate.
135
136 UNORDERED_AUTO_TEST (equality_different_hash_test) {
137 typedef boost::unordered_set<int, mod_compare, mod_compare> set;
138 set set1(0, mod_compare(false), mod_compare(false));
139 set set2(0, mod_compare(true), mod_compare(true));
140 BOOST_TEST(set1 == set2);
141 set1.insert(1);
142 set2.insert(2);
143 BOOST_TEST(set1 != set2);
144 set1.insert(2);
145 set2.insert(1);
146 BOOST_TEST(set1 == set2);
147 set1.insert(10);
148 set2.insert(20);
149 BOOST_TEST(set1 != set2);
150 set1.insert(20);
151 set2.insert(10);
152 BOOST_TEST(set1 == set2);
153 }
7c673cae
FG
154}
155
156RUN_TESTS()