BLI: use forwarding reference in Map

The is necessary when Map.add_or_modify is called with callbacks that
return a reference.
This commit is contained in:
Jacques Lucke 2020-10-29 15:19:32 +01:00
parent 569b7c2821
commit 09be2a8358
2 changed files with 19 additions and 1 deletions

View File

@ -1016,7 +1016,7 @@ class Map {
return;
}
else {
auto return_value = create_value(value_ptr);
auto &&return_value = create_value(value_ptr);
slot.occupy_no_value(std::forward<ForwardKey>(key), hash);
occupied_and_removed_slots_++;
return return_value;

View File

@ -295,6 +295,24 @@ TEST(map, AddOrModify)
EXPECT_EQ(map.lookup(1), 15.0f);
}
TEST(map, AddOrModifyReference)
{
Map<int, std::unique_ptr<int>> map;
auto create_func = [](std::unique_ptr<int> *value) -> int & {
new (value) std::unique_ptr<int>(new int{10});
return **value;
};
auto modify_func = [](std::unique_ptr<int> *value) -> int & {
**value += 5;
return **value;
};
EXPECT_EQ(map.add_or_modify(1, create_func, modify_func), 10);
int &a = map.add_or_modify(1, create_func, modify_func);
EXPECT_EQ(a, 15);
a = 100;
EXPECT_EQ(*map.lookup(1), 100);
}
TEST(map, AddOverwrite)
{
Map<int, float> map;