#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; TEST_CONSTEXPR_CXX14 explicit EmplaceConstructible(T xvalue) : value(xvalue) {} EmplaceConstructible(EmplaceConstructible const&) = delete; }; template struct EmplaceConstructibleAndMoveInsertable { int copied = 0; T value; TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleAndMoveInsertable(T xvalue) : value(xvalue) {} TEST_CONSTEXPR_CXX14 EmplaceConstructibleAndMoveInsertable( EmplaceConstructibleAndMoveInsertable&& Other) : copied(Other.copied + 1), value(std::move(Other.value)) {} }; template struct EmplaceConstructibleAndMoveable { int copied = 0; int assigned = 0; T value; TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleAndMoveable(T xvalue) noexcept : value(xvalue) {} TEST_CONSTEXPR_CXX14 EmplaceConstructibleAndMoveable(EmplaceConstructibleAndMoveable&& Other) noexcept : copied(Other.copied + 1), value(std::move(Other.value)) {} TEST_CONSTEXPR_CXX14 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; TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleMoveableAndAssignable(T xvalue) noexcept : value(xvalue) {} TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable( EmplaceConstructibleMoveableAndAssignable&& Other) noexcept : copied(Other.copied + 1), value(std::move(Other.value)) {} TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable& operator=(EmplaceConstructibleMoveableAndAssignable&& Other) noexcept { copied = Other.copied; assigned = Other.assigned + 1; value = std::move(Other.value); return *this; } TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable& operator=(T xvalue) { value = std::move(xvalue); ++assigned; return *this; } }; #endif #endif // TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H