From e37fdb240ae40108390bc4affd95ce5f77ae66a9 Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Tue, 17 Jan 2017 14:31:21 +1100 Subject: [PATCH] flat_set/map: add hash_value tests --- src/nfagraph/ng_equivalence.cpp | 4 ++-- unit/internal/flat_map.cpp | 38 +++++++++++++++++++++++++++++++++ unit/internal/flat_set.cpp | 28 ++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/nfagraph/ng_equivalence.cpp b/src/nfagraph/ng_equivalence.cpp index 32a392a6..b9e2bd0d 100644 --- a/src/nfagraph/ng_equivalence.cpp +++ b/src/nfagraph/ng_equivalence.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, Intel Corporation + * Copyright (c) 2015-2017, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -133,7 +133,7 @@ public: friend size_t hash_value(const ClassInfo &c) { size_t val = 0; - boost::hash_combine(val, boost::hash_range(begin(c.rs), end(c.rs))); + boost::hash_combine(val, c.rs); boost::hash_combine(val, c.vertex_flags); boost::hash_combine(val, c.cr); boost::hash_combine(val, c.adjacent_cr); diff --git a/unit/internal/flat_map.cpp b/unit/internal/flat_map.cpp index 54372dec..966a5d8f 100644 --- a/unit/internal/flat_map.cpp +++ b/unit/internal/flat_map.cpp @@ -401,3 +401,41 @@ TEST(flat_map, max_size) { flat_map f; ASSERT_LE(1ULL << 24, f.max_size()); } + +TEST(flat_map, hash_value) { + const vector> input = { + {0, 0}, {3, 1}, {76, 2}, {132, 3}, {77, 4}, {99999, 5}, {100, 6}}; + for (size_t len = 0; len < input.size(); len++) { + flat_map f1(input.begin(), input.begin() + len); + flat_map f2(input.rbegin() + input.size() - len, + input.rend()); + EXPECT_EQ(hash_value(f1), hash_value(f2)); + + // Try removing an element. + auto f3 = f1; + EXPECT_EQ(hash_value(f1), hash_value(f3)); + EXPECT_EQ(hash_value(f2), hash_value(f3)); + if (!f3.empty()) { + f3.erase(f3.begin()); + EXPECT_NE(hash_value(f1), hash_value(f3)); + EXPECT_NE(hash_value(f2), hash_value(f3)); + } + + // Try adding an element. + f3 = f1; + EXPECT_EQ(hash_value(f1), hash_value(f3)); + EXPECT_EQ(hash_value(f2), hash_value(f3)); + f3.emplace(32767, 7); + EXPECT_NE(hash_value(f1), hash_value(f3)); + EXPECT_NE(hash_value(f2), hash_value(f3)); + + // Change a value, but not a key. + f3 = f1; + EXPECT_EQ(hash_value(f1), hash_value(f3)); + EXPECT_EQ(hash_value(f2), hash_value(f3)); + f3.erase(77); + f3.emplace(77, 10); + EXPECT_NE(hash_value(f1), hash_value(f3)); + EXPECT_NE(hash_value(f2), hash_value(f3)); + } +} diff --git a/unit/internal/flat_set.cpp b/unit/internal/flat_set.cpp index 7d45cbb2..3bee0edb 100644 --- a/unit/internal/flat_set.cpp +++ b/unit/internal/flat_set.cpp @@ -392,3 +392,31 @@ TEST(flat_set, max_size) { flat_set f; ASSERT_LE(1ULL << 24, f.max_size()); } + +TEST(flat_set, hash_value) { + const vector input = {0, 15, 3, 1, 20, 32768, + 24000000, 17, 100, 101, 104, 99999}; + for (size_t len = 0; len < input.size(); len++) { + flat_set f1(input.begin(), input.begin() + len); + flat_set f2(input.rbegin() + input.size() - len, input.rend()); + EXPECT_EQ(hash_value(f1), hash_value(f2)); + + // Try removing an element. + auto f3 = f1; + EXPECT_EQ(hash_value(f1), hash_value(f3)); + EXPECT_EQ(hash_value(f2), hash_value(f3)); + if (!f3.empty()) { + f3.erase(f3.begin()); + EXPECT_NE(hash_value(f1), hash_value(f3)); + EXPECT_NE(hash_value(f2), hash_value(f3)); + } + + // Try adding an element. + f3 = f1; + EXPECT_EQ(hash_value(f1), hash_value(f3)); + EXPECT_EQ(hash_value(f2), hash_value(f3)); + f3.insert(32767); + EXPECT_NE(hash_value(f1), hash_value(f3)); + EXPECT_NE(hash_value(f2), hash_value(f3)); + } +}