#ifndef TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H #define TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H #include "test_macros.h" #if TEST_STD_VER >= 11 template struct EmplaceConstructible { T value; explicit EmplaceConstructible(T xvalue) : value(xvalue) {} EmplaceConstructible(EmplaceConstructible const&) = delete; }; template struct EmplaceConstructibleAndMoveInsertable { int copied = 0; T value; explicit EmplaceConstructibleAndMoveInsertable(T xvalue) : value(xvalue) {} EmplaceConstructibleAndMoveInsertable( EmplaceConstructibleAndMoveInsertable&& Other) : copied(Other.copied + 1), value(std::move(Other.value)) {} }; template struct EmplaceConstructibleAndMoveable { int copied = 0; int assigned = 0; T value; explicit EmplaceConstructibleAndMoveable(T xvalue) noexcept : value(xvalue) {} EmplaceConstructibleAndMoveable(EmplaceConstructibleAndMoveable&& Other) noexcept : copied(Other.copied + 1), value(std::move(Other.value)) {} EmplaceConstructibleAndMoveable& operator=(EmplaceConstructibleAndMoveable&& Other) noexcept { copied = Other.copied; assigned = Other.assigned + 1; value = std::move(Other.value); return *this; } }; template struct EmplaceConstructibleMoveableAndAssignable { int copied = 0; int assigned = 0; T value; explicit EmplaceConstructibleMoveableAndAssignable(T xvalue) noexcept : value(xvalue) {} EmplaceConstructibleMoveableAndAssignable( EmplaceConstructibleMoveableAndAssignable&& Other) noexcept : copied(Other.copied + 1), value(std::move(Other.value)) {} EmplaceConstructibleMoveableAndAssignable& operator=(EmplaceConstructibleMoveableAndAssignable&& Other) noexcept { copied = Other.copied; assigned = Other.assigned + 1; value = std::move(Other.value); return *this; } EmplaceConstructibleMoveableAndAssignable& operator=(T xvalue) { value = std::move(xvalue); ++assigned; return *this; } }; #endif #endif // TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H