tuple_cat.pass.cpp revision 0e1493ec5e125adfb7531b2a05c26bff26325cb2
1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <tuple> 11 12// template <class... Types> class tuple; 13 14// template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); 15 16#include <tuple> 17#include <utility> 18#include <array> 19#include <string> 20#include <cassert> 21 22#include "../MoveOnly.h" 23 24int main() 25{ 26 { 27 std::tuple<> t = std::tuple_cat(); 28 } 29 { 30 std::tuple<> t1; 31 std::tuple<> t2 = std::tuple_cat(t1); 32 } 33 { 34 std::tuple<> t = std::tuple_cat(std::tuple<>()); 35 } 36 { 37 std::tuple<> t = std::tuple_cat(std::array<int, 0>()); 38 } 39 40 { 41 std::tuple<int> t1(1); 42 std::tuple<int> t = std::tuple_cat(t1); 43 assert(std::get<0>(t) == 1); 44 } 45 { 46 std::tuple<int, MoveOnly> t = 47 std::tuple_cat(std::tuple<int, MoveOnly>(1, 2)); 48 assert(std::get<0>(t) == 1); 49 assert(std::get<1>(t) == 2); 50 } 51 { 52 std::tuple<int, int, int> t = std::tuple_cat(std::array<int, 3>()); 53 assert(std::get<0>(t) == 0); 54 assert(std::get<1>(t) == 0); 55 assert(std::get<2>(t) == 0); 56 } 57 { 58 std::tuple<int, MoveOnly> t = std::tuple_cat(std::pair<int, MoveOnly>(2, 1)); 59 assert(std::get<0>(t) == 2); 60 assert(std::get<1>(t) == 1); 61 } 62 63 { 64 std::tuple<> t1; 65 std::tuple<> t2; 66 std::tuple<> t3 = std::tuple_cat(t1, t2); 67 } 68 { 69 std::tuple<> t1; 70 std::tuple<int> t2(2); 71 std::tuple<int> t3 = std::tuple_cat(t1, t2); 72 assert(std::get<0>(t3) == 2); 73 } 74 { 75 std::tuple<> t1; 76 std::tuple<int> t2(2); 77 std::tuple<int> t3 = std::tuple_cat(t2, t1); 78 assert(std::get<0>(t3) == 2); 79 } 80 { 81 std::tuple<int*> t1; 82 std::tuple<int> t2(2); 83 std::tuple<int*, int> t3 = std::tuple_cat(t1, t2); 84 assert(std::get<0>(t3) == nullptr); 85 assert(std::get<1>(t3) == 2); 86 } 87 { 88 std::tuple<int*> t1; 89 std::tuple<int> t2(2); 90 std::tuple<int, int*> t3 = std::tuple_cat(t2, t1); 91 assert(std::get<0>(t3) == 2); 92 assert(std::get<1>(t3) == nullptr); 93 } 94 { 95 std::tuple<int*> t1; 96 std::tuple<int, double> t2(2, 3.5); 97 std::tuple<int*, int, double> t3 = std::tuple_cat(t1, t2); 98 assert(std::get<0>(t3) == nullptr); 99 assert(std::get<1>(t3) == 2); 100 assert(std::get<2>(t3) == 3.5); 101 } 102 { 103 std::tuple<int*> t1; 104 std::tuple<int, double> t2(2, 3.5); 105 std::tuple<int, double, int*> t3 = std::tuple_cat(t2, t1); 106 assert(std::get<0>(t3) == 2); 107 assert(std::get<1>(t3) == 3.5); 108 assert(std::get<2>(t3) == nullptr); 109 } 110 { 111 std::tuple<int*, MoveOnly> t1(nullptr, 1); 112 std::tuple<int, double> t2(2, 3.5); 113 std::tuple<int*, MoveOnly, int, double> t3 = 114 std::tuple_cat(std::move(t1), t2); 115 assert(std::get<0>(t3) == nullptr); 116 assert(std::get<1>(t3) == 1); 117 assert(std::get<2>(t3) == 2); 118 assert(std::get<3>(t3) == 3.5); 119 } 120 { 121 std::tuple<int*, MoveOnly> t1(nullptr, 1); 122 std::tuple<int, double> t2(2, 3.5); 123 std::tuple<int, double, int*, MoveOnly> t3 = 124 std::tuple_cat(t2, std::move(t1)); 125 assert(std::get<0>(t3) == 2); 126 assert(std::get<1>(t3) == 3.5); 127 assert(std::get<2>(t3) == nullptr); 128 assert(std::get<3>(t3) == 1); 129 } 130 { 131 std::tuple<MoveOnly, MoveOnly> t1(1, 2); 132 std::tuple<int*, MoveOnly> t2(nullptr, 4); 133 std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 134 std::tuple_cat(std::move(t1), std::move(t2)); 135 assert(std::get<0>(t3) == 1); 136 assert(std::get<1>(t3) == 2); 137 assert(std::get<2>(t3) == nullptr); 138 assert(std::get<3>(t3) == 4); 139 } 140 141 { 142 std::tuple<MoveOnly, MoveOnly> t1(1, 2); 143 std::tuple<int*, MoveOnly> t2(nullptr, 4); 144 std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 145 std::tuple_cat(std::tuple<>(), 146 std::move(t1), 147 std::move(t2)); 148 assert(std::get<0>(t3) == 1); 149 assert(std::get<1>(t3) == 2); 150 assert(std::get<2>(t3) == nullptr); 151 assert(std::get<3>(t3) == 4); 152 } 153 { 154 std::tuple<MoveOnly, MoveOnly> t1(1, 2); 155 std::tuple<int*, MoveOnly> t2(nullptr, 4); 156 std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 157 std::tuple_cat(std::move(t1), 158 std::tuple<>(), 159 std::move(t2)); 160 assert(std::get<0>(t3) == 1); 161 assert(std::get<1>(t3) == 2); 162 assert(std::get<2>(t3) == nullptr); 163 assert(std::get<3>(t3) == 4); 164 } 165 { 166 std::tuple<MoveOnly, MoveOnly> t1(1, 2); 167 std::tuple<int*, MoveOnly> t2(nullptr, 4); 168 std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 169 std::tuple_cat(std::move(t1), 170 std::move(t2), 171 std::tuple<>()); 172 assert(std::get<0>(t3) == 1); 173 assert(std::get<1>(t3) == 2); 174 assert(std::get<2>(t3) == nullptr); 175 assert(std::get<3>(t3) == 4); 176 } 177 { 178 std::tuple<MoveOnly, MoveOnly> t1(1, 2); 179 std::tuple<int*, MoveOnly> t2(nullptr, 4); 180 std::tuple<MoveOnly, MoveOnly, int*, MoveOnly, int> t3 = 181 std::tuple_cat(std::move(t1), 182 std::move(t2), 183 std::tuple<int>(5)); 184 assert(std::get<0>(t3) == 1); 185 assert(std::get<1>(t3) == 2); 186 assert(std::get<2>(t3) == nullptr); 187 assert(std::get<3>(t3) == 4); 188 assert(std::get<4>(t3) == 5); 189 } 190} 191