| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <string> |
| | #include <utility> |
| | #include <vector> |
| |
|
| | #include "gtest/gtest.h" |
| | #include "lru/lru.hpp" |
| | #include "tests/move-aware-dummies.hpp" |
| |
|
| | struct MoveAwarenessTest : public ::testing::Test { |
| | MoveAwarenessTest() { |
| | MoveAwareKey::reset(); |
| | MoveAwareValue::reset(); |
| | } |
| |
|
| | LRU::Cache<MoveAwareKey, MoveAwareValue> cache; |
| | }; |
| |
|
| | TEST_F(MoveAwarenessTest, DoesNotMoveForInsert) { |
| | cache.insert("x", "y"); |
| |
|
| | |
| | ASSERT_EQ(MoveAwareKey::forwarding_count, 1); |
| | ASSERT_EQ(MoveAwareValue::forwarding_count, 1); |
| |
|
| | ASSERT_EQ(MoveAwareKey::copy_count, 1); |
| |
|
| | |
| | ASSERT_EQ(MoveAwareValue::copy_count, 1); |
| |
|
| | |
| | ASSERT_EQ(cache["x"], "y"); |
| | } |
| |
|
| | TEST_F(MoveAwarenessTest, ForwardsValuesWell) { |
| | cache.emplace("x", "y"); |
| |
|
| | |
| | EXPECT_GE(MoveAwareKey::forwarding_count, 1); |
| | EXPECT_GE(MoveAwareValue::forwarding_count, 1); |
| |
|
| | EXPECT_EQ(MoveAwareKey::copy_count, 0); |
| | EXPECT_EQ(MoveAwareValue::copy_count, 0); |
| |
|
| | ASSERT_EQ(cache["x"], "y"); |
| | } |
| |
|
| | TEST_F(MoveAwarenessTest, MovesSingleRValues) { |
| | cache.emplace(std::string("x"), std::string("y")); |
| |
|
| | |
| | EXPECT_EQ(MoveAwareKey::move_count, 1); |
| | EXPECT_EQ(MoveAwareValue::move_count, 1); |
| |
|
| | EXPECT_EQ(MoveAwareKey::non_move_count, 0); |
| | EXPECT_EQ(MoveAwareValue::non_move_count, 0); |
| |
|
| | EXPECT_EQ(MoveAwareKey::copy_count, 0); |
| | EXPECT_EQ(MoveAwareValue::copy_count, 0); |
| |
|
| | ASSERT_EQ(cache["x"], "y"); |
| | } |
| |
|
| | TEST_F(MoveAwarenessTest, CopiesSingleLValues) { |
| | std::string x("x"); |
| | std::string y("y"); |
| | cache.emplace(x, y); |
| |
|
| | |
| | EXPECT_EQ(MoveAwareKey::non_move_count, 1); |
| | EXPECT_EQ(MoveAwareValue::non_move_count, 1); |
| |
|
| | EXPECT_EQ(MoveAwareKey::move_count, 0); |
| | EXPECT_EQ(MoveAwareValue::move_count, 0); |
| |
|
| | EXPECT_EQ(MoveAwareKey::copy_count, 0); |
| | EXPECT_EQ(MoveAwareValue::copy_count, 0); |
| |
|
| | ASSERT_EQ(cache["x"], "y"); |
| | } |
| |
|
| | TEST_F(MoveAwarenessTest, MovesRValueTuples) { |
| | cache.emplace(std::piecewise_construct, |
| | std::forward_as_tuple(1, 3.14), |
| | std::forward_as_tuple(2, 2.718)); |
| |
|
| | |
| | |
| | EXPECT_EQ(MoveAwareKey::move_count, 1); |
| | EXPECT_EQ(MoveAwareValue::move_count, 1); |
| |
|
| | EXPECT_EQ(MoveAwareKey::non_move_count, 0); |
| | EXPECT_EQ(MoveAwareValue::non_move_count, 0); |
| |
|
| | EXPECT_EQ(MoveAwareKey::copy_count, 0); |
| | EXPECT_EQ(MoveAwareValue::copy_count, 0); |
| | } |
| |
|
| | TEST_F(MoveAwarenessTest, MovesLValueTuples) { |
| | int x = 1, z = 2; |
| | double y = 3.14, w = 2.718; |
| |
|
| | cache.emplace(std::piecewise_construct, |
| | std::forward_as_tuple(x, y), |
| | std::forward_as_tuple(z, w)); |
| |
|
| | |
| | |
| | EXPECT_EQ(MoveAwareKey::non_move_count, 1); |
| | EXPECT_EQ(MoveAwareValue::non_move_count, 1); |
| |
|
| | EXPECT_EQ(MoveAwareKey::move_count, 0); |
| | EXPECT_EQ(MoveAwareValue::move_count, 0); |
| |
|
| | EXPECT_EQ(MoveAwareKey::copy_count, 0); |
| | EXPECT_EQ(MoveAwareValue::copy_count, 0); |
| | } |
| |
|
| | TEST_F(MoveAwarenessTest, MovesElementsOutOfRValueRanges) { |
| | std::vector<std::pair<std::string, std::string>> range = {{"x", "y"}}; |
| | cache.insert(std::move(range)); |
| |
|
| | |
| | EXPECT_EQ(MoveAwareKey::move_count, 1); |
| | EXPECT_EQ(MoveAwareValue::move_count, 1); |
| |
|
| | EXPECT_EQ(MoveAwareKey::non_move_count, 0); |
| | EXPECT_EQ(MoveAwareValue::non_move_count, 0); |
| |
|
| | EXPECT_EQ(MoveAwareKey::copy_count, 0); |
| | EXPECT_EQ(MoveAwareValue::copy_count, 0); |
| |
|
| | ASSERT_EQ(cache["x"], "y"); |
| | } |
| |
|