75 lines · c
1#ifndef TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H2#define TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H3 4#include "test_macros.h"5 6#if TEST_STD_VER >= 117template <class T>8struct EmplaceConstructible {9 T value;10 TEST_CONSTEXPR_CXX14 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 TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleAndMoveInsertable(T xvalue) : value(xvalue) {}19 20 TEST_CONSTEXPR_CXX14 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 TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleAndMoveable(T xvalue) noexcept : value(xvalue) {}31 32 TEST_CONSTEXPR_CXX14 EmplaceConstructibleAndMoveable(EmplaceConstructibleAndMoveable&& Other)33 noexcept : copied(Other.copied + 1),34 value(std::move(Other.value)) {}35 36 TEST_CONSTEXPR_CXX14 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 TEST_CONSTEXPR_CXX14 explicit EmplaceConstructibleMoveableAndAssignable(T xvalue) noexcept51 : value(xvalue) {}52 53 TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable(54 EmplaceConstructibleMoveableAndAssignable&& Other) noexcept55 : copied(Other.copied + 1),56 value(std::move(Other.value)) {}57 58 TEST_CONSTEXPR_CXX14 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 TEST_CONSTEXPR_CXX14 EmplaceConstructibleMoveableAndAssignable& operator=(T xvalue) {67 value = std::move(xvalue);68 ++assigned;69 return *this;70 }71};72#endif73 74#endif // TEST_SUPPORT_EMPLACE_CONSTRUCTIBLE_H75