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
|
//===-- sanitizer_addrhashmap_test.cpp ------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "sanitizer_common/sanitizer_addrhashmap.h"
#include <unordered_map>
#include "gtest/gtest.h"
namespace __sanitizer {
struct Value {
int payload;
inline bool operator==(const Value& rhs) const {
return payload == rhs.payload;
}
};
using MapTy = AddrHashMap<Value, 11>;
using HandleTy = MapTy::Handle;
using RefMapTy = std::unordered_map<uptr, Value>;
static void ExistsInReferenceMap(const uptr key, const Value& val, void* arg) {
RefMapTy* ref = reinterpret_cast<RefMapTy*>(arg);
const RefMapTy::iterator iter = ref->find(key);
ASSERT_NE(iter, ref->end());
EXPECT_EQ(iter->second, val);
ref->erase(iter);
}
TEST(AddrHashMap, Basic) {
// Use a reference implementation to compare with.
RefMapTy reference_map{
{0x1000, {1}},
{0x2000, {2}},
{0x3000, {3}},
};
MapTy m;
for (const auto& key_val : reference_map) {
const uptr key = key_val.first;
const Value val = key_val.second;
// Insert all the elements.
{
HandleTy h(&m, key);
ASSERT_TRUE(h.created());
h->payload = val.payload;
}
}
// Now check that all the elements are present.
m.ForEach(ExistsInReferenceMap, &reference_map);
EXPECT_TRUE(reference_map.empty());
}
} // namespace __sanitizer
|