mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-30 07:14:53 +00:00
Add getValueOr to llvm::Optional<T>.
This takes a single argument convertible to T, and - if the Optional has a value, returns the existing value, - otherwise, constructs a T from the argument and returns that. Inspired by std::experimental::optional from the "Library Fundamentals" C++ TS. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218618 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ede14e3e21
commit
88c0ed30da
@ -119,9 +119,19 @@ public:
|
||||
const T& operator*() const LLVM_LVALUE_FUNCTION { assert(hasVal); return *getPointer(); }
|
||||
T& operator*() LLVM_LVALUE_FUNCTION { assert(hasVal); return *getPointer(); }
|
||||
|
||||
template <typename U>
|
||||
constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION {
|
||||
return hasValue() ? getValue() : std::forward<U>(value);
|
||||
}
|
||||
|
||||
#if LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||
T&& getValue() && { assert(hasVal); return std::move(*getPointer()); }
|
||||
T&& operator*() && { assert(hasVal); return std::move(*getPointer()); }
|
||||
|
||||
template <typename U>
|
||||
T getValueOr(U &&value) && {
|
||||
return hasValue() ? std::move(getValue()) : std::forward<U>(value);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -169,6 +169,14 @@ TEST_F(OptionalTest, NullCopyConstructionTest) {
|
||||
EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
|
||||
}
|
||||
|
||||
TEST_F(OptionalTest, GetValueOr) {
|
||||
Optional<int> A;
|
||||
EXPECT_EQ(42, A.getValueOr(42));
|
||||
|
||||
A = 5;
|
||||
EXPECT_EQ(5, A.getValueOr(42));
|
||||
}
|
||||
|
||||
struct MoveOnly {
|
||||
static unsigned MoveConstructions;
|
||||
static unsigned Destructions;
|
||||
@ -278,5 +286,26 @@ TEST_F(OptionalTest, MoveOnlyAssigningAssignment) {
|
||||
EXPECT_EQ(1u, MoveOnly::Destructions);
|
||||
}
|
||||
|
||||
#if LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||
|
||||
TEST_F(OptionalTest, MoveGetValueOr) {
|
||||
Optional<MoveOnly> A;
|
||||
|
||||
MoveOnly::ResetCounts();
|
||||
EXPECT_EQ(42, std::move(A).getValueOr(MoveOnly(42)).val);
|
||||
EXPECT_EQ(1u, MoveOnly::MoveConstructions);
|
||||
EXPECT_EQ(0u, MoveOnly::MoveAssignments);
|
||||
EXPECT_EQ(2u, MoveOnly::Destructions);
|
||||
|
||||
A = MoveOnly(5);
|
||||
MoveOnly::ResetCounts();
|
||||
EXPECT_EQ(5, std::move(A).getValueOr(MoveOnly(42)).val);
|
||||
EXPECT_EQ(1u, MoveOnly::MoveConstructions);
|
||||
EXPECT_EQ(0u, MoveOnly::MoveAssignments);
|
||||
EXPECT_EQ(2u, MoveOnly::Destructions);
|
||||
}
|
||||
|
||||
#endif // LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user