1*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H 2*58b9f456SAndroid Build Coastguard Worker #define TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H 3*58b9f456SAndroid Build Coastguard Worker 4*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h" 5*58b9f456SAndroid Build Coastguard Worker 6*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11 7*58b9f456SAndroid Build Coastguard Worker template <class T> 8*58b9f456SAndroid Build Coastguard Worker struct EmplaceConstructible { 9*58b9f456SAndroid Build Coastguard Worker T value; EmplaceConstructibleEmplaceConstructible10*58b9f456SAndroid Build Coastguard Worker explicit EmplaceConstructible(T xvalue) : value(xvalue) {} 11*58b9f456SAndroid Build Coastguard Worker EmplaceConstructible(EmplaceConstructible const&) = delete; 12*58b9f456SAndroid Build Coastguard Worker }; 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker template <class T> 15*58b9f456SAndroid Build Coastguard Worker struct EmplaceConstructibleAndMoveInsertable { 16*58b9f456SAndroid Build Coastguard Worker int copied = 0; 17*58b9f456SAndroid Build Coastguard Worker T value; EmplaceConstructibleAndMoveInsertableEmplaceConstructibleAndMoveInsertable18*58b9f456SAndroid Build Coastguard Worker explicit EmplaceConstructibleAndMoveInsertable(T xvalue) : value(xvalue) {} 19*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleAndMoveInsertableEmplaceConstructibleAndMoveInsertable20*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleAndMoveInsertable( 21*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleAndMoveInsertable&& Other) 22*58b9f456SAndroid Build Coastguard Worker : copied(Other.copied + 1), value(std::move(Other.value)) {} 23*58b9f456SAndroid Build Coastguard Worker }; 24*58b9f456SAndroid Build Coastguard Worker 25*58b9f456SAndroid Build Coastguard Worker template <class T> 26*58b9f456SAndroid Build Coastguard Worker struct EmplaceConstructibleAndMoveable { 27*58b9f456SAndroid Build Coastguard Worker int copied = 0; 28*58b9f456SAndroid Build Coastguard Worker int assigned = 0; 29*58b9f456SAndroid Build Coastguard Worker T value; EmplaceConstructibleAndMoveableEmplaceConstructibleAndMoveable30*58b9f456SAndroid Build Coastguard Worker explicit EmplaceConstructibleAndMoveable(T xvalue) noexcept : value(xvalue) {} 31*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleAndMoveableEmplaceConstructibleAndMoveable32*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleAndMoveable(EmplaceConstructibleAndMoveable&& Other) 33*58b9f456SAndroid Build Coastguard Worker noexcept : copied(Other.copied + 1), 34*58b9f456SAndroid Build Coastguard Worker value(std::move(Other.value)) {} 35*58b9f456SAndroid Build Coastguard Worker 36*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleAndMoveable& 37*58b9f456SAndroid Build Coastguard Worker operator=(EmplaceConstructibleAndMoveable&& Other) noexcept { 38*58b9f456SAndroid Build Coastguard Worker copied = Other.copied; 39*58b9f456SAndroid Build Coastguard Worker assigned = Other.assigned + 1; 40*58b9f456SAndroid Build Coastguard Worker value = std::move(Other.value); 41*58b9f456SAndroid Build Coastguard Worker return *this; 42*58b9f456SAndroid Build Coastguard Worker } 43*58b9f456SAndroid Build Coastguard Worker }; 44*58b9f456SAndroid Build Coastguard Worker 45*58b9f456SAndroid Build Coastguard Worker template <class T> 46*58b9f456SAndroid Build Coastguard Worker struct EmplaceConstructibleMoveableAndAssignable { 47*58b9f456SAndroid Build Coastguard Worker int copied = 0; 48*58b9f456SAndroid Build Coastguard Worker int assigned = 0; 49*58b9f456SAndroid Build Coastguard Worker T value; EmplaceConstructibleMoveableAndAssignableEmplaceConstructibleMoveableAndAssignable50*58b9f456SAndroid Build Coastguard Worker explicit EmplaceConstructibleMoveableAndAssignable(T xvalue) noexcept 51*58b9f456SAndroid Build Coastguard Worker : value(xvalue) {} 52*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleMoveableAndAssignableEmplaceConstructibleMoveableAndAssignable53*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleMoveableAndAssignable( 54*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleMoveableAndAssignable&& Other) noexcept 55*58b9f456SAndroid Build Coastguard Worker : copied(Other.copied + 1), 56*58b9f456SAndroid Build Coastguard Worker value(std::move(Other.value)) {} 57*58b9f456SAndroid Build Coastguard Worker 58*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleMoveableAndAssignable& 59*58b9f456SAndroid Build Coastguard Worker operator=(EmplaceConstructibleMoveableAndAssignable&& Other) noexcept { 60*58b9f456SAndroid Build Coastguard Worker copied = Other.copied; 61*58b9f456SAndroid Build Coastguard Worker assigned = Other.assigned + 1; 62*58b9f456SAndroid Build Coastguard Worker value = std::move(Other.value); 63*58b9f456SAndroid Build Coastguard Worker return *this; 64*58b9f456SAndroid Build Coastguard Worker } 65*58b9f456SAndroid Build Coastguard Worker 66*58b9f456SAndroid Build Coastguard Worker EmplaceConstructibleMoveableAndAssignable& operator=(T xvalue) { 67*58b9f456SAndroid Build Coastguard Worker value = std::move(xvalue); 68*58b9f456SAndroid Build Coastguard Worker ++assigned; 69*58b9f456SAndroid Build Coastguard Worker return *this; 70*58b9f456SAndroid Build Coastguard Worker } 71*58b9f456SAndroid Build Coastguard Worker }; 72*58b9f456SAndroid Build Coastguard Worker #endif 73*58b9f456SAndroid Build Coastguard Worker 74*58b9f456SAndroid Build Coastguard Worker #endif // TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H 75