| 49 | |
| 50 | template <class Hash> |
| 51 | void run_multi_key() { |
| 52 | nr_key_copy = 0; |
| 53 | { |
| 54 | BigKeyHashMap<int, Hash, Ref<Key>, Copy<int>, Ref<Key>> map; |
| 55 | auto v1 = map.get(1, 1, 1); |
| 56 | ASSERT_TRUE(v1.first); |
| 57 | ASSERT_EQ(2, nr_key_copy); |
| 58 | ASSERT_FALSE(map.get(1, 1, 1).first); |
| 59 | ASSERT_EQ(v1.second, map.get(1, 1, 1).second); |
| 60 | ASSERT_EQ(2, nr_key_copy); |
| 61 | |
| 62 | auto v2 = map.get(1, 1, 2); |
| 63 | ASSERT_TRUE(v2.first); |
| 64 | ASSERT_EQ(4, nr_key_copy); |
| 65 | ASSERT_FALSE(map.get(1, 1, 2).first); |
| 66 | ASSERT_EQ(v2.second, map.get(1, 1, 2).second); |
| 67 | ASSERT_NE(v1.second, v2.second); |
| 68 | ASSERT_EQ(4, nr_key_copy); |
| 69 | ASSERT_EQ(4, refcnt); |
| 70 | |
| 71 | ThinHashSet<int*> vals; |
| 72 | for (int run = 0; run < 3; ++run) { |
| 73 | for (int i = 3; i < 5; ++i) { |
| 74 | for (int j = 3; j < 5; ++j) { |
| 75 | for (int k = 3; k < 5; ++k) { |
| 76 | auto ins = map.get(i, j, k); |
| 77 | if (run) { |
| 78 | ASSERT_FALSE(ins.first); |
| 79 | ASSERT_EQ(20, nr_key_copy); |
| 80 | ASSERT_EQ(20, refcnt); |
| 81 | } else { |
| 82 | ASSERT_TRUE(ins.first); |
| 83 | } |
| 84 | vals.insert(ins.second); |
| 85 | } |
| 86 | } |
| 87 | } |
| 88 | } |
| 89 | ASSERT_EQ(8u, vals.size()); |
| 90 | } |
| 91 | ASSERT_EQ(0, refcnt); |
| 92 | } |
| 93 | |
| 94 | } // anonymous namespace |
| 95 | |