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 <size_t I, class... Types> 15// typename tuple_element<I, tuple<Types...> >::type& 16// get(tuple<Types...>& t); 17 18// UNSUPPORTED: c++98, c++03 19 20#include <tuple> 21#include <string> 22#include <cassert> 23 24#include "test_macros.h" 25 26#if TEST_STD_VER > 11 27 28struct Empty {}; 29 30struct S { 31 std::tuple<int, Empty> a; 32 int k; 33 Empty e; 34 constexpr S() : a{1,Empty{}}, k(std::get<0>(a)), e(std::get<1>(a)) {} 35 }; 36 37constexpr std::tuple<int, int> getP () { return { 3, 4 }; } 38#endif 39 40int main() 41{ 42 { 43 typedef std::tuple<int> T; 44 T t(3); 45 assert(std::get<0>(t) == 3); 46 std::get<0>(t) = 2; 47 assert(std::get<0>(t) == 2); 48 } 49 { 50 typedef std::tuple<std::string, int> T; 51 T t("high", 5); 52 assert(std::get<0>(t) == "high"); 53 assert(std::get<1>(t) == 5); 54 std::get<0>(t) = "four"; 55 std::get<1>(t) = 4; 56 assert(std::get<0>(t) == "four"); 57 assert(std::get<1>(t) == 4); 58 } 59 { 60 typedef std::tuple<double&, std::string, int> T; 61 double d = 1.5; 62 T t(d, "high", 5); 63 assert(std::get<0>(t) == 1.5); 64 assert(std::get<1>(t) == "high"); 65 assert(std::get<2>(t) == 5); 66 std::get<0>(t) = 2.5; 67 std::get<1>(t) = "four"; 68 std::get<2>(t) = 4; 69 assert(std::get<0>(t) == 2.5); 70 assert(std::get<1>(t) == "four"); 71 assert(std::get<2>(t) == 4); 72 assert(d == 2.5); 73 } 74#if TEST_STD_VER > 11 75 { // get on an rvalue tuple 76 static_assert ( std::get<0> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 0, "" ); 77 static_assert ( std::get<1> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 1, "" ); 78 static_assert ( std::get<2> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 2, "" ); 79 static_assert ( std::get<3> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 3, "" ); 80 static_assert(S().k == 1, ""); 81 static_assert(std::get<1>(getP()) == 4, ""); 82 } 83#endif 84 85} 86