tuple_cat.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... TTypes, class... UTypes> 15// tuple<TTypes..., UTypes...> 16// tuple_cat(const tuple<TTypes...>& t, const tuple<UTypes...>& u); 17// 18// template <class... TTypes, class... UTypes> 19// tuple<TTypes..., UTypes...> 20// tuple_cat(const tuple<TTypes...>&& t, const tuple<UTypes...>& u); 21// 22// template <class... TTypes, class... UTypes> 23// tuple<TTypes..., UTypes...> 24// tuple_cat(const tuple<TTypes...>& t, const tuple<UTypes...>&& u); 25// 26// template <class... TTypes, class... UTypes> 27// tuple<TTypes..., UTypes...> 28// tuple_cat(const tuple<TTypes...>&& t, const tuple<UTypes...>&& u); 29 30#include <tuple> 31#include <string> 32#include <cassert> 33 34#include "../MoveOnly.h" 35 36int main() 37{ 38 { 39 std::tuple<> t1; 40 std::tuple<> t2; 41 std::tuple<> t3 = std::tuple_cat(t1, t2); 42 } 43 { 44 std::tuple<> t1; 45 std::tuple<int> t2(2); 46 std::tuple<int> t3 = std::tuple_cat(t1, t2); 47 assert(std::get<0>(t3) == 2); 48 } 49 { 50 std::tuple<> t1; 51 std::tuple<int> t2(2); 52 std::tuple<int> t3 = std::tuple_cat(t2, t1); 53 assert(std::get<0>(t3) == 2); 54 } 55 { 56 std::tuple<int*> t1; 57 std::tuple<int> t2(2); 58 std::tuple<int*, int> t3 = std::tuple_cat(t1, t2); 59 assert(std::get<0>(t3) == nullptr); 60 assert(std::get<1>(t3) == 2); 61 } 62 { 63 std::tuple<int*> t1; 64 std::tuple<int> t2(2); 65 std::tuple<int, int*> t3 = std::tuple_cat(t2, t1); 66 assert(std::get<0>(t3) == 2); 67 assert(std::get<1>(t3) == nullptr); 68 } 69 { 70 std::tuple<int*> t1; 71 std::tuple<int, double> t2(2, 3.5); 72 std::tuple<int*, int, double> t3 = std::tuple_cat(t1, t2); 73 assert(std::get<0>(t3) == nullptr); 74 assert(std::get<1>(t3) == 2); 75 assert(std::get<2>(t3) == 3.5); 76 } 77 { 78 std::tuple<int*> t1; 79 std::tuple<int, double> t2(2, 3.5); 80 std::tuple<int, double, int*> t3 = std::tuple_cat(t2, t1); 81 assert(std::get<0>(t3) == 2); 82 assert(std::get<1>(t3) == 3.5); 83 assert(std::get<2>(t3) == nullptr); 84 } 85 { 86 std::tuple<int*, MoveOnly> t1(nullptr, 1); 87 std::tuple<int, double> t2(2, 3.5); 88 std::tuple<int*, MoveOnly, int, double> t3 = 89 std::tuple_cat(std::move(t1), t2); 90 assert(std::get<0>(t3) == nullptr); 91 assert(std::get<1>(t3) == 1); 92 assert(std::get<2>(t3) == 2); 93 assert(std::get<3>(t3) == 3.5); 94 } 95 { 96 std::tuple<int*, MoveOnly> t1(nullptr, 1); 97 std::tuple<int, double> t2(2, 3.5); 98 std::tuple<int, double, int*, MoveOnly> t3 = 99 std::tuple_cat(t2, std::move(t1)); 100 assert(std::get<0>(t3) == 2); 101 assert(std::get<1>(t3) == 3.5); 102 assert(std::get<2>(t3) == nullptr); 103 assert(std::get<3>(t3) == 1); 104 } 105 { 106 std::tuple<MoveOnly, MoveOnly> t1(1, 2); 107 std::tuple<int*, MoveOnly> t2(nullptr, 4); 108 std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 109 std::tuple_cat(std::move(t1), std::move(t2)); 110 assert(std::get<0>(t3) == 1); 111 assert(std::get<1>(t3) == 2); 112 assert(std::get<2>(t3) == nullptr); 113 assert(std::get<3>(t3) == 4); 114 } 115} 116