1*e4b17023SJohn Marino// TR1 utility -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 2004, 2005, 2006, 2007, 2008. 2009, 2010, 2011 4*e4b17023SJohn Marino// Free Software Foundation, Inc. 5*e4b17023SJohn Marino// 6*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino// any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino// GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino/** @file tr1/utility 27*e4b17023SJohn Marino * This is a TR1 C++ Library header. 28*e4b17023SJohn Marino */ 29*e4b17023SJohn Marino 30*e4b17023SJohn Marino#ifndef _GLIBCXX_TR1_UTILITY 31*e4b17023SJohn Marino#define _GLIBCXX_TR1_UTILITY 1 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino#pragma GCC system_header 34*e4b17023SJohn Marino 35*e4b17023SJohn Marino#include <bits/c++config.h> 36*e4b17023SJohn Marino#include <bits/stl_relops.h> 37*e4b17023SJohn Marino#include <bits/stl_pair.h> 38*e4b17023SJohn Marino 39*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 40*e4b17023SJohn Marino{ 41*e4b17023SJohn Marinonamespace tr1 42*e4b17023SJohn Marino{ 43*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 44*e4b17023SJohn Marino 45*e4b17023SJohn Marino template<class _Tp> 46*e4b17023SJohn Marino class tuple_size; 47*e4b17023SJohn Marino 48*e4b17023SJohn Marino template<int _Int, class _Tp> 49*e4b17023SJohn Marino class tuple_element; 50*e4b17023SJohn Marino 51*e4b17023SJohn Marino // Various functions which give std::pair a tuple-like interface. 52*e4b17023SJohn Marino template<class _Tp1, class _Tp2> 53*e4b17023SJohn Marino struct tuple_size<std::pair<_Tp1, _Tp2> > 54*e4b17023SJohn Marino { static const int value = 2; }; 55*e4b17023SJohn Marino 56*e4b17023SJohn Marino template<class _Tp1, class _Tp2> 57*e4b17023SJohn Marino const int 58*e4b17023SJohn Marino tuple_size<std::pair<_Tp1, _Tp2> >::value; 59*e4b17023SJohn Marino 60*e4b17023SJohn Marino template<class _Tp1, class _Tp2> 61*e4b17023SJohn Marino struct tuple_element<0, std::pair<_Tp1, _Tp2> > 62*e4b17023SJohn Marino { typedef _Tp1 type; }; 63*e4b17023SJohn Marino 64*e4b17023SJohn Marino template<class _Tp1, class _Tp2> 65*e4b17023SJohn Marino struct tuple_element<1, std::pair<_Tp1, _Tp2> > 66*e4b17023SJohn Marino { typedef _Tp2 type; }; 67*e4b17023SJohn Marino 68*e4b17023SJohn Marino template<int _Int> 69*e4b17023SJohn Marino struct __pair_get; 70*e4b17023SJohn Marino 71*e4b17023SJohn Marino template<> 72*e4b17023SJohn Marino struct __pair_get<0> 73*e4b17023SJohn Marino { 74*e4b17023SJohn Marino template<typename _Tp1, typename _Tp2> 75*e4b17023SJohn Marino static _Tp1& __get(std::pair<_Tp1, _Tp2>& __pair) 76*e4b17023SJohn Marino { return __pair.first; } 77*e4b17023SJohn Marino 78*e4b17023SJohn Marino template<typename _Tp1, typename _Tp2> 79*e4b17023SJohn Marino static const _Tp1& __const_get(const std::pair<_Tp1, _Tp2>& __pair) 80*e4b17023SJohn Marino { return __pair.first; } 81*e4b17023SJohn Marino }; 82*e4b17023SJohn Marino 83*e4b17023SJohn Marino template<> 84*e4b17023SJohn Marino struct __pair_get<1> 85*e4b17023SJohn Marino { 86*e4b17023SJohn Marino template<typename _Tp1, typename _Tp2> 87*e4b17023SJohn Marino static _Tp2& __get(std::pair<_Tp1, _Tp2>& __pair) 88*e4b17023SJohn Marino { return __pair.second; } 89*e4b17023SJohn Marino 90*e4b17023SJohn Marino template<typename _Tp1, typename _Tp2> 91*e4b17023SJohn Marino static const _Tp2& __const_get(const std::pair<_Tp1, _Tp2>& __pair) 92*e4b17023SJohn Marino { return __pair.second; } 93*e4b17023SJohn Marino }; 94*e4b17023SJohn Marino 95*e4b17023SJohn Marino template<int _Int, class _Tp1, class _Tp2> 96*e4b17023SJohn Marino inline typename tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type& 97*e4b17023SJohn Marino get(std::pair<_Tp1, _Tp2>& __in) 98*e4b17023SJohn Marino { return __pair_get<_Int>::__get(__in); } 99*e4b17023SJohn Marino 100*e4b17023SJohn Marino template<int _Int, class _Tp1, class _Tp2> 101*e4b17023SJohn Marino inline const typename tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type& 102*e4b17023SJohn Marino get(const std::pair<_Tp1, _Tp2>& __in) 103*e4b17023SJohn Marino { return __pair_get<_Int>::__const_get(__in); } 104*e4b17023SJohn Marino 105*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 106*e4b17023SJohn Marino} 107*e4b17023SJohn Marino} 108*e4b17023SJohn Marino 109*e4b17023SJohn Marino#endif // _GLIBCXX_TR1_UTILITY 110