]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
functional (_Has_result_type): Cleanup.
authorDouglas Gregor <doug.gregor@gmail.com>
Wed, 2 Mar 2005 12:56:28 +0000 (12:56 +0000)
committerDoug Gregor <dgregor@gcc.gnu.org>
Wed, 2 Mar 2005 12:56:28 +0000 (12:56 +0000)
2005-03-02  Douglas Gregor  <doug.gregor@gmail.com>

        * include/tr1/functional (_Has_result_type): Cleanup.
        (_Result_of_impl): Handle member data pointers correctly.
        (reference_wrapper): Support invocation.
        Move repetition code into new file include/tr1/repeat.h.
        * include/tr1/functional_iterate.h (reference_wrapper): Support
        invocation.  Cleanup long lines.
        * include/tr1/ref_wrap_iterate.h (reference_wrapper): Declare
        invocation operators.
        * include/tr1/repeat.h: Code repetition header.
        * include/Makefile.am: Add ref_wrap_iterate.h, repeat.h
        * include/Makefile.in: Add ref_wrap_iterate.h, repeat.h
        * testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc:
        New test of reference_wrapper invocation.
        * testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc:
        New test of reference_wrapper typedefs and base classes.
        * testsuite/tr1/3_function_objects/result_of.cc: Trivial cleanup
        (e-mail address).

2005-03-02  Douglas Gregor  <doug.gregor@gmail.com>

        * include/tr1/function (result_of): New class template.
        * include/tr1/functional/iterator.h: Implementation of TR1
        result_of.
        * testsuite/tr1/3_function_objects/result_of.cc: New test

From-SVN: r95778

libstdc++-v3/ChangeLog
libstdc++-v3/include/Makefile.am
libstdc++-v3/include/Makefile.in
libstdc++-v3/include/tr1/functional
libstdc++-v3/include/tr1/functional_iterate.h
libstdc++-v3/include/tr1/ref_wrap_iterate.h [new file with mode: 0644]
libstdc++-v3/include/tr1/repeat.h [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/3_function_objects/result_of.cc [new file with mode: 0644]

index 8226cbcddea6a98904df39daa2e4d1ca40d5a77e..8f758db901db0a8a91e8444126353691611e078b 100644 (file)
@@ -1,3 +1,30 @@
+2005-03-02  Douglas Gregor  <doug.gregor@gmail.com>
+
+        * include/tr1/functional (_Has_result_type): Cleanup.
+        (_Result_of_impl): Handle member data pointers correctly.
+        (reference_wrapper): Support invocation.
+        Move repetition code into new file include/tr1/repeat.h.
+        * include/tr1/functional_iterate.h (reference_wrapper): Support
+        invocation.  Cleanup long lines.
+        * include/tr1/ref_wrap_iterate.h (reference_wrapper): Declare
+        invocation operators.
+        * include/tr1/repeat.h: Code repetition header.
+        * include/Makefile.am: Add ref_wrap_iterate.h, repeat.h
+        * include/Makefile.in: Add ref_wrap_iterate.h, repeat.h
+        * testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc:
+        New test of reference_wrapper invocation.
+        * testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc:
+        New test of reference_wrapper typedefs and base classes.
+        * testsuite/tr1/3_function_objects/result_of.cc: Trivial cleanup
+        (e-mail address).
+       
+2005-03-02  Douglas Gregor  <doug.gregor@gmail.com>
+
+        * include/tr1/function (result_of): New class template.
+        * include/tr1/functional/iterator.h: Implementation of TR1
+        result_of.
+        * testsuite/tr1/3_function_objects/result_of.cc: New test
+       
 2005-03-01  Vladimir Merzliakov  <wanderer@rsu.ru>
 
        * testsuite/26_numerics/cmath/c99_classification_macros_c.cc: Tweak.
index 24da787ece4f6dfd2317aa5c866114101c940f3a..2b260b2ac6db1fd213b1fe61ee722bef88a0870a 100644 (file)
@@ -231,6 +231,8 @@ tr1_headers = \
        ${tr1_srcdir}/functional \
        ${tr1_srcdir}/functional_iterate.h \
        ${tr1_srcdir}/memory \
+       ${tr1_srcdir}/ref_wrap_iterate.h \
+       ${tr1_srcdir}/repeat.h \
        ${tr1_srcdir}/tuple \
        ${tr1_srcdir}/utility \
        ${tr1_srcdir}/type_traits \
index b7d8a2acef6158bf2981e081046b08c2e1098b8c..6fbb94337140abf025e66922bd4bd405c607e032 100644 (file)
@@ -447,6 +447,8 @@ tr1_headers = \
        ${tr1_srcdir}/functional \
        ${tr1_srcdir}/functional_iterate.h \
        ${tr1_srcdir}/memory \
+       ${tr1_srcdir}/ref_wrap_iterate.h \
+       ${tr1_srcdir}/repeat.h \
        ${tr1_srcdir}/tuple \
        ${tr1_srcdir}/utility \
        ${tr1_srcdir}/type_traits \
index 1a958c353916683766449dbd711d368869595ea4..30a79871ac8ad899339ad0854384a960fb5bed3c 100644 (file)
@@ -45,9 +45,299 @@ namespace std
 {
 namespace tr1
 {
+  template<typename _MemberPointer>
+    class _Mem_fn;
+
+  /**
+   *  @if maint
+   *  Actual implementation of _Has_result_type, which uses SFINAE to
+   *  determine if the type _Tp has a publicly-accessible member type
+   *  result_type.
+   *  @endif
+  */
+  template<typename _Tp>
+    class _Has_result_type_helper : __sfinae_types
+    {
+      template<typename _Up>
+      struct _Wrap_type
+      { };
+
+      template<typename _Up>
+        static __one __test(_Wrap_type<typename _Up::result_type>*);
+
+      template<typename _Up>
+        static __two __test(...);
+
+    public:
+      static const bool value = sizeof(__test<_Tp>(0)) == 1;
+    };
+
+  template<typename _Tp>
+    struct _Has_result_type
+       : integral_constant<
+           bool,
+           _Has_result_type_helper<typename remove_cv<_Tp>::type>::value>
+    { };
+
+  /**
+   *  @if maint
+   *  If we have found a result_type, extract it.
+   *  @endif
+  */
+  template<bool _Has_result_type, typename _Functor>
+    struct _Maybe_get_result_type
+    { };
+
+  template<typename _Functor>
+    struct _Maybe_get_result_type<true, _Functor>
+    {
+      typedef typename _Functor::result_type result_type;
+    };
+
+  /**
+   *  @if maint
+   *  Base class for any function object that has a weak result type, as
+   *  defined in 3.3/3 of TR1.
+   *  @endif
+  */
+  template<typename _Functor>
+    struct _Weak_result_type_impl
+      : _Maybe_get_result_type<_Has_result_type<_Functor>::value, _Functor>
+    {
+    };
+
+  /**
+   *  @if maint
+   *  Strip top-level cv-qualifiers from the function object and let
+   *  _Weak_result_type_impl perform the real work.
+   *  @endif
+  */
+  template<typename _Functor>
+    struct _Weak_result_type
+    : _Weak_result_type_impl<typename remove_cv<_Functor>::type>
+    {
+    };
+
+  template<typename _Signature>
+    class result_of;
+
+  /**
+   *  @if maint
+   *  Actual implementation of result_of. When _Has_result_type is
+   *  true, gets its result from _Weak_result_type. Otherwise, uses
+   *  the function object's member template result to extract the
+   *  result type.
+   *  @endif
+  */
+  template<bool _Has_result_type, typename _Signature>
+    struct _Result_of_impl;
+
+  // Handle member data pointers using _Mem_fn's logic
+  template<typename _Res, typename _Class, typename _T1>
+    struct _Result_of_impl<false, _Res _Class::*(_T1)>
+    {
+      typedef typename _Mem_fn<_Res _Class::*>
+                ::template _Result_type<_T1>::type type;
+    };
+
+  /**
+   *  @if maint
+   *  Determines if the type _Tp derives from unary_function.
+   *  @endif
+  */
+  template<typename _Tp>
+    struct _Derives_from_unary_function : __sfinae_types
+    {
+    private:
+      template<typename _T1, typename _Res>
+        static __one __test(const volatile unary_function<_T1, _Res>*);
+
+      // It's tempting to change "..." to const volatile void*, but
+      // that fails when _Tp is a function type.
+      static __two __test(...);
+
+    public:
+      static const bool value = sizeof(__test((_Tp*)0)) == 1;
+    };
+
+  /**
+   *  @if maint
+   *  Determines if the type _Tp derives from binary_function.
+   *  @endif
+  */
+  template<typename _Tp>
+    struct _Derives_from_binary_function : __sfinae_types
+    {
+    private:
+      template<typename _T1, typename _T2, typename _Res>
+        static __one __test(const volatile binary_function<_T1, _T2, _Res>*);
+
+      // It's tempting to change "..." to const volatile void*, but
+      // that fails when _Tp is a function type.
+      static __two __test(...);
+
+    public:
+      static const bool value = sizeof(__test((_Tp*)0)) == 1;
+    };
+
+  /**
+   *  @if maint
+   *  Turns a function type into a function pointer type
+   *  @endif
+  */
+  template<typename _Tp, bool _IsFunctionType = is_function<_Tp>::value>
+    struct _Function_to_function_pointer
+    {
+      typedef _Tp type;
+    };
+
+  template<typename _Tp>
+    struct _Function_to_function_pointer<_Tp, true>
+    {
+      typedef _Tp* type;
+    };
+
+  /**
+   *  @if maint
+   *  Knowing which of unary_function and binary_function _Tp derives
+   *  from, derives from the same and ensures that reference_wrapper
+   *  will have a weak result type. See cases below.
+   *  @endif
+   */
+  template<bool _Unary, bool _Binary, typename _Tp>
+    struct _Reference_wrapper_base_impl;
+
+  // Not a unary_function or binary_function, so try a weak result type
+  template<typename _Tp>
+    struct _Reference_wrapper_base_impl<false, false, _Tp>
+      : _Weak_result_type<_Tp>
+    { };
+
+  // unary_function but not binary_function
+  template<typename _Tp>
+    struct _Reference_wrapper_base_impl<true, false, _Tp>
+      : unary_function<typename _Tp::argument_type,
+                       typename _Tp::result_type>
+    { };
+
+  // binary_function but not unary_function
+  template<typename _Tp>
+    struct _Reference_wrapper_base_impl<false, true, _Tp>
+      : binary_function<typename _Tp::first_argument_type,
+                        typename _Tp::second_argument_type,
+                        typename _Tp::result_type>
+    { };
+
+  // both unary_function and binary_function. import result_type to
+  // avoid conflicts.
+   template<typename _Tp>
+    struct _Reference_wrapper_base_impl<true, true, _Tp>
+      : unary_function<typename _Tp::argument_type,
+                       typename _Tp::result_type>,
+        binary_function<typename _Tp::first_argument_type,
+                        typename _Tp::second_argument_type,
+                        typename _Tp::result_type>
+    {
+      typedef typename _Tp::result_type result_type;
+    };
+
+  /**
+   *  @if maint
+   *  Derives from unary_function or binary_function when it
+   *  can. Specializations handle all of the easy cases. The primary
+   *  template determines what to do with a class type, which may
+   *  derive from both unary_function and binary_function.
+   *  @endif
+  */
+  template<typename _Tp>
+    struct _Reference_wrapper_base
+      : _Reference_wrapper_base_impl<
+          _Derives_from_unary_function<_Tp>::value,
+          _Derives_from_binary_function<_Tp>::value,
+          _Tp>
+    { };
+
+  // - a function type (unary)
+  template<typename _Res, typename _T1>
+    struct _Reference_wrapper_base<_Res(_T1)>
+      : unary_function<_T1, _Res>
+    { };
+
+  // - a function type (binary)
+  template<typename _Res, typename _T1, typename _T2>
+    struct _Reference_wrapper_base<_Res(_T1, _T2)>
+      : binary_function<_T1, _T2, _Res>
+    { };
+
+  // - a function pointer type (unary)
+  template<typename _Res, typename _T1>
+    struct _Reference_wrapper_base<_Res(*)(_T1)>
+      : unary_function<_T1, _Res>
+    { };
+
+  // - a function pointer type (binary)
+  template<typename _Res, typename _T1, typename _T2>
+    struct _Reference_wrapper_base<_Res(*)(_T1, _T2)>
+      : binary_function<_T1, _T2, _Res>
+    { };
+
+  // - a pointer to member function type (unary, no qualifiers)
+  template<typename _Res, typename _T1>
+    struct _Reference_wrapper_base<_Res (_T1::*)()>
+      : unary_function<_T1*, _Res>
+    { };
+
+  // - a pointer to member function type (binary, no qualifiers)
+  template<typename _Res, typename _T1, typename _T2>
+    struct _Reference_wrapper_base<_Res (_T1::*)(_T2)>
+      : binary_function<_T1*, _T2, _Res>
+    { };
+
+  // - a pointer to member function type (unary, const)
+  template<typename _Res, typename _T1>
+    struct _Reference_wrapper_base<_Res (_T1::*)() const>
+      : unary_function<const _T1*, _Res>
+    { };
+
+  // - a pointer to member function type (binary, const)
+  template<typename _Res, typename _T1, typename _T2>
+    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const>
+      : binary_function<const _T1*, _T2, _Res>
+    { };
+
+  // - a pointer to member function type (unary, volatile)
+  template<typename _Res, typename _T1>
+    struct _Reference_wrapper_base<_Res (_T1::*)() volatile>
+      : unary_function<volatile _T1*, _Res>
+    { };
+
+  // - a pointer to member function type (binary, volatile)
+  template<typename _Res, typename _T1, typename _T2>
+    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile>
+      : binary_function<volatile _T1*, _T2, _Res>
+    { };
+
+  // - a pointer to member function type (unary, const volatile)
+  template<typename _Res, typename _T1>
+    struct _Reference_wrapper_base<_Res (_T1::*)() const volatile>
+      : unary_function<const volatile _T1*, _Res>
+    { };
+
+  // - a pointer to member function type (binary, const volatile)
+  template<typename _Res, typename _T1, typename _T2>
+    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile>
+      : binary_function<const volatile _T1*, _T2, _Res>
+    { };
+
   template<typename _Tp>
     class reference_wrapper
+      : public _Reference_wrapper_base<typename remove_cv<_Tp>::type>
     {
+      // If _Tp is a function type, we can't form result_of<_Tp(...)>,
+      // so turn it into a function pointer type.
+      typedef typename _Function_to_function_pointer<_Tp>::type
+        _M_func_type;
+
       _Tp* _M_data;
     public:
       typedef _Tp type;
@@ -71,8 +361,13 @@ namespace tr1
       _Tp&
       get() const
       { return *_M_data; }
+
+#define _GLIBCXX_REPEAT_HEADER <tr1/ref_wrap_iterate.h>
+#include <tr1/repeat.h>
+#undef _GLIBCXX_REPEAT_HEADER
     };
 
+
   // Denotes a reference should be taken to a variable.
   template<typename _Tp>
     reference_wrapper<_Tp>
@@ -93,9 +388,6 @@ namespace tr1
     reference_wrapper<const _Tp> cref(reference_wrapper<_Tp> __t)
     { return cref(__t.get()); }
 
-  template<typename _MemberPointer>
-    class _Mem_fn;
-
    template<typename _Tp, bool>
      struct _Mem_fn_const_or_non
      {
@@ -151,6 +443,7 @@ namespace tr1
     template<typename _Tp>
       static __sfinae_types::__two __check_const(_Tp&, const volatile void*);
 
+  public:
     template<typename _Tp>
       struct _Result_type
         : _Mem_fn_const_or_non<
@@ -159,7 +452,6 @@ namespace tr1
              == sizeof(__check_const<_Tp>(__get_ref<_Tp>(), (_Tp*)0)))>
       { };
 
-  public:
     explicit _Mem_fn(_Res _Class::*__pm) : __pm(__pm) { }
 
     // Handle objects
@@ -489,510 +781,6 @@ namespace tr1
     _Manager_type _M_manager;
   };
 
-#define _GLIBCXX_NUM_ARGS 0
-#define _GLIBCXX_COMMA
-#define _GLIBCXX_TEMPLATE_PARAMS
-#define _GLIBCXX_TEMPLATE_ARGS
-#define _GLIBCXX_PARAMS
-#define _GLIBCXX_ARGS
-#define _GLIBCXX_COMMA_SHIFTED
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#define _GLIBCXX_PARAMS_SHIFTED
-#define _GLIBCXX_ARGS_SHIFTED
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 1
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1
-#define _GLIBCXX_TEMPLATE_ARGS _T1
-#define _GLIBCXX_PARAMS _T1 __a1
-#define _GLIBCXX_ARGS __a1
-#define _GLIBCXX_COMMA_SHIFTED
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#define _GLIBCXX_PARAMS_SHIFTED
-#define _GLIBCXX_ARGS_SHIFTED
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 2
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2
-#define _GLIBCXX_ARGS __a1, __a2
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1
-#define _GLIBCXX_ARGS_SHIFTED __a1
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 3
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3
-#define _GLIBCXX_ARGS __a1, __a2, __a3
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 4
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 5
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 6
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 7
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 8
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 9
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 10
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 11
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 12
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 13
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 14
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 15
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 16
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 17
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 18
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 19
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18, typename _T19
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18, _T19 __a19
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
-#define _GLIBCXX_NUM_ARGS 20
-#define _GLIBCXX_COMMA ,
-#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18, typename _T19, typename _T20
-#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20
-#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18, _T19 __a19, _T20 __a20
-#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19, __a20
-#define _GLIBCXX_COMMA_SHIFTED ,
-#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18, typename _T19
-#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19
-#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18, _T19 __a19
-#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19
-#include <tr1/functional_iterate.h>
-#undef _GLIBCXX_ARGS_SHIFTED
-#undef _GLIBCXX_PARAMS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
-#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
-#undef _GLIBCXX_COMMA_SHIFTED
-#undef _GLIBCXX_ARGS
-#undef _GLIBCXX_PARAMS
-#undef _GLIBCXX_TEMPLATE_ARGS
-#undef _GLIBCXX_TEMPLATE_PARAMS
-#undef _GLIBCXX_COMMA
-#undef _GLIBCXX_NUM_ARGS
-
   // [3.7.2.7] null pointer comparisons
 
   /**
@@ -1057,6 +845,9 @@ namespace tr1
       __x.swap(__y);
     }
 
+#define _GLIBCXX_REPEAT_HEADER <tr1/functional_iterate.h>
+#include <tr1/repeat.h>
+#undef _GLIBCXX_REPEAT_HEADER
 
 // Definition of default hash function std::tr1::hash<>.  The types for
 // which std::tr1::hash<T> is defined is in clause 6.3.3. of the PDTR.
index 8f94d8ecdc90c7242c66d2b32a51c4c113255205..97f4d248794136e4d226c2a4cce61928b0d3b81e 100644 (file)
@@ -1,7 +1,7 @@
 // TR1 functional -*- C++ -*-
 
 // Copyright (C) 2005 Free Software Foundation, Inc.
-// Writtten by Douglas Gregor <dgregor@cs.indiana.edu>
+// Written by Douglas Gregor <doug.gregor -at- gmail.com>
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
  *  You should not attempt to use it directly.
  */
 
+template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  struct _Weak_result_type_impl<_Res(_GLIBCXX_TEMPLATE_ARGS)>
+  {
+    typedef _Res result_type;
+  };
+
+template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  struct _Weak_result_type_impl<_Res (&)(_GLIBCXX_TEMPLATE_ARGS)>
+  {
+    typedef _Res result_type;
+  };
+
+template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  struct _Weak_result_type_impl<_Res (*)(_GLIBCXX_TEMPLATE_ARGS)>
+  {
+    typedef _Res result_type;
+  };
+
+#if _GLIBCXX_NUM_ARGS > 0
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+         _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+  struct _Weak_result_type_impl<
+           _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED)>
+  {
+    typedef _Res result_type;
+  };
+
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+         _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+  struct _Weak_result_type_impl<
+           _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const>
+  {
+    typedef _Res result_type;
+  };
+
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+         _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+  struct _Weak_result_type_impl<
+           _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) volatile>
+  {
+    typedef _Res result_type;
+  };
+
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+         _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+  struct _Weak_result_type_impl<
+           _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const volatile>
+  {
+    typedef _Res result_type;
+  };
+#endif
+
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  class result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>
+    : public _Result_of_impl<
+               _Has_result_type<_Weak_result_type<_Functor> >::value,
+             _Functor(_GLIBCXX_TEMPLATE_ARGS)>
+  { };
+
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  struct _Result_of_impl<true, _Functor(_GLIBCXX_TEMPLATE_ARGS)>
+  {
+    typedef typename _Weak_result_type<_Functor>::result_type type;
+  };
+
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  struct _Result_of_impl<false, _Functor(_GLIBCXX_TEMPLATE_ARGS)>
+  {
+#if _GLIBCXX_NUM_ARGS > 0
+    typedef typename _Functor
+              ::template result<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type type;
+#else
+    typedef void type;
+#endif
+  };
+
+/**
+ * @if maint
+ * Invoke a function object, which may be either a member pointer or a
+ * function object. The first parameter will tell which.
+ * @endif
+ */
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  inline
+  typename __enable_if<
+             typename result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type,
+             (!is_member_pointer<_Functor>::value
+              && !is_function<_Functor>::value
+              && !is_function<typename remove_pointer<_Functor>::type>::value)
+           >::__type
+  __invoke(_Functor& __f _GLIBCXX_COMMA _GLIBCXX_REF_PARAMS)
+  {
+    return __f(_GLIBCXX_ARGS);
+  }
+
+#if _GLIBCXX_NUM_ARGS > 0
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  inline
+  typename __enable_if<
+             typename result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type,
+             (is_member_pointer<_Functor>::value
+              && !is_function<_Functor>::value
+              && !is_function<typename remove_pointer<_Functor>::type>::value)
+           >::__type
+  __invoke(_Functor& __f _GLIBCXX_COMMA _GLIBCXX_REF_PARAMS)
+  {
+    return mem_fn(__f)(_GLIBCXX_ARGS);
+  }
+#endif
+
+// To pick up function references (that will become function pointers)
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+  inline
+  typename __enable_if<
+             typename result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type,
+             (is_pointer<_Functor>::value
+              && is_function<typename remove_pointer<_Functor>::type>::value)
+           >::__type
+  __invoke(_Functor __f _GLIBCXX_COMMA _GLIBCXX_REF_PARAMS)
+  {
+    return __f(_GLIBCXX_ARGS);
+  }
+
+/**
+ * @if maint
+ * Implementation of reference_wrapper::operator()
+ * @endif
+*/
+#if _GLIBCXX_NUM_ARGS > 0
+template<typename _Tp>
+template<_GLIBCXX_TEMPLATE_PARAMS>
+  typename result_of<
+   typename reference_wrapper<_Tp>::_M_func_type(_GLIBCXX_TEMPLATE_ARGS)>::type
+  reference_wrapper<_Tp>::operator()(_GLIBCXX_REF_PARAMS) const
+  {
+    return __invoke(get(), _GLIBCXX_ARGS);
+  }
+#endif
+
 #if _GLIBCXX_NUM_ARGS > 0
 template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
          _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
@@ -197,7 +336,7 @@ template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
 
 template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
          _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
-  class _Mem_fn<_Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const volatile>
+  class _Mem_fn<_Res(_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const volatile>
 #if _GLIBCXX_NUM_ARGS == 1
   : public unary_function<const volatile _Class*, _Res>
 #elif _GLIBCXX_NUM_ARGS == 2
@@ -600,7 +739,8 @@ class function<_Res(_GLIBCXX_TEMPLATE_ARGS)>
   template<typename _Function>
     void operator!=(const function<_Function>&) const;
 
-  typedef _Res (*_Invoker_type)(const _Any_data& _GLIBCXX_COMMA _GLIBCXX_PARAMS);
+  typedef _Res (*_Invoker_type)(const _Any_data& _GLIBCXX_COMMA
+                                _GLIBCXX_PARAMS);
   _Invoker_type _M_invoker;
 };
 
@@ -632,7 +772,8 @@ template<typename _Functor>
 }
 
 template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
-  _Res function<_Res(_GLIBCXX_TEMPLATE_ARGS)>::operator()(_GLIBCXX_PARAMS) const
+  _Res
+  function<_Res(_GLIBCXX_TEMPLATE_ARGS)>::operator()(_GLIBCXX_PARAMS) const
   {
     if (_M_empty())
       {
diff --git a/libstdc++-v3/include/tr1/ref_wrap_iterate.h b/libstdc++-v3/include/tr1/ref_wrap_iterate.h
new file mode 100644 (file)
index 0000000..430109f
--- /dev/null
@@ -0,0 +1,44 @@
+// TR1 reference_wrapper -*- C++ -*-
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Written by Douglas Gregor <doug.gregor -at- gmail.com>
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+/** @file ref_wrap_iterate.h
+ *  This is an internal header file, included by other library headers.
+ *  You should not attempt to use it directly.
+ */
+
+#if _GLIBCXX_NUM_ARGS > 0
+template<_GLIBCXX_TEMPLATE_PARAMS>
+  typename result_of<_M_func_type(_GLIBCXX_TEMPLATE_ARGS)>::type
+  operator()(_GLIBCXX_REF_PARAMS) const;
+#else
+typename result_of<_M_func_type()>::type
+operator()() const
+{ return (*get())(); }
+#endif
diff --git a/libstdc++-v3/include/tr1/repeat.h b/libstdc++-v3/include/tr1/repeat.h
new file mode 100644 (file)
index 0000000..d87aeb9
--- /dev/null
@@ -0,0 +1,585 @@
+// TR1 code repetition -*- C++ -*-
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Written by Douglas Gregor <doug.gregor -at- gmail.com>
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+/** @file repeat.h
+ *  This is an internal header file, included by other library headers.
+ *  You should not attempt to use it directly.
+ */
+
+#ifndef _GLIBCXX_REPEAT_HEADER
+#  error Internal error: _GLIBCXX_REPEAT_HEADER must be set
+#endif /* _GLIBCXX_REPEAT_HEADER */
+
+#define _GLIBCXX_NUM_ARGS 0
+#define _GLIBCXX_COMMA
+#define _GLIBCXX_TEMPLATE_PARAMS
+#define _GLIBCXX_TEMPLATE_ARGS
+#define _GLIBCXX_PARAMS
+#define _GLIBCXX_REF_PARAMS
+#define _GLIBCXX_ARGS
+#define _GLIBCXX_COMMA_SHIFTED
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#define _GLIBCXX_PARAMS_SHIFTED
+#define _GLIBCXX_ARGS_SHIFTED
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 1
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1
+#define _GLIBCXX_TEMPLATE_ARGS _T1
+#define _GLIBCXX_PARAMS _T1 __a1
+#define _GLIBCXX_REF_PARAMS _T1& __a1
+#define _GLIBCXX_ARGS __a1
+#define _GLIBCXX_COMMA_SHIFTED
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#define _GLIBCXX_PARAMS_SHIFTED
+#define _GLIBCXX_ARGS_SHIFTED
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 2
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2
+#define _GLIBCXX_ARGS __a1, __a2
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1
+#define _GLIBCXX_ARGS_SHIFTED __a1
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 3
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3
+#define _GLIBCXX_ARGS __a1, __a2, __a3
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 4
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 5
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 6
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 7
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 8
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 9
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 10
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 11
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 12
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 13
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 14
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13, _T14& __a14
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 15
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13, _T14& __a14, _T15& __a15
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 16
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13, _T14& __a14, _T15& __a15, _T16& __a16
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 17
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13, _T14& __a14, _T15& __a15, _T16& __a16, _T17& __a17
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 18
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13, _T14& __a14, _T15& __a15, _T16& __a16, _T17& __a17, _T18& __a18
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 19
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18, typename _T19
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18, _T19 __a19
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13, _T14& __a14, _T15& __a15, _T16& __a16, _T17& __a17, _T18& __a18, _T19& __a19
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
+#define _GLIBCXX_NUM_ARGS 20
+#define _GLIBCXX_COMMA ,
+#define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18, typename _T19, typename _T20
+#define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20
+#define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18, _T19 __a19, _T20 __a20
+#define _GLIBCXX_REF_PARAMS _T1& __a1, _T2& __a2, _T3& __a3, _T4& __a4, _T5& __a5, _T6& __a6, _T7& __a7, _T8& __a8, _T9& __a9, _T10& __a10, _T11& __a11, _T12& __a12, _T13& __a13, _T14& __a14, _T15& __a15, _T16& __a16, _T17& __a17, _T18& __a18, _T19& __a19, _T20& __a20
+#define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19, __a20
+#define _GLIBCXX_COMMA_SHIFTED ,
+#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10, typename _T11, typename _T12, typename _T13, typename _T14, typename _T15, typename _T16, typename _T17, typename _T18, typename _T19
+#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19
+#define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10, _T11 __a11, _T12 __a12, _T13 __a13, _T14 __a14, _T15 __a15, _T16 __a16, _T17 __a17, _T18 __a18, _T19 __a19
+#define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19
+#include _GLIBCXX_REPEAT_HEADER
+#undef _GLIBCXX_ARGS_SHIFTED
+#undef _GLIBCXX_PARAMS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
+#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
+#undef _GLIBCXX_COMMA_SHIFTED
+#undef _GLIBCXX_ARGS
+#undef _GLIBCXX_REF_PARAMS
+#undef _GLIBCXX_PARAMS
+#undef _GLIBCXX_TEMPLATE_ARGS
+#undef _GLIBCXX_TEMPLATE_PARAMS
+#undef _GLIBCXX_COMMA
+#undef _GLIBCXX_NUM_ARGS
+
diff --git a/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc b/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc
new file mode 100644 (file)
index 0000000..255fc9f
--- /dev/null
@@ -0,0 +1,103 @@
+// 2005-02-27 Douglas Gregor <doug.gregor -at- gmail.com>
+//
+// Copyright (C) 2005 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 2.1 reference wrappers
+#include <tr1/functional>
+#include <tr1/type_traits>
+#include <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+using namespace __gnu_test;
+
+bool test __attribute__((unused)) = true;
+
+struct X
+{
+  typedef int result_type;
+
+  X() : bar(17) {}
+
+  int foo(float x)                   { return truncate_float(x); }
+  int foo_c(float x)  const          { return truncate_float(x); }
+  int foo_v(float x)  volatile       { return truncate_float(x); }
+  int foo_cv(float x) const volatile { return truncate_float(x); }
+
+  int operator()(float x)
+  {
+    return foo(x) + 1;
+  }
+
+  int operator()(float x) const
+  {
+    return foo_c(x) + 2;
+  }
+
+  int bar;
+
+ private:
+  X(const X&);
+  X& operator=(const X&);
+};
+
+void test01()
+{
+  using std::tr1::ref;
+  using std::tr1::cref;
+
+  ::X x;
+  ::X* xp = &x;
+  int (::X::* p_foo)(float) = &::X::foo;
+  int (::X::* p_foo_c)(float) const = &::X::foo_c;
+  int (::X::* p_foo_v)(float) volatile = &::X::foo_v;
+  int (::X::* p_foo_cv)(float) const volatile = &::X::foo_cv;
+  int ::X::* p_bar = &::X::bar;
+
+  const float pi = 3.14;
+
+  // Functions
+  VERIFY(ref(truncate_float)(pi) == 3);
+
+  // Function pointers
+  VERIFY(cref(&truncate_float)(pi) == 3);
+
+  // Member function pointers
+  VERIFY(ref(p_foo)(x, pi) == 3);
+  VERIFY(ref(p_foo)(xp, pi) == 3);
+  VERIFY(ref(p_foo_c)(x, pi) == 3);
+  VERIFY(ref(p_foo_c)(xp, pi) == 3);
+  VERIFY(ref(p_foo_v)(x, pi) == 3);
+  VERIFY(ref(p_foo_v)(xp, pi) == 3);
+  VERIFY(ref(p_foo_cv)(x, pi) == 3);
+  VERIFY(ref(p_foo_cv)(xp, pi) == 3);
+
+  // Member data pointers
+  VERIFY(ref(p_bar)(x) == 17);
+  VERIFY(ref(p_bar)(xp) == 17);
+
+  // Function objects
+  VERIFY(ref(x)(pi) == 4);
+  VERIFY(cref(x)(pi) == 5);
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc b/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc
new file mode 100644 (file)
index 0000000..3aa427d
--- /dev/null
@@ -0,0 +1,89 @@
+// 2005-02-27 Douglas Gregor <doug.gregor -at- gmail.com>
+//
+// Copyright (C) 2005 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 2.1 reference wrappers
+#include <tr1/functional>
+#include <tr1/type_traits>
+#include <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+using namespace __gnu_test;
+
+struct X {};
+
+struct int_result_type { typedef int result_type; };
+
+struct derives_unary : std::unary_function<int, int> {};
+
+struct derives_binary : std::binary_function<int, float, int> {};
+
+struct derives_unary_binary
+  : std::unary_function<int, int>,
+    std::binary_function<int, float, int>
+{
+  typedef int result_type;
+};
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  using std::tr1::reference_wrapper;
+  using std::tr1::is_same;
+  using std::tr1::is_convertible;
+  using std::unary_function;
+  using std::binary_function;
+
+  // Check result_type typedef
+  VERIFY((is_same<reference_wrapper<int_result_type>::result_type, int>::value));
+  VERIFY((is_same<reference_wrapper<derives_unary>::result_type, int>::value));
+  VERIFY((is_same<reference_wrapper<derives_binary>::result_type, int>::value));
+  VERIFY((is_same<reference_wrapper<derives_unary_binary>::result_type, int>::value));
+  VERIFY((is_same<reference_wrapper<int(void)>::result_type, int>::value));
+  VERIFY((is_same<reference_wrapper<int(*)(void)>::result_type, int>::value));
+  VERIFY((is_same<reference_wrapper<int (::X::*)()>::result_type, int>::value));
+  VERIFY((is_same<reference_wrapper<int (::X::*)(float)>::result_type, int>::value));
+
+  // Check derivation from unary_function
+  VERIFY((is_convertible<reference_wrapper<derives_unary>*, unary_function<int, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<derives_unary_binary>*, unary_function<int, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int(int)>*, unary_function<int, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int(*)(int)>*, unary_function<int, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)()>*, unary_function< ::X*, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)() const>*, unary_function<const ::X*, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)() volatile>*, unary_function<volatile ::X*, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)() const volatile>*, unary_function<const volatile ::X*, int>*>::value));
+
+  // Check derivation from binary_function
+  VERIFY((is_convertible<reference_wrapper<derives_binary>*, binary_function<int, float, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<derives_unary_binary>*, binary_function<int, float, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int(int, float)>*, binary_function<int, float, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int(*)(int, float)>*, binary_function<int, float, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)(float)>*, binary_function< ::X*, float, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)(float) const>*, binary_function<const ::X*, float, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)(float) volatile>*, binary_function<volatile ::X*, float, int>*>::value));
+  VERIFY((is_convertible<reference_wrapper<int (::X::*)(float) const volatile>*, binary_function<const volatile ::X*, float, int>*>::value));
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/3_function_objects/result_of.cc b/libstdc++-v3/testsuite/tr1/3_function_objects/result_of.cc
new file mode 100644 (file)
index 0000000..bf17f84
--- /dev/null
@@ -0,0 +1,75 @@
+// 2005-01-26 Douglas Gregor <doug.gregor -at- gmail.com>
+//
+// Copyright (C) 2005 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 3.4 function return types
+#include <tr1/functional>
+#include <tr1/type_traits>
+#include <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+class X {};
+
+struct int_result_type { typedef int result_type; };
+
+struct int_result_of
+{
+  template<typename F> struct result { typedef int type; };
+};
+
+struct int_result_type_and_float_result_of
+{
+  typedef int result_type;
+  template<typename F> struct result { typedef float type; };
+};
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  using std::tr1::result_of;
+  using std::tr1::is_same;
+  using namespace __gnu_test;
+
+  typedef int (*func_ptr)(float, double);
+  typedef int (&func_ref)(float, double);
+  typedef int (::X::*mem_func_ptr)(float);
+  typedef int (::X::*mem_func_ptr_c)(float) const;
+  typedef int (::X::*mem_func_ptr_v)(float) volatile;
+  typedef int (::X::*mem_func_ptr_cv)(float) const volatile;
+
+  VERIFY((is_same<result_of<int_result_type(float)>::type, int>::value));
+  VERIFY((is_same<result_of<int_result_of(double)>::type, int>::value));
+  VERIFY((is_same<result_of<int_result_of(void)>::type, void>::value));
+  VERIFY((is_same<result_of<const int_result_of(double)>::type, int>::value));
+  VERIFY((is_same<result_of<volatile int_result_of(void)>::type, void>::value));
+  VERIFY((is_same<result_of<int_result_type_and_float_result_of(char)>::type, int>::value));
+  VERIFY((is_same<result_of<func_ptr(char, float)>::type, int>::value));
+  VERIFY((is_same<result_of<func_ref(char, float)>::type, int>::value));
+  VERIFY((is_same<result_of<mem_func_ptr(::X,char)>::type, int>::value));
+  VERIFY((is_same<result_of<mem_func_ptr_c(::X,char)>::type, int>::value));
+  VERIFY((is_same<result_of<mem_func_ptr_v(::X,char)>::type, int>::value));
+  VERIFY((is_same<result_of<mem_func_ptr_cv(::X,char)>::type, int>::value));
+}
+
+int main()
+{
+  test01();
+  return 0;
+}