11c0cedccSEric Fiselier #ifndef TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H 21c0cedccSEric Fiselier #define TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H 31c0cedccSEric Fiselier 41c0cedccSEric Fiselier #include "test_macros.h" 51c0cedccSEric Fiselier 61c0cedccSEric Fiselier #if TEST_STD_VER >= 11 71c0cedccSEric Fiselier template <class T> 81c0cedccSEric Fiselier struct EmplaceConstructible { 91c0cedccSEric Fiselier T value; EmplaceConstructibleEmplaceConstructible10*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 explicit EmplaceConstructible(T xvalue) : value(xvalue) {} 111c0cedccSEric Fiselier EmplaceConstructible(EmplaceConstructible const&) = delete; 121c0cedccSEric Fiselier }; 131c0cedccSEric Fiselier 141c0cedccSEric Fiselier template <class T> 151c0cedccSEric Fiselier struct EmplaceConstructibleAndMoveInsertable { 161c0cedccSEric Fiselier int copied = 0; 171c0cedccSEric Fiselier T value; EmplaceConstructibleAndMoveInsertableEmplaceConstructibleAndMoveInsertable18*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleAndMoveInsertable(T xvalue) : value(xvalue) {} 191c0cedccSEric Fiselier EmplaceConstructibleAndMoveInsertableEmplaceConstructibleAndMoveInsertable20*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 EmplaceConstructibleAndMoveInsertable( 211c0cedccSEric Fiselier EmplaceConstructibleAndMoveInsertable&& Other) 221c0cedccSEric Fiselier : copied(Other.copied + 1), value(std::move(Other.value)) {} 231c0cedccSEric Fiselier }; 241c0cedccSEric Fiselier 251c0cedccSEric Fiselier template <class T> 261c0cedccSEric Fiselier struct EmplaceConstructibleAndMoveable { 271c0cedccSEric Fiselier int copied = 0; 281c0cedccSEric Fiselier int assigned = 0; 291c0cedccSEric Fiselier T value; EmplaceConstructibleAndMoveableEmplaceConstructibleAndMoveable30*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleAndMoveable(T xvalue) noexcept : value(xvalue) {} 311c0cedccSEric Fiselier EmplaceConstructibleAndMoveableEmplaceConstructibleAndMoveable32*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 EmplaceConstructibleAndMoveable(EmplaceConstructibleAndMoveable&& Other) 331c0cedccSEric Fiselier noexcept : copied(Other.copied + 1), 341c0cedccSEric Fiselier value(std::move(Other.value)) {} 351c0cedccSEric Fiselier 36*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 EmplaceConstructibleAndMoveable& 371c0cedccSEric Fiselier operator=(EmplaceConstructibleAndMoveable&& Other) noexcept { 381c0cedccSEric Fiselier copied = Other.copied; 391c0cedccSEric Fiselier assigned = Other.assigned + 1; 401c0cedccSEric Fiselier value = std::move(Other.value); 411c0cedccSEric Fiselier return *this; 421c0cedccSEric Fiselier } 431c0cedccSEric Fiselier }; 441c0cedccSEric Fiselier 451c0cedccSEric Fiselier template <class T> 461c0cedccSEric Fiselier struct EmplaceConstructibleMoveableAndAssignable { 471c0cedccSEric Fiselier int copied = 0; 481c0cedccSEric Fiselier int assigned = 0; 491c0cedccSEric Fiselier T value; EmplaceConstructibleMoveableAndAssignableEmplaceConstructibleMoveableAndAssignable50*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleMoveableAndAssignable(T xvalue) noexcept 51ffcc7c6cSEric Fiselier : value(xvalue) {} 521c0cedccSEric Fiselier EmplaceConstructibleMoveableAndAssignableEmplaceConstructibleMoveableAndAssignable53*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable( 541c0cedccSEric Fiselier EmplaceConstructibleMoveableAndAssignable&& Other) noexcept 551c0cedccSEric Fiselier : copied(Other.copied + 1), 561c0cedccSEric Fiselier value(std::move(Other.value)) {} 571c0cedccSEric Fiselier 58*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable& 591c0cedccSEric Fiselier operator=(EmplaceConstructibleMoveableAndAssignable&& Other) noexcept { 601c0cedccSEric Fiselier copied = Other.copied; 611c0cedccSEric Fiselier assigned = Other.assigned + 1; 621c0cedccSEric Fiselier value = std::move(Other.value); 631c0cedccSEric Fiselier return *this; 641c0cedccSEric Fiselier } 651c0cedccSEric Fiselier 66*255a60cdSLouis Dionne TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable& operator=(T xvalue) { 671c0cedccSEric Fiselier value = std::move(xvalue); 681c0cedccSEric Fiselier ++assigned; 691c0cedccSEric Fiselier return *this; 701c0cedccSEric Fiselier } 711c0cedccSEric Fiselier }; 721c0cedccSEric Fiselier #endif 731c0cedccSEric Fiselier 741c0cedccSEric Fiselier #endif // TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H 75