#include <memory>
#include <cassert>
+#include "archetypes.hpp"
+
// Clang warns about missing braces when initializing std::array.
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wmissing-braces"
#endif
-struct CountingType {
- static int constructed;
- static int copy_constructed;
- static int move_constructed;
- static int assigned;
- static int copy_assigned;
- static int move_assigned;
- static void reset() {
- constructed = copy_constructed = move_constructed = 0;
- assigned = copy_assigned = move_assigned = 0;
- }
- CountingType() : value(0) { ++constructed; }
- CountingType(int v) : value(v) { ++constructed; }
- CountingType(CountingType const& o) : value(o.value) { ++constructed; ++copy_constructed; }
- CountingType(CountingType&& o) : value(o.value) { ++constructed; ++move_constructed; o.value = -1;}
-
- CountingType& operator=(CountingType const& o) {
- ++assigned;
- ++copy_assigned;
- value = o.value;
- return *this;
- }
- CountingType& operator=(CountingType&& o) {
- ++assigned;
- ++move_assigned;
- value = o.value;
- o.value = -1;
- return *this;
- }
- int value;
-};
-int CountingType::constructed;
-int CountingType::copy_constructed;
-int CountingType::move_constructed;
-int CountingType::assigned;
-int CountingType::copy_assigned;
-int CountingType::move_assigned;
-
int main()
{
- using C = CountingType;
+ using C = TestTypes::TestType;
{
using P = std::pair<int, C>;
using T = std::tuple<int, C>;
T t(42, C{42});
P p(101, C{101});
- C::reset();
+ C::reset_constructors();
p = t;
assert(C::constructed == 0);
assert(C::assigned == 1);
using T = std::tuple<int, C>;
T t(42, -42);
P p(101, 101);
- C::reset();
+ C::reset_constructors();
p = std::move(t);
assert(C::constructed == 0);
assert(C::assigned == 1);
using T = std::array<C, 2>;
T t = {42, -42};
P p{101, 101};
- C::reset();
+ C::reset_constructors();
p = t;
assert(C::constructed == 0);
assert(C::assigned == 2);
using T = std::array<C, 2>;
T t = {42, -42};
P p{101, 101};
- C::reset();
+ C::reset_constructors();
p = t;
assert(C::constructed == 0);
assert(C::assigned == 2);
using T = std::array<C, 2>;
T t = {42, -42};
P p{101, 101};
- C::reset();
+ C::reset_constructors();
p = std::move(t);
assert(C::constructed == 0);
assert(C::assigned == 2);
#include <utility>
#include <cassert>
+#include "test_macros.h"
+#if TEST_STD_VER >= 11
+#include "archetypes.hpp"
+#endif
+
int main()
{
{
assert(p2.first == 3);
assert(p2.second == 4);
}
+#if TEST_STD_VER >= 11
+ {
+ using C = TestTypes::TestType;
+ using P = std::pair<int, C>;
+ using T = std::pair<long, C>;
+ const T t(42, -42);
+ P p(101, 101);
+ C::reset_constructors();
+ p = t;
+ assert(C::constructed == 0);
+ assert(C::assigned == 1);
+ assert(C::copy_assigned == 1);
+ assert(C::move_assigned == 0atu);
+ assert(p.first == 42);
+ assert(p.second.value == -42);
+ }
+#endif
}
#include <utility>
#include <memory>
#include <cassert>
+#include <archetypes.hpp>
struct Base
{
assert(p2.first == nullptr);
assert(p2.second == 4);
}
+ {
+ using C = TestTypes::TestType;
+ using P = std::pair<int, C>;
+ using T = std::pair<long, C>;
+ T t(42, -42);
+ P p(101, 101);
+ C::reset_constructors();
+ p = std::move(t);
+ assert(C::constructed == 0);
+ assert(C::assigned == 1);
+ assert(C::copy_assigned == 0);
+ assert(C::move_assigned == 1);
+ assert(p.first == 42);
+ assert(p.second.value == -42);
+ }
}