1*f8a1b7d9SAlexander Kabaev// class template tuple -*- C++ -*- 2*f8a1b7d9SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaev// Copyright (C) 2004, 2005 Free Software Foundation, Inc. 4*f8a1b7d9SAlexander Kabaev// 5*f8a1b7d9SAlexander Kabaev// This file is part of the GNU ISO C++ Library. This library is free 6*f8a1b7d9SAlexander Kabaev// software; you can redistribute it and/or modify it under the 7*f8a1b7d9SAlexander Kabaev// terms of the GNU General Public License as published by the 8*f8a1b7d9SAlexander Kabaev// Free Software Foundation; either version 2, or (at your option) 9*f8a1b7d9SAlexander Kabaev// any later version. 10*f8a1b7d9SAlexander Kabaev 11*f8a1b7d9SAlexander Kabaev// This library is distributed in the hope that it will be useful, 12*f8a1b7d9SAlexander Kabaev// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*f8a1b7d9SAlexander Kabaev// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*f8a1b7d9SAlexander Kabaev// GNU General Public License for more details. 15*f8a1b7d9SAlexander Kabaev 16*f8a1b7d9SAlexander Kabaev// You should have received a copy of the GNU General Public License along 17*f8a1b7d9SAlexander Kabaev// with this library; see the file COPYING. If not, write to the Free 18*f8a1b7d9SAlexander Kabaev// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19*f8a1b7d9SAlexander Kabaev// USA. 20*f8a1b7d9SAlexander Kabaev 21*f8a1b7d9SAlexander Kabaev// As a special exception, you may use this file as part of a free software 22*f8a1b7d9SAlexander Kabaev// library without restriction. Specifically, if other files instantiate 23*f8a1b7d9SAlexander Kabaev// templates or use macros or inline functions from this file, or you compile 24*f8a1b7d9SAlexander Kabaev// this file and link it with other files to produce an executable, this 25*f8a1b7d9SAlexander Kabaev// file does not by itself cause the resulting executable to be covered by 26*f8a1b7d9SAlexander Kabaev// the GNU General Public License. This exception does not however 27*f8a1b7d9SAlexander Kabaev// invalidate any other reasons why the executable file might be covered by 28*f8a1b7d9SAlexander Kabaev// the GNU General Public License. 29*f8a1b7d9SAlexander Kabaev 30*f8a1b7d9SAlexander Kabaev/** @file tr1/tuple 31*f8a1b7d9SAlexander Kabaev* This is a TR1 C++ Library header. 32*f8a1b7d9SAlexander Kabaev*/ 33*f8a1b7d9SAlexander Kabaev 34*f8a1b7d9SAlexander Kabaev// Chris Jefferson <[email protected]> 35*f8a1b7d9SAlexander Kabaev 36*f8a1b7d9SAlexander Kabaev#ifndef _TR1_TUPLE 37*f8a1b7d9SAlexander Kabaev#define _TR1_TUPLE 1 38*f8a1b7d9SAlexander Kabaev 39*f8a1b7d9SAlexander Kabaev#include <tr1/utility> 40*f8a1b7d9SAlexander Kabaev#include <tr1/ref_fwd.h> 41*f8a1b7d9SAlexander Kabaev 42*f8a1b7d9SAlexander Kabaevnamespace std 43*f8a1b7d9SAlexander Kabaev{ 44*f8a1b7d9SAlexander Kabaev_GLIBCXX_BEGIN_NAMESPACE(tr1) 45*f8a1b7d9SAlexander Kabaev 46*f8a1b7d9SAlexander Kabaev // An implementation specific class which is used in the tuple class 47*f8a1b7d9SAlexander Kabaev // when the tuple is not maximum possible size. 48*f8a1b7d9SAlexander Kabaev struct _NullClass { }; 49*f8a1b7d9SAlexander Kabaev 50*f8a1b7d9SAlexander Kabaev /// Gives the type of the ith element of a given tuple type. 51*f8a1b7d9SAlexander Kabaev template<int __i, typename _Tp> 52*f8a1b7d9SAlexander Kabaev struct tuple_element; 53*f8a1b7d9SAlexander Kabaev 54*f8a1b7d9SAlexander Kabaev /// Finds the size of a given tuple type. 55*f8a1b7d9SAlexander Kabaev template<typename _Tp> 56*f8a1b7d9SAlexander Kabaev struct tuple_size; 57*f8a1b7d9SAlexander Kabaev 58*f8a1b7d9SAlexander Kabaev // Adds a const reference to a non-reference type. 59*f8a1b7d9SAlexander Kabaev template<typename _Tp> 60*f8a1b7d9SAlexander Kabaev struct __add_c_ref 61*f8a1b7d9SAlexander Kabaev { typedef const _Tp& type; }; 62*f8a1b7d9SAlexander Kabaev 63*f8a1b7d9SAlexander Kabaev template<typename _Tp> 64*f8a1b7d9SAlexander Kabaev struct __add_c_ref<_Tp&> 65*f8a1b7d9SAlexander Kabaev { typedef _Tp& type; }; 66*f8a1b7d9SAlexander Kabaev 67*f8a1b7d9SAlexander Kabaev // Adds a reference to a non-reference type. 68*f8a1b7d9SAlexander Kabaev template<typename _Tp> 69*f8a1b7d9SAlexander Kabaev struct __add_ref 70*f8a1b7d9SAlexander Kabaev { typedef _Tp& type; }; 71*f8a1b7d9SAlexander Kabaev 72*f8a1b7d9SAlexander Kabaev template<typename _Tp> 73*f8a1b7d9SAlexander Kabaev struct __add_ref<_Tp&> 74*f8a1b7d9SAlexander Kabaev { typedef _Tp& type; }; 75*f8a1b7d9SAlexander Kabaev 76*f8a1b7d9SAlexander Kabaev // Class used in the implementation of get 77*f8a1b7d9SAlexander Kabaev template<int __i, typename _Tp> 78*f8a1b7d9SAlexander Kabaev struct __get_helper; 79*f8a1b7d9SAlexander Kabaev 80*f8a1b7d9SAlexander Kabaev // Returns a const reference to the ith element of a tuple. 81*f8a1b7d9SAlexander Kabaev // Any const or non-const ref elements are returned with their original type. 82*f8a1b7d9SAlexander Kabaev 83*f8a1b7d9SAlexander Kabaev // This class helps construct the various comparison operations on tuples 84*f8a1b7d9SAlexander Kabaev template<int __check_equal_size, int __i, int __j, typename _Tp, typename _Up> 85*f8a1b7d9SAlexander Kabaev struct __tuple_compare; 86*f8a1b7d9SAlexander Kabaev 87*f8a1b7d9SAlexander Kabaev // Helper which adds a reference to a type when given a reference_wrapper 88*f8a1b7d9SAlexander Kabaev template<typename _Tp> 89*f8a1b7d9SAlexander Kabaev struct __strip_reference_wrapper 90*f8a1b7d9SAlexander Kabaev { 91*f8a1b7d9SAlexander Kabaev typedef _Tp __type; 92*f8a1b7d9SAlexander Kabaev }; 93*f8a1b7d9SAlexander Kabaev 94*f8a1b7d9SAlexander Kabaev template<typename _Tp> 95*f8a1b7d9SAlexander Kabaev struct __strip_reference_wrapper<reference_wrapper<_Tp> > 96*f8a1b7d9SAlexander Kabaev { 97*f8a1b7d9SAlexander Kabaev typedef _Tp& __type; 98*f8a1b7d9SAlexander Kabaev }; 99*f8a1b7d9SAlexander Kabaev 100*f8a1b7d9SAlexander Kabaev template<typename _Tp> 101*f8a1b7d9SAlexander Kabaev struct __strip_reference_wrapper<const reference_wrapper<_Tp> > 102*f8a1b7d9SAlexander Kabaev { 103*f8a1b7d9SAlexander Kabaev typedef _Tp& __type; 104*f8a1b7d9SAlexander Kabaev }; 105*f8a1b7d9SAlexander Kabaev 106*f8a1b7d9SAlexander Kabaev #include "tuple_defs.h" 107*f8a1b7d9SAlexander Kabaev 108*f8a1b7d9SAlexander Kabaev template<int __i, int __j, typename _Tp, typename _Up> 109*f8a1b7d9SAlexander Kabaev struct __tuple_compare<0, __i, __j, _Tp, _Up> 110*f8a1b7d9SAlexander Kabaev { 111*f8a1b7d9SAlexander Kabaev static bool __eq(const _Tp& __t, const _Up& __u) 112*f8a1b7d9SAlexander Kabaev { 113*f8a1b7d9SAlexander Kabaev return get<__i>(__t) == get<__i>(__u) && 114*f8a1b7d9SAlexander Kabaev __tuple_compare<0, __i+1, __j, _Tp, _Up>::__eq(__t, __u); 115*f8a1b7d9SAlexander Kabaev } 116*f8a1b7d9SAlexander Kabaev static bool __less(const _Tp& __t, const _Up& __u) 117*f8a1b7d9SAlexander Kabaev { 118*f8a1b7d9SAlexander Kabaev return (get<__i>(__t) < get<__i>(__u)) || !(get<__i>(__u) < get<__i>(__t)) && 119*f8a1b7d9SAlexander Kabaev __tuple_compare<0, __i+1, __j, _Tp, _Up>::__less(__t, __u); 120*f8a1b7d9SAlexander Kabaev } 121*f8a1b7d9SAlexander Kabaev }; 122*f8a1b7d9SAlexander Kabaev 123*f8a1b7d9SAlexander Kabaev template<int __i, typename _Tp, typename _Up> 124*f8a1b7d9SAlexander Kabaev struct __tuple_compare<0, __i, __i, _Tp, _Up> 125*f8a1b7d9SAlexander Kabaev { 126*f8a1b7d9SAlexander Kabaev static bool __eq(const _Tp&, const _Up&) 127*f8a1b7d9SAlexander Kabaev { return true; } 128*f8a1b7d9SAlexander Kabaev static bool __less(const _Tp&, const _Up&) 129*f8a1b7d9SAlexander Kabaev { return false; } 130*f8a1b7d9SAlexander Kabaev }; 131*f8a1b7d9SAlexander Kabaev 132*f8a1b7d9SAlexander Kabaev // A class (and instance) which can be used in 'tie' when an element 133*f8a1b7d9SAlexander Kabaev // of a tuple is not required 134*f8a1b7d9SAlexander Kabaev struct swallow_assign 135*f8a1b7d9SAlexander Kabaev { 136*f8a1b7d9SAlexander Kabaev template<class T> 137*f8a1b7d9SAlexander Kabaev swallow_assign& 138*f8a1b7d9SAlexander Kabaev operator=(const T&) 139*f8a1b7d9SAlexander Kabaev { return *this; } 140*f8a1b7d9SAlexander Kabaev }; 141*f8a1b7d9SAlexander Kabaev 142*f8a1b7d9SAlexander Kabaev // TODO: Put this in some kind of shared file. 143*f8a1b7d9SAlexander Kabaev namespace 144*f8a1b7d9SAlexander Kabaev { 145*f8a1b7d9SAlexander Kabaev swallow_assign ignore; 146*f8a1b7d9SAlexander Kabaev }; // anonymous namespace 147*f8a1b7d9SAlexander Kabaev 148*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NAMESPACE 149*f8a1b7d9SAlexander Kabaev} 150*f8a1b7d9SAlexander Kabaev 151*f8a1b7d9SAlexander Kabaev#define _GLIBCXX_CAT(x,y) _GLIBCXX_CAT2(x,y) 152*f8a1b7d9SAlexander Kabaev#define _GLIBCXX_CAT2(x,y) x##y 153*f8a1b7d9SAlexander Kabaev#define _SHORT_REPEAT 154*f8a1b7d9SAlexander Kabaev#define _GLIBCXX_REPEAT_HEADER <tr1/tuple_iterate.h> 155*f8a1b7d9SAlexander Kabaev#include <tr1/repeat.h> 156*f8a1b7d9SAlexander Kabaev#undef _GLIBCXX_REPEAT_HEADER 157*f8a1b7d9SAlexander Kabaev#undef _SHORT_REPEAT 158*f8a1b7d9SAlexander Kabaev 159*f8a1b7d9SAlexander Kabaev#include <tr1/functional> 160*f8a1b7d9SAlexander Kabaev 161*f8a1b7d9SAlexander Kabaev#endif 162