diff options
| author | dgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-01 03:35:59 +0000 |
|---|---|---|
| committer | dgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-01 03:35:59 +0000 |
| commit | f35e07c2a3efc9ebe906a990e4eee12adc435e0a (patch) | |
| tree | 6989839fac1800a14041743cde970c5877a70995 /libstdc++-v3/include/tr1/tuple | |
| parent | 8fba01e80911f511447277d998260836bb4d803e (diff) | |
| download | ppe42-gcc-f35e07c2a3efc9ebe906a990e4eee12adc435e0a.tar.gz ppe42-gcc-f35e07c2a3efc9ebe906a990e4eee12adc435e0a.zip | |
2005-03-31 Chris Jefferson <chris@bubblescope.net>
* include/tr1/tuple: Support iteration via tuple_iterate.h.
* include/tr1/tuple_iterate.h: Iteration file for tuple.
2005-03-31 Douglas Gregor <doug.gregor@gmail.com>
* include/Makefile.am (tr1_headers): Add bind and mu repetition
headers and reference_wrapper<> forwarding header.
* include/Makefile.in: Regenerate.
* include/tr1/bind_iterate.h: Implementation of function call
operators for the function object returned from tr1::bind().
* include/tr1/bind_repeat.h: Bind-specific repetition header,
akin to include/tr1/repeat.h.
* include/tr1/functional (_Mem_fn): Bug fix: declare result
member
template for use with result_of.
(is_bind_expression): New.
(is_placeholder): New.
(_Placeholder): New. Placeholder type for bind.
(_Mu): New. Implementation detail of bind.
(_Bind, _Bind_result): New. Function objects returned by bind.
(_GLIBCXX_JOIN): New. Required to create bind placeholders.
* include/tr1/functional_iterate.h (_Bind, _Bind_result, bind):
New. Implementation of tr1::bind.
* include/tr1/mu_iterate.h (_Mu): result template and operator()
for the _Mu helper to bind.
* include/tr1/ref_fwd.h (reference_wrapper): Forward declaration
used by tuple header.
(ref): Ditto.
(cref): Ditto.
* include/tr1/repeat.h: Add bind-specific repetition macros.
* include/tr1/tuple: Use reference_wrapper forwarding header for
initial definitions, then include <tr1/functional> at the end, to
make the circular dependencies work.
(tie): Support zero-argument tie() function.
* testsuite/tr1/3_function_objects/bind/all_bound.cc: New test of
bind() functionality with parameters bound.
* testsuite/tr1/3_function_objects/bind/nested.cc: New test of
nested bind() expressions.
* testsuite/tr1/3_function_objects/bind/placeholders.cc: New test
of bind() placeholders.
* testsuite/tr1/3_function_objects/bind/ref.cc: New test of bind()
with arguments bound via reference_wrapper<>.
* scripts/gen_includers.pl: Generate the repetitive part of
include/tr1/repeat.h.
* scripts/gen_bind_includers.pl: Generate the repetitive part of
include/tr1/bind_repeat.h.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97361 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/tr1/tuple')
| -rw-r--r-- | libstdc++-v3/include/tr1/tuple | 1643 |
1 files changed, 230 insertions, 1413 deletions
diff --git a/libstdc++-v3/include/tr1/tuple b/libstdc++-v3/include/tr1/tuple index b3fed8ad6d6..89bccc3d495 100644 --- a/libstdc++-v3/include/tr1/tuple +++ b/libstdc++-v3/include/tr1/tuple @@ -27,1432 +27,249 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. -/** @file - * This is a TR1 C++ Library header. - */ +/** @file +* This is a TR1 C++ Library header. +*/ // Chris Jefferson <chris@bubblescope.net> -// This header is automatically generated: see maketuple.c for details. - #ifndef _TUPLE #define _TUPLE 1 #include <tr1/utility> -#include <tr1/functional> +#include <tr1/ref_fwd.h> namespace std { namespace tr1 { - // An implementation specific class which is used in the tuple class - // when the tuple is not maximum possible size. - struct _NullClass { }; - - template<typename _Tp0 = _NullClass, typename _Tp1 = _NullClass, - typename _Tp2 = _NullClass, typename _Tp3 = _NullClass, - typename _Tp4 = _NullClass, typename _Tp5 = _NullClass, - typename _Tp6 = _NullClass, typename _Tp7 = _NullClass, - typename _Tp8 = _NullClass, typename _Tp9 = _NullClass> - class tuple; - - /// Gives the type of the ith element of a given tuple type. - template<int __i, typename _Tp> - struct tuple_element; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<0, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp0 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<1, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp1 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<2, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp2 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<3, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp3 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<4, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp4 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<5, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp5 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<6, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp6 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<7, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp7 type; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<8, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp8 type; }; - - /// @brief class tuple_element - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_element<9, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> > - { typedef _Tp9 type; }; - - /// Finds the size of a given tuple type. - template<typename _Tp> - struct tuple_size; - - template<> - struct tuple_size<tuple<_NullClass, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass> > - { static const int value = 0; }; - - template< typename _Tp0> - struct tuple_size<tuple< _Tp0, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass> > - { static const int value = 1; }; - - template<typename _Tp0, typename _Tp1> - struct tuple_size<tuple<_Tp0, _Tp1, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass, - _NullClass> > - { static const int value = 2; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass, - _NullClass> > - { static const int value = 3; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass> > - { static const int value = 4; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass> > - { static const int value = 5; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _NullClass, - _NullClass, _NullClass, _NullClass> > - { static const int value = 6; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _NullClass, _NullClass, _NullClass> > - { static const int value = 7; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, - _NullClass, _NullClass> > - { static const int value = 8; }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, - _Tp8, _NullClass> > - { static const int value = 9; }; - - /// @brief class tuple_size - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, - _Tp8, _Tp9> > - { static const int value = 10; }; - - // Adds a const reference to a non-reference type. - template<typename _Tp> - struct __add_c_ref - { typedef const _Tp& type; }; - - template<typename _Tp> - struct __add_c_ref<_Tp&> - { typedef _Tp& type; }; - - // Adds a reference to a non-reference type. - template<typename _Tp> - struct __add_ref - { typedef _Tp& type; }; - - template<typename _Tp> - struct __add_ref<_Tp&> - { typedef _Tp& type; }; - - // The empty tuple. - template<> - class tuple<_NullClass, _NullClass, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass, _NullClass> - { - public: - tuple() - { } - - tuple(const tuple& __in) - { } - - tuple& operator=(const tuple& __in) - { return *this; } - }; - - template< typename _Tp0> - class tuple< _Tp0, _NullClass, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass, _NullClass> - { - _Tp0 _M_t0; - - public: - tuple() - { } - - explicit tuple( typename __add_c_ref<_Tp0>::type __in0): - _M_t0(__in0) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0) - { } - - template< typename _Up0> - tuple(const tuple< _Up0>& __in): - _M_t0(__in._M_t0) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - return *this; - } - - template< typename _Up0> - tuple& - operator=(const tuple< _Up0>& __in) - { - _M_t0=__in._M_t0; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1> - class tuple<_Tp0, _Tp1, _NullClass, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1): - _M_t0(__in0), _M_t1(__in1) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1) - { } - - template<typename _Up0, typename _Up1> - tuple(const tuple<_Up0, _Up1>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1) - { } - - template<class _Up1, class _Up2> - tuple(const std::pair<_Up1, _Up2>& __u): - _M_t0(__u.first), _M_t1(__u.second) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - return *this; - } - - template<typename _Up0, typename _Up1> - tuple& - operator=(const tuple<_Up0, _Up1>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2> - class tuple<_Tp0, _Tp1, _Tp2, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass, _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2) - { } - - template<typename _Up0, typename _Up1, typename _Up2> - tuple(const tuple<_Up0, _Up1, _Up2>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3> - class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _NullClass, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - _Tp3 _M_t3; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2, - typename __add_c_ref<_Tp3>::type __in3): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3) - { } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3> - tuple(const tuple<_Up0, _Up1, _Up2, _Up3>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2, _Up3>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4> - class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _NullClass, _NullClass, - _NullClass, _NullClass, _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - _Tp3 _M_t3; - _Tp4 _M_t4; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2, - typename __add_c_ref<_Tp3>::type __in3, - typename __add_c_ref<_Tp4>::type __in4): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4) - { } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4> - tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5> - class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _NullClass, _NullClass, - _NullClass, _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - _Tp3 _M_t3; - _Tp4 _M_t4; - _Tp5 _M_t5; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2, - typename __add_c_ref<_Tp3>::type __in3, - typename __add_c_ref<_Tp4>::type __in4, - typename __add_c_ref<_Tp5>::type __in5): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4), - _M_t5(__in5) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5) - { } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5> - tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6> - class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _NullClass, - _NullClass, _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - _Tp3 _M_t3; - _Tp4 _M_t4; - _Tp5 _M_t5; - _Tp6 _M_t6; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2, - typename __add_c_ref<_Tp3>::type __in3, - typename __add_c_ref<_Tp4>::type __in4, - typename __add_c_ref<_Tp5>::type __in5, - typename __add_c_ref<_Tp6>::type __in6): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4), - _M_t5(__in5), _M_t6(__in6) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6) - { } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6> - tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, - _Up6>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7> - class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _NullClass, - _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - _Tp3 _M_t3; - _Tp4 _M_t4; - _Tp5 _M_t5; - _Tp6 _M_t6; - _Tp7 _M_t7; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2, - typename __add_c_ref<_Tp3>::type __in3, - typename __add_c_ref<_Tp4>::type __in4, - typename __add_c_ref<_Tp5>::type __in5, - typename __add_c_ref<_Tp6>::type __in6, - typename __add_c_ref<_Tp7>::type __in7): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4), - _M_t5(__in5), _M_t6(__in6), _M_t7(__in7) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6), _M_t7(__in._M_t7) - { } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6, typename _Up7> - tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, - _Up7>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6), _M_t7(__in._M_t7) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - _M_t7=__in._M_t7; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6, typename _Up7> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, - _Up7>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - _M_t7=__in._M_t7; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8> - class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, - _NullClass> - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - _Tp3 _M_t3; - _Tp4 _M_t4; - _Tp5 _M_t5; - _Tp6 _M_t6; - _Tp7 _M_t7; - _Tp8 _M_t8; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2, - typename __add_c_ref<_Tp3>::type __in3, - typename __add_c_ref<_Tp4>::type __in4, - typename __add_c_ref<_Tp5>::type __in5, - typename __add_c_ref<_Tp6>::type __in6, - typename __add_c_ref<_Tp7>::type __in7, - typename __add_c_ref<_Tp8>::type __in8): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4), - _M_t5(__in5), _M_t6(__in6), _M_t7(__in7), _M_t8(__in8) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8) - { } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6, typename _Up7, - typename _Up8> - tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, - _Up8>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - _M_t7=__in._M_t7; - _M_t8=__in._M_t8; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6, typename _Up7, - typename _Up8> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, - _Up8>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - _M_t7=__in._M_t7; - _M_t8=__in._M_t8; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - /// @brief Template class tuple - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - class tuple - { - _Tp0 _M_t0; - _Tp1 _M_t1; - _Tp2 _M_t2; - _Tp3 _M_t3; - _Tp4 _M_t4; - _Tp5 _M_t5; - _Tp6 _M_t6; - _Tp7 _M_t7; - _Tp8 _M_t8; - _Tp9 _M_t9; - - public: - tuple() - { } - - explicit tuple(typename __add_c_ref<_Tp0>::type __in0, - typename __add_c_ref<_Tp1>::type __in1, - typename __add_c_ref<_Tp2>::type __in2, - typename __add_c_ref<_Tp3>::type __in3, - typename __add_c_ref<_Tp4>::type __in4, - typename __add_c_ref<_Tp5>::type __in5, - typename __add_c_ref<_Tp6>::type __in6, - typename __add_c_ref<_Tp7>::type __in7, - typename __add_c_ref<_Tp8>::type __in8, - typename __add_c_ref<_Tp9>::type __in9): - _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4), - _M_t5(__in5), _M_t6(__in6), _M_t7(__in7), _M_t8(__in8), _M_t9(__in9) - { } - - tuple(const tuple& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8), - _M_t9(__in._M_t9) - { } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6, typename _Up7, - typename _Up8, typename _Up9> - tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, - _Up9>& __in): - _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2), - _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5), - _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8), - _M_t9(__in._M_t9) - { } - - tuple& - operator=(const tuple& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - _M_t7=__in._M_t7; - _M_t8=__in._M_t8; - _M_t9=__in._M_t9; - return *this; - } - - template<typename _Up0, typename _Up1, typename _Up2, typename _Up3, - typename _Up4, typename _Up5, typename _Up6, typename _Up7, - typename _Up8, typename _Up9> - tuple& - operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, - _Up8, _Up9>& __in) - { - _M_t0=__in._M_t0; - _M_t1=__in._M_t1; - _M_t2=__in._M_t2; - _M_t3=__in._M_t3; - _M_t4=__in._M_t4; - _M_t5=__in._M_t5; - _M_t6=__in._M_t6; - _M_t7=__in._M_t7; - _M_t8=__in._M_t8; - _M_t9=__in._M_t9; - return *this; - } - - template<int __i, typename _Up> - friend class __get_helper; - template<typename, typename, typename, typename, typename, typename, - typename, typename, typename, typename> - friend class tuple; - }; - - // Class used in the implementation of get - template<int __i, typename _Tp> - struct __get_helper; - - template<typename _Tp> - struct __get_helper<0, _Tp> - { - static typename __add_ref<typename tuple_element<0, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t0; } - - static typename __add_c_ref<typename tuple_element<0, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t0; } - }; - - template<typename _Tp> - struct __get_helper<1, _Tp> - { - static typename __add_ref<typename tuple_element<1, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t1; } - - static typename __add_c_ref<typename tuple_element<1, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t1; } - }; - - template<typename _Tp> - struct __get_helper<2, _Tp> - { - static typename __add_ref<typename tuple_element<2, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t2; } - - static typename __add_c_ref<typename tuple_element<2, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t2; } - }; - - template<typename _Tp> - struct __get_helper<3, _Tp> - { - static typename __add_ref<typename tuple_element<3, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t3; } - - static typename __add_c_ref<typename tuple_element<3, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t3; } - }; - - template<typename _Tp> - struct __get_helper<4, _Tp> - { - static typename __add_ref<typename tuple_element<4, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t4; } - - static typename __add_c_ref<typename tuple_element<4, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t4; } - }; - - template<typename _Tp> - struct __get_helper<5, _Tp> - { - static typename __add_ref<typename tuple_element<5, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t5; } - - static typename __add_c_ref<typename tuple_element<5, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t5; } - }; - - template<typename _Tp> - struct __get_helper<6, _Tp> - { - static typename __add_ref<typename tuple_element<6, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t6; } - - static typename __add_c_ref<typename tuple_element<6, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t6; } - }; - - template<typename _Tp> - struct __get_helper<7, _Tp> - { - static typename __add_ref<typename tuple_element<7, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t7; } - - static typename __add_c_ref<typename tuple_element<7, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t7; } - }; - - template<typename _Tp> - struct __get_helper<8, _Tp> - { - static typename __add_ref<typename tuple_element<8, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t8; } - - static typename __add_c_ref<typename tuple_element<8, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t8; } - }; - - template<typename _Tp> - struct __get_helper<9, _Tp> - { - static typename __add_ref<typename tuple_element<9, _Tp>::type>::type - get_value(_Tp& __in) - { return __in._M_t9; } - - static typename __add_c_ref<typename tuple_element<9, _Tp>::type>::type - get_value(const _Tp& __in) - { return __in._M_t9; } - }; - - // Returns a reference to the ith element of a tuple. - // Any const or non-const ref elements are returned with their original type. - template<int __i, typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - typename __add_ref<typename tuple_element<__i, tuple<_Tp0, _Tp1, _Tp2, - _Tp3, _Tp4, _Tp5, - _Tp6, _Tp7, _Tp8, - _Tp9> >::type>::type - get(tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, - _Tp9>& __t) - { - return __get_helper<__i, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> >::get_value(__t); - } - - // Returns a const reference to the ith element of a tuple. - // Any const or non-const ref elements are returned with their original type. - template<int __i, typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - typename __add_c_ref<typename tuple_element<__i, tuple<_Tp0, _Tp1, _Tp2, - _Tp3, _Tp4, _Tp5, - _Tp6, _Tp7, _Tp8, - _Tp9> >::type>::type - get(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, - _Tp9>& __t) - { - return __get_helper<__i, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9> >::get_value(__t); - } - - // This class helps construct the various comparison operations on tuples - template<int __check_equal_size, int __i, int __j, typename _Tp, typename _Up> - struct __tuple_compare; - - template<int __i, int __j, typename _Tp, typename _Up> - struct __tuple_compare<0, __i, __j, _Tp, _Up> - { - static bool __eq(const _Tp& __t, const _Up& __u) - { - return get<__i>(__t) == get<__i>(__u) && - __tuple_compare<0, __i+1, __j, _Tp, _Up>::__eq(__t, __u); - } - static bool __less(const _Tp& __t, const _Up& __u) - { - return (get<__i>(__t) < get<__i>(__u)) || !(get<__i>(__u) < get<__i>(__t)) && - __tuple_compare<0, __i+1, __j, _Tp, _Up>::__less(__t, __u); - } - }; - - template<int __i, typename _Tp, typename _Up> - struct __tuple_compare<0, __i, __i, _Tp, _Up> - { - static bool __eq(const _Tp&, const _Up&) - { return true; } - static bool __less(const _Tp&, const _Up&) - { return false; } - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9, typename _Up0, typename _Up1, - typename _Up2, typename _Up3, typename _Up4, typename _Up5, - typename _Up6, typename _Up7, typename _Up8, typename _Up9> - bool - operator==(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t, - const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u) - { - typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, - _Tp9> _Tp; - typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, - _Up9> _Up; - return __tuple_compare<tuple_size<_Tp>::value - - tuple_size<_Tp>::value, 0, - tuple_size<_Tp>::value, _Tp, _Up>::__eq(__t, __u); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9, typename _Up0, typename _Up1, - typename _Up2, typename _Up3, typename _Up4, typename _Up5, - typename _Up6, typename _Up7, typename _Up8, typename _Up9> - bool - operator<(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t, - const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u) - { - typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, - _Tp9> _Tp; - typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, - _Up9> _Up; - return __tuple_compare<tuple_size<_Tp>::value - - tuple_size<_Tp>::value, 0, - tuple_size<_Tp>::value, _Tp, _Up>::__less(__t, __u); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9, typename _Up0, typename _Up1, - typename _Up2, typename _Up3, typename _Up4, typename _Up5, - typename _Up6, typename _Up7, typename _Up8, typename _Up9> - bool - operator!=(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t, - const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u) - { - return !(__t == __u); - } - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9, typename _Up0, typename _Up1, - typename _Up2, typename _Up3, typename _Up4, typename _Up5, - typename _Up6, typename _Up7, typename _Up8, typename _Up9> - bool - operator>(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t, - const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u) - { - return __u < __t; - } - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9, typename _Up0, typename _Up1, - typename _Up2, typename _Up3, typename _Up4, typename _Up5, - typename _Up6, typename _Up7, typename _Up8, typename _Up9> - bool - operator<=(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t, - const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u) - { - return !(__u < __t); - } - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9, typename _Up0, typename _Up1, - typename _Up2, typename _Up3, typename _Up4, typename _Up5, - typename _Up6, typename _Up7, typename _Up8, typename _Up9> - bool - operator>=(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t, - const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u) - { - return !(__t < __u); - } - - // Helper which adds a reference to a type when given a reference_wrapper - template<typename _Tp> - struct __strip_reference_wrapper - { - typedef _Tp __type; - }; - - template<typename _Tp> - struct __strip_reference_wrapper<reference_wrapper<_Tp> > - { - typedef _Tp& __type; - }; - - template<typename _Tp> - struct __strip_reference_wrapper<const reference_wrapper<_Tp> > - { - typedef _Tp& __type; - }; - - template<typename _Tp0 = _NullClass, typename _Tp1 = _NullClass, - typename _Tp2 = _NullClass, typename _Tp3 = _NullClass, - typename _Tp4 = _NullClass, typename _Tp5 = _NullClass, - typename _Tp6 = _NullClass, typename _Tp7 = _NullClass, - typename _Tp8 = _NullClass, typename _Tp9 = _NullClass> - struct __stripped_tuple_type - { - typedef tuple<typename __strip_reference_wrapper<_Tp0>::__type, - typename __strip_reference_wrapper<_Tp1>::__type, - typename __strip_reference_wrapper<_Tp2>::__type, - typename __strip_reference_wrapper<_Tp3>::__type, - typename __strip_reference_wrapper<_Tp4>::__type, - typename __strip_reference_wrapper<_Tp5>::__type, - typename __strip_reference_wrapper<_Tp6>::__type, - typename __strip_reference_wrapper<_Tp7>::__type, - typename __strip_reference_wrapper<_Tp8>::__type, - typename __strip_reference_wrapper<_Tp9>::__type> __type; - }; - - tuple<> - make_tuple() - { return tuple<>(); } - - template< typename _Tp0> - typename __stripped_tuple_type< _Tp0>::__type - make_tuple( _Tp0 __t0) - { - return typename __stripped_tuple_type< _Tp0>:: - __type( __t0); - } - - template<typename _Tp0, typename _Tp1> - typename __stripped_tuple_type<_Tp0, _Tp1>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1) - { - return typename __stripped_tuple_type<_Tp0, _Tp1>:: - __type(__t0, __t1); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2>:: - __type(__t0, __t1, __t2); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3>:: - __type(__t0, __t1, __t2, __t3); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4>:: - __type(__t0, __t1, __t2, __t3, __t4); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, - _Tp5>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4, - _Tp5 __t5) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, - _Tp5>:: - __type(__t0, __t1, __t2, __t3, __t4, __t5); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, - _Tp6>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4, - _Tp5 __t5, _Tp6 __t6) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, - _Tp5, _Tp6>:: - __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4, - _Tp5 __t5, _Tp6 __t6, _Tp7 __t7) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, - _Tp5, _Tp6, _Tp7>:: - __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6, __t7); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4, - _Tp5 __t5, _Tp6 __t6, _Tp7 __t7, _Tp8 __t8) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, - _Tp5, _Tp6, _Tp7, _Tp8>:: - __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6, __t7, __t8); - } - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, - _Tp7, _Tp8, _Tp9>::__type - make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4, - _Tp5 __t5, _Tp6 __t6, _Tp7 __t7, _Tp8 __t8, _Tp9 __t9) - { - return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, - _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>:: - __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6, __t7, __t8, __t9); - } - - // A class (and instance) which can be used in 'tie' when an element - // of a tuple is not required - struct swallow_assign - { - template<class T> - swallow_assign& - operator=(const T&) - { return *this; } - }; - - // TODO: Put this in some kind of shared file. - namespace - { - swallow_assign ignore; - }; - - - // Forms a tuple of references to a list of variables. - template< typename _Tp0> - tuple< _Tp0&> - tie( _Tp0& __t0) - { - return make_tuple( ref(__t0)); - }; - - template<typename _Tp0, typename _Tp1> - tuple<_Tp0&, _Tp1&> - tie(_Tp0& __t0, _Tp1& __t1) - { - return make_tuple(ref(__t0), ref(__t1)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2> - tuple<_Tp0&, _Tp1&, _Tp2&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3> - tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4> - tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), - ref(__t4)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5> - tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, - _Tp5& __t5) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4), - ref(__t5)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6> - tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5, - _Tp6& __t6) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4), - ref(__t5), ref(__t6)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7> - tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&, _Tp7&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5, - _Tp6& __t6, _Tp7& __t7) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4), - ref(__t5), ref(__t6), ref(__t7)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8> - tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&, _Tp7&, _Tp8&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5, - _Tp6& __t6, _Tp7& __t7, _Tp8& __t8) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4), - ref(__t5), ref(__t6), ref(__t7), ref(__t8)); - }; - - template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, - typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, - typename _Tp8, typename _Tp9> - tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&, _Tp7&, _Tp8&, - _Tp9&> - tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5, - _Tp6& __t6, _Tp7& __t7, _Tp8& __t8, _Tp9& __t9) - { - return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4), - ref(__t5), ref(__t6), ref(__t7), ref(__t8), - ref(__t9)); - }; - + // An implementation specific class which is used in the tuple class + // when the tuple is not maximum possible size. + struct _NullClass { }; + + template<typename _Tp0 = _NullClass, typename _Tp1 = _NullClass, + typename _Tp2 = _NullClass, typename _Tp3 = _NullClass, + typename _Tp4 = _NullClass, typename _Tp5 = _NullClass, + typename _Tp6 = _NullClass, typename _Tp7 = _NullClass, + typename _Tp8 = _NullClass, typename _Tp9 = _NullClass> + class tuple; + + /// Gives the type of the ith element of a given tuple type. + template<int __i, typename _Tp> + struct tuple_element; + + /// Finds the size of a given tuple type. + template<typename _Tp> + struct tuple_size; + + // Adds a const reference to a non-reference type. + template<typename _Tp> + struct __add_c_ref + { typedef const _Tp& type; }; + + template<typename _Tp> + struct __add_c_ref<_Tp&> + { typedef _Tp& type; }; + + // Adds a reference to a non-reference type. + template<typename _Tp> + struct __add_ref + { typedef _Tp& type; }; + + template<typename _Tp> + struct __add_ref<_Tp&> + { typedef _Tp& type; }; + + // Class used in the implementation of get + template<int __i, typename _Tp> + struct __get_helper; + + // Returns a const reference to the ith element of a tuple. + // Any const or non-const ref elements are returned with their original type. + template<int __i, typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, + typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, + typename _Tp8, typename _Tp9> + typename __add_ref<typename tuple_element<__i, tuple<_Tp0, _Tp1, _Tp2, + _Tp3, _Tp4, _Tp5, + _Tp6, _Tp7, _Tp8, + _Tp9> >::type>::type + get(tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, + _Tp9>& __t) + { + return __get_helper<__i, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, + _Tp7, _Tp8, _Tp9> >::get_value(__t); + } + + template<int __i, typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, + typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7, + typename _Tp8, typename _Tp9> + typename __add_c_ref<typename tuple_element<__i, tuple<_Tp0, _Tp1, _Tp2, + _Tp3, _Tp4, _Tp5, + _Tp6, _Tp7, _Tp8, + _Tp9> >::type>::type + get(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, + _Tp9>& __t) + { + return __get_helper<__i, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, + _Tp7, _Tp8, _Tp9> >::get_value(__t); + } + + // This class helps construct the various comparison operations on tuples + template<int __check_equal_size, int __i, int __j, typename _Tp, typename _Up> + struct __tuple_compare; + + template<int __i, int __j, typename _Tp, typename _Up> + struct __tuple_compare<0, __i, __j, _Tp, _Up> + { + static bool __eq(const _Tp& __t, const _Up& __u) + { + return get<__i>(__t) == get<__i>(__u) && + __tuple_compare<0, __i+1, __j, _Tp, _Up>::__eq(__t, __u); + } + static bool __less(const _Tp& __t, const _Up& __u) + { + return (get<__i>(__t) < get<__i>(__u)) || !(get<__i>(__u) < get<__i>(__t)) && + __tuple_compare<0, __i+1, __j, _Tp, _Up>::__less(__t, __u); + } + }; + + template<int __i, typename _Tp, typename _Up> + struct __tuple_compare<0, __i, __i, _Tp, _Up> + { + static bool __eq(const _Tp&, const _Up&) + { return true; } + static bool __less(const _Tp&, const _Up&) + { return false; } + }; + + template<typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, + typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, + typename _U1, typename _U2, typename _U3, typename _U4, typename _U5, + typename _U6, typename _U7, typename _U8, typename _U9, typename _U10> + bool + operator==(const tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10>& __t, + const tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8, _U9, _U10>& __u) + { + typedef tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10> _Tp; + typedef tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8,_U9, _U10> _Up; + return __tuple_compare<tuple_size<_Tp>::value - tuple_size<_Tp>::value, 0, + tuple_size<_Tp>::value, _Tp, _Up>::__eq(__t, __u); + } + + template<typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, + typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, + typename _U1, typename _U2, typename _U3, typename _U4, typename _U5, + typename _U6, typename _U7, typename _U8, typename _U9, typename _U10> + bool + operator<(const tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10>& __t, + const tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8, _U9, _U10>& __u) + { + typedef tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10> _Tp; + typedef tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8,_U9, _U10> _Up; + return __tuple_compare<tuple_size<_Tp>::value - tuple_size<_Tp>::value, 0, + tuple_size<_Tp>::value, _Tp, _Up>::__less(__t, __u); + } + + template<typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, + typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, + typename _U1, typename _U2, typename _U3, typename _U4, typename _U5, + typename _U6, typename _U7, typename _U8, typename _U9, typename _U10> + bool + operator!=(const tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10>& __t, + const tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8, _U9, _U10>& __u) + { return !(__t == __u); } + + template<typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, + typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, + typename _U1, typename _U2, typename _U3, typename _U4, typename _U5, + typename _U6, typename _U7, typename _U8, typename _U9, typename _U10> + bool + operator>(const tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10>& __t, + const tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8, _U9, _U10>& __u) + { return __u < __t; } + + template<typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, + typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, + typename _U1, typename _U2, typename _U3, typename _U4, typename _U5, + typename _U6, typename _U7, typename _U8, typename _U9, typename _U10> + bool + operator<=(const tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10>& __t, + const tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8, _U9, _U10>& __u) + { return !(__u < __t); } + + template<typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, + typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, + typename _U1, typename _U2, typename _U3, typename _U4, typename _U5, + typename _U6, typename _U7, typename _U8, typename _U9, typename _U10> + bool + operator>=(const tuple<_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10>& __t, + const tuple<_U1, _U2, _U3, _U4, _U5, _U6, _U7, _U8, _U9, _U10>& __u) + { return !(__t < __u); } + + // Helper which adds a reference to a type when given a reference_wrapper + template<typename _Tp> + struct __strip_reference_wrapper + { + typedef _Tp __type; + }; + + template<typename _Tp> + struct __strip_reference_wrapper<reference_wrapper<_Tp> > + { + typedef _Tp& __type; + }; + + template<typename _Tp> + struct __strip_reference_wrapper<const reference_wrapper<_Tp> > + { + typedef _Tp& __type; + }; + + template<typename _Tp0 = _NullClass, typename _Tp1 = _NullClass, + typename _Tp2 = _NullClass, typename _Tp3 = _NullClass, + typename _Tp4 = _NullClass, typename _Tp5 = _NullClass, + typename _Tp6 = _NullClass, typename _Tp7 = _NullClass, + typename _Tp8 = _NullClass, typename _Tp9 = _NullClass> + struct __stripped_tuple_type + { + typedef tuple<typename __strip_reference_wrapper<_Tp0>::__type, + typename __strip_reference_wrapper<_Tp1>::__type, + typename __strip_reference_wrapper<_Tp2>::__type, + typename __strip_reference_wrapper<_Tp3>::__type, + typename __strip_reference_wrapper<_Tp4>::__type, + typename __strip_reference_wrapper<_Tp5>::__type, + typename __strip_reference_wrapper<_Tp6>::__type, + typename __strip_reference_wrapper<_Tp7>::__type, + typename __strip_reference_wrapper<_Tp8>::__type, + typename __strip_reference_wrapper<_Tp9>::__type> __type; + }; + + // A class (and instance) which can be used in 'tie' when an element + // of a tuple is not required + struct swallow_assign + { + template<class T> + swallow_assign& + operator=(const T&) + { return *this; } + }; + + // TODO: Put this in some kind of shared file. + namespace + { + swallow_assign ignore; + }; + +#define _GLIBCXX_CAT(x,y) _GLIBCXX_CAT2(x,y) +#define _GLIBCXX_CAT2(x,y) x##y +#define _SHORT_REPEAT +#define _GLIBCXX_REPEAT_HEADER <tr1/tuple_iterate.h> +#include <tr1/repeat.h> +#undef _GLIBCXX_REPEAT_HEADER +#undef _SHORT_REPEAT } } -#endif +#include <tr1/functional> +#endif |

