190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber//===----------------------------------------------------------------------===// 2f71323e297a928af368937089d3ed71239786f86Andreas Huber// 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// The LLVM Compiler Infrastructure 4f71323e297a928af368937089d3ed71239786f86Andreas Huber// 5f71323e297a928af368937089d3ed71239786f86Andreas Huber// This file is dual licensed under the MIT and the University of Illinois Open 6f71323e297a928af368937089d3ed71239786f86Andreas Huber// Source Licenses. See LICENSE.TXT for details. 7f71323e297a928af368937089d3ed71239786f86Andreas Huber// 8f71323e297a928af368937089d3ed71239786f86Andreas Huber//===----------------------------------------------------------------------===// 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// <tuple> 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// template <class... Types> class tuple; 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// template <size_t I, class... Types> 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// typename tuple_element<I, tuple<Types...> >::type& 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// get(tuple<Types...>& t); 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <tuple> 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string> 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <cassert> 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if __cplusplus > 201103L 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct Empty {}; 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct S { 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber std::tuple<int, Empty> a; 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int k; 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Empty e; 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber constexpr S() : a{1,Empty{}}, k(std::get<0>(a)), e(std::get<1>(a)) {} 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }; 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconstexpr std::tuple<int, int> getP () { return { 3, 4 }; } 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint main() 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber typedef std::tuple<int> T; 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber T t(3); 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<0>(t) == 3); 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber std::get<0>(t) = 2; 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<0>(t) == 2); 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber typedef std::tuple<std::string, int> T; 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber T t("high", 5); 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<0>(t) == "high"); 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<1>(t) == 5); 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber std::get<0>(t) = "four"; 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber std::get<1>(t) = 4; 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<0>(t) == "four"); 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<1>(t) == 4); 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber typedef std::tuple<double&, std::string, int> T; 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber double d = 1.5; 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber T t(d, "high", 5); 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<0>(t) == 1.5); 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<1>(t) == "high"); 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<2>(t) == 5); 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber std::get<0>(t) = 2.5; 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber std::get<1>(t) = "four"; 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber std::get<2>(t) = 4; 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<0>(t) == 2.5); 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<1>(t) == "four"); 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(std::get<2>(t) == 4); 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber assert(d == 2.5); 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if _LIBCPP_STD_VER > 11 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { // get on an rvalue tuple 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber static_assert ( std::get<0> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 0, "" ); 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber static_assert ( std::get<1> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 1, "" ); 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber static_assert ( std::get<2> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 2, "" ); 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber static_assert ( std::get<3> ( std::make_tuple ( 0.0f, 1, 2.0, 3L )) == 3, "" ); 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber static_assert(S().k == 1, ""); 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber static_assert(std::get<1>(getP()) == 4, ""); 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber