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