1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <tuple> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... Types> class tuple; 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... UTypes> tuple(tuple<UTypes...>&& u); 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 16f063052fe1d3c7a40de69795228a6334f956b9f9Eric Fiselier// UNSUPPORTED: c++98, c++03 17f063052fe1d3c7a40de69795228a6334f956b9f9Eric Fiselier 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <tuple> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string> 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <memory> 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 2395526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselierstruct Explicit { 2495526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier int value; 2595526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier explicit Explicit(int x) : value(x) {} 2695526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier}; 2795526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier 2895526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselierstruct Implicit { 2995526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier int value; 3095526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier Implicit(int x) : value(x) {} 3195526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier}; 3295526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct B 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int id_; 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant explicit B(int i) : id_(i) {} 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual ~B() {} 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct D 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : B 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant explicit D(int i) : B(i) {} 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 510e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long> T0; 520e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long long> T1; 530e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej T0 t0(2); 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant T1 t1 = std::move(t0); 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t1) == 2); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 580e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long, char> T0; 590e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long long, int> T1; 600e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej T0 t0(2, 'a'); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant T1 t1 = std::move(t0); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t1) == 2); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t1) == int('a')); 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 660e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long, char, D> T0; 670e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long long, int, B> T1; 680e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej T0 t0(2, 'a', D(3)); 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant T1 t1 = std::move(t0); 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t1) == 2); 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t1) == int('a')); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t1).id_ == 3); 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant D d(3); 760e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long, char, D&> T0; 770e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long long, int, B&> T1; 780e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej T0 t0(2, 'a', d); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant T1 t1 = std::move(t0); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant d.id_ = 2; 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t1) == 2); 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t1) == int('a')); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t1).id_ == 2); 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 860e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long, char, std::unique_ptr<D>> T0; 870e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej typedef std::tuple<long long, int, std::unique_ptr<B>> T1; 880e8cbce107862187f8f75c1e8b7e49d11015d9f0Stephan T. Lavavej T0 t0(2, 'a', std::unique_ptr<D>(new D(3))); 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant T1 t1 = std::move(t0); 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t1) == 2); 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t1) == int('a')); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t1)->id_ == 3); 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 9495526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier { 9595526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier std::tuple<int> t1(42); 9695526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier std::tuple<Explicit> t2(std::move(t1)); 9795526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier assert(std::get<0>(t2).value == 42); 9895526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier } 9995526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier { 10095526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier std::tuple<int> t1(42); 10195526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier std::tuple<Implicit> t2 = std::move(t1); 10295526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier assert(std::get<0>(t2).value == 42); 10395526d31cb9688f74106a58a9e8b5d1f663fcf5aEric Fiselier } 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 105