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