Add emplace to option
This commit is contained in:
@ -387,6 +387,15 @@ public:
|
||||
{
|
||||
return has_value() ? ASL_MOVE(value()) : static_cast<T>(ASL_FWD(other_value));
|
||||
}
|
||||
|
||||
template<typename... Args>
|
||||
T& emplace(Args&&... args) &
|
||||
requires constructible<T, Args&&...>
|
||||
{
|
||||
if (m_has_value) { reset(); }
|
||||
construct(ASL_FWD(args)...);
|
||||
return value();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
|
@ -198,3 +198,29 @@ ASL_TEST(value_or)
|
||||
ASL_TEST_EXPECT(a.value_or(5) == 5);
|
||||
ASL_TEST_EXPECT(b.value_or(5) == 2);
|
||||
}
|
||||
|
||||
ASL_TEST(emplace)
|
||||
{
|
||||
asl::option<int> a = asl::nullopt;
|
||||
|
||||
a.emplace(42);
|
||||
ASL_TEST_EXPECT(a.has_value());
|
||||
ASL_TEST_EXPECT(a.value() == 42);
|
||||
}
|
||||
|
||||
ASL_TEST(emplace_destroys_previous)
|
||||
{
|
||||
bool b1 = false;
|
||||
bool b2 = false;
|
||||
|
||||
{
|
||||
asl::option<DestructorObserver> a{&b1};
|
||||
ASL_TEST_EXPECT(!b1);
|
||||
|
||||
a.emplace(&b2);
|
||||
ASL_TEST_EXPECT(b1);
|
||||
ASL_TEST_EXPECT(!b2);
|
||||
}
|
||||
|
||||
ASL_TEST_EXPECT(b2);
|
||||
}
|
||||
|
Reference in New Issue
Block a user