63 lines
1.6 KiB
C++
63 lines
1.6 KiB
C++
//===-- 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
|