non_member_swap.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <tuple>
11
12// template <class... Types> class tuple;
13
14// template <class... Types>
15//   void swap(tuple<Types...>& x, tuple<Types...>& y);
16
17#include <tuple>
18#include <cassert>
19
20#include "../MoveOnly.h"
21
22int main()
23{
24    {
25        typedef std::tuple<> T;
26        T t0;
27        T t1;
28        swap(t0, t1);
29    }
30    {
31        typedef std::tuple<MoveOnly> T;
32        T t0(MoveOnly(0));
33        T t1(MoveOnly(1));
34        swap(t0, t1);
35        assert(std::get<0>(t0) == 1);
36        assert(std::get<0>(t1) == 0);
37    }
38    {
39        typedef std::tuple<MoveOnly, MoveOnly> T;
40        T t0(MoveOnly(0), MoveOnly(1));
41        T t1(MoveOnly(2), MoveOnly(3));
42        swap(t0, t1);
43        assert(std::get<0>(t0) == 2);
44        assert(std::get<1>(t0) == 3);
45        assert(std::get<0>(t1) == 0);
46        assert(std::get<1>(t1) == 1);
47    }
48    {
49        typedef std::tuple<MoveOnly, MoveOnly, MoveOnly> T;
50        T t0(MoveOnly(0), MoveOnly(1), MoveOnly(2));
51        T t1(MoveOnly(3), MoveOnly(4), MoveOnly(5));
52        swap(t0, t1);
53        assert(std::get<0>(t0) == 3);
54        assert(std::get<1>(t0) == 4);
55        assert(std::get<2>(t0) == 5);
56        assert(std::get<0>(t1) == 0);
57        assert(std::get<1>(t1) == 1);
58        assert(std::get<2>(t1) == 2);
59    }
60}
61