Merge from the pain train
[official-gcc.git] / libstdc++-v3 / include / tr1 / functional
blob1a958c353916683766449dbd711d368869595ea4
1 // TR1 functional header -*- C++ -*-
3 // Copyright (C) 2004, 2005 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
9 // any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING.  If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19 // USA.
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction.  Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License.  This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
30 /** @file
31  *  This is a TR1 C++ Library header.
32  */
34 #ifndef _TR1_FUNCTIONAL
35 #define _TR1_FUNCTIONAL 1
37 #include "../functional"
38 #include <typeinfo>
39 #include <tr1/type_traits>
40 #include "../bits/cpp_type_traits.h"
41 #include <string>               // for std::tr1::hash
42 #include <cstdlib>              // for std::abort
44 namespace std
46 namespace tr1
48   template<typename _Tp>
49     class reference_wrapper
50     {
51       _Tp* _M_data;
52     public:
53       typedef _Tp type;
54       explicit reference_wrapper(_Tp& __indata): _M_data(&__indata)
55       { }
57       reference_wrapper(const reference_wrapper<_Tp>& __inref):
58       _M_data(__inref._M_data)
59       { }
61       reference_wrapper&
62       operator=(const reference_wrapper<_Tp>& __inref)
63       {
64         _M_data = __inref._M_data;
65         return *this;
66       }
68       operator _Tp&() const
69       { return this->get(); }
71       _Tp&
72       get() const
73       { return *_M_data; }
74     };
76   // Denotes a reference should be taken to a variable.
77   template<typename _Tp>
78     reference_wrapper<_Tp>
79     ref(_Tp& __t)
80     { return reference_wrapper<_Tp>(__t); }
82   // Denotes a const reference should be taken to a variable.
83   template<typename _Tp>
84     reference_wrapper<const _Tp>
85     cref(const _Tp& __t)
86     { return reference_wrapper<const _Tp>(__t); }
88   template<typename _Tp>
89     reference_wrapper<_Tp> ref(reference_wrapper<_Tp> __t)
90     { return ref(__t.get()); }
92   template<typename _Tp>
93     reference_wrapper<const _Tp> cref(reference_wrapper<_Tp> __t)
94     { return cref(__t.get()); }
96   template<typename _MemberPointer>
97     class _Mem_fn;
99    template<typename _Tp, bool>
100      struct _Mem_fn_const_or_non
101      {
102        typedef const _Tp& type;
103      };
105     template<typename _Tp>
106       struct _Mem_fn_const_or_non<_Tp, false>
107       {
108         typedef _Tp& type;
109       };
111   template<typename _Res, typename _Class>
112   class _Mem_fn<_Res _Class::*>
113   {
114     // This bit of genius is due to Peter Dimov, improved slightly by
115     // Douglas Gregor.
116     template<typename _Tp>
117       _Res&
118       _M_call(_Tp& __object, _Class *) const
119       { return __object.*__pm; }
121     template<typename _Tp, typename _Up>
122       _Res&
123       _M_call(_Tp& __object, _Up * const *) const
124       { return (*__object).*__pm; }
126     template<typename _Tp, typename _Up>
127       const _Res&
128       _M_call(_Tp& __object, const _Up * const *) const
129       { return (*__object).*__pm; }
131     template<typename _Tp>
132       const _Res&
133       _M_call(_Tp& __object, const _Class *) const
134       { return __object.*__pm; }
136     template<typename _Tp>
137       const _Res&
138       _M_call(_Tp& __ptr, const volatile void*) const
139       { return (*__ptr).*__pm; }
141     template<typename _Tp> static _Tp& __get_ref();
143     template<typename _Tp>
144       static __sfinae_types::__one __check_const(_Tp&, _Class*);
145     template<typename _Tp, typename _Up>
146       static __sfinae_types::__one __check_const(_Tp&, _Up * const *);
147     template<typename _Tp, typename _Up>
148       static __sfinae_types::__two __check_const(_Tp&, const _Up * const *);
149     template<typename _Tp>
150       static __sfinae_types::__two __check_const(_Tp&, const _Class*);
151     template<typename _Tp>
152       static __sfinae_types::__two __check_const(_Tp&, const volatile void*);
154     template<typename _Tp>
155       struct _Result_type
156         : _Mem_fn_const_or_non<
157             _Res,
158             (sizeof(__sfinae_types::__two)
159              == sizeof(__check_const<_Tp>(__get_ref<_Tp>(), (_Tp*)0)))>
160       { };
162   public:
163     explicit _Mem_fn(_Res _Class::*__pm) : __pm(__pm) { }
165     // Handle objects
166     _Res&       operator()(_Class& __object)       const
167     { return __object.*__pm; }
169     const _Res& operator()(const _Class& __object) const
170     { return __object.*__pm; }
172     // Handle pointers
173     _Res&       operator()(_Class* __object)       const
174     { return __object->*__pm; }
176     const _Res&
177     operator()(const _Class* __object) const
178     { return __object->*__pm; }
180     // Handle smart pointers and derived
181     template<typename _Tp>
182       typename _Result_type<_Tp>::type
183       operator()(_Tp& __unknown) const
184       { return _M_call(__unknown, &__unknown); }
186   private:
187     _Res _Class::*__pm;
188   };
190   /**
191    *  @brief Returns a function object that forwards to the member
192    *  pointer @a pm.
193    */
194   template<typename _Tp, typename _Class>
195     inline _Mem_fn<_Tp _Class::*>
196     mem_fn(_Tp _Class::* __pm)
197     {
198       return _Mem_fn<_Tp _Class::*>(__pm);
199     }
201   /**
202    *  @brief Exception class thrown when class template function's
203    *  operator() is called with an empty target.
204    *
205    */
206   class bad_function_call : public std::exception { };
208   /**
209    *  @if maint
210    *  The integral constant expression 0 can be converted into a
211    *  pointer to this type. It is used by the function template to
212    *  accept NULL pointers.
213    *  @endif
214    */
215   struct _M_clear_type;
217   /**
218    *  @if maint
219    *  Trait identifying "location-invariant" types, meaning that the
220    *  address of the object (or any of its members) will not escape.
221    *  Also implies a trivial copy constructor and assignment operator.
222    *   @endif
223    */
224   template<typename _Tp>
225     struct __is_location_invariant
226     : integral_constant<bool,
227                         (is_pointer<_Tp>::value
228                          || is_member_pointer<_Tp>::value)>
229     {
230     };
232   class _Undefined_class;
234   union _Nocopy_types
235   {
236     void*       _M_object;
237     const void* _M_const_object;
238     void (*_M_function_pointer)();
239     void (_Undefined_class::*_M_member_pointer)();
240   };
242   union _Any_data {
243     void*       _M_access()       { return &_M_pod_data[0]; }
244     const void* _M_access() const { return &_M_pod_data[0]; }
246     template<typename _Tp> _Tp& _M_access()
247     { return *static_cast<_Tp*>(_M_access()); }
249     template<typename _Tp> const _Tp& _M_access() const
250     { return *static_cast<const _Tp*>(_M_access()); }
252     _Nocopy_types _M_unused;
253     char _M_pod_data[sizeof(_Nocopy_types)];
254   };
256   enum _Manager_operation
257   {
258     __get_type_info,
259     __get_functor_ptr,
260     __clone_functor,
261     __destroy_functor
262   };
264   /* Simple type wrapper that helps avoid annoying const problems
265      when casting between void pointers and pointers-to-pointers. */
266   template<typename _Tp>
267     struct _Simple_type_wrapper
268     {
269       _Simple_type_wrapper(_Tp __value) : __value(__value) { }
271       _Tp __value;
272     };
274   template<typename _Tp>
275     struct __is_location_invariant<_Simple_type_wrapper<_Tp> >
276       : __is_location_invariant<_Tp>
277     {
278     };
280   // Converts a reference to a function object into a callable
281   // function object.
282   template<typename _Functor>
283     inline _Functor& __callable_functor(_Functor& __f) { return __f; }
285   template<typename _Member, typename _Class>
286     inline _Mem_fn<_Member _Class::*>
287     __callable_functor(_Member _Class::* &__p)
288     { return mem_fn(__p); }
290   template<typename _Member, typename _Class>
291     inline _Mem_fn<_Member _Class::*>
292     __callable_functor(_Member _Class::* const &__p)
293     { return mem_fn(__p); }
295   template<typename _Signature, typename _Functor>
296     class _Function_handler;
298   template<typename _Signature>
299     class function;
302   /**
303    *  @if maint
304    *  Base class of all polymorphic function object wrappers.
305    *  @endif
306    */
307   class _Function_base
308   {
309   public:
310     static const std::size_t _M_max_size = sizeof(_Nocopy_types);
311     static const std::size_t _M_max_align = __alignof__(_Nocopy_types);
313     template<typename _Functor>
314     class _Base_manager
315     {
316     protected:
317       static const bool __stored_locally =
318         (__is_location_invariant<_Functor>::value
319          && sizeof(_Functor) <= _M_max_size
320          && __alignof__(_Functor) <= _M_max_align
321          && (_M_max_align % __alignof__(_Functor) == 0));
322       typedef integral_constant<bool, __stored_locally> _Local_storage;
324       // Retrieve a pointer to the function object
325       static _Functor* _M_get_pointer(const _Any_data& __source)
326       {
327         const _Functor* __ptr =
328           __stored_locally? &__source._M_access<_Functor>()
329           /* have stored a pointer */ : __source._M_access<_Functor*>();
330         return const_cast<_Functor*>(__ptr);
331       }
333       // Clone a location-invariant function object that fits within
334       // an _Any_data structure.
335       static void
336       _M_clone(_Any_data& __dest, const _Any_data& __source, true_type)
337       {
338         new (__dest._M_access()) _Functor(__source._M_access<_Functor>());
339       }
341       // Clone a function object that is not location-invariant or
342       // that cannot fit into an _Any_data structure.
343       static void
344       _M_clone(_Any_data& __dest, const _Any_data& __source, false_type)
345       {
346         __dest._M_access<_Functor*>() =
347           new _Functor(*__source._M_access<_Functor*>());
348       }
350       // Destroying a location-invariant object may still require
351       // destruction.
352       static void
353       _M_destroy(_Any_data& __victim, true_type)
354       {
355         __victim._M_access<_Functor>().~_Functor();
356       }
358       // Destroying an object located on the heap.
359       static void
360       _M_destroy(_Any_data& __victim, false_type)
361       {
362         delete __victim._M_access<_Functor*>();
363       }
365     public:
366       static bool
367       _M_manager(_Any_data& __dest, const _Any_data& __source,
368                  _Manager_operation __op)
369       {
370         switch (__op) {
371         case __get_type_info:
372           __dest._M_access<const type_info*>() = &typeid(_Functor);
373           break;
375         case __get_functor_ptr:
376           __dest._M_access<_Functor*>() = _M_get_pointer(__source);
377           break;
379         case __clone_functor:
380           _M_clone(__dest, __source, _Local_storage());
381           break;
383         case __destroy_functor:
384           _M_destroy(__dest, _Local_storage());
385           break;
386         }
387         return false;
388       }
390       static void
391       _M_init_functor(_Any_data& __functor, const _Functor& __f)
392       {
393         _M_init_functor(__functor, __f, _Local_storage());
394       }
396       template<typename _Signature>
397       static bool
398       _M_not_empty_function(const function<_Signature>& __f)
399       {
400         return __f;
401       }
403       template<typename _Tp>
404       static bool
405       _M_not_empty_function(const _Tp*& __fp)
406       {
407         return __fp;
408       }
410       template<typename _Class, typename _Tp>
411       static bool
412       _M_not_empty_function(_Tp _Class::* const& __mp)
413       {
414         return __mp;
415       }
417       template<typename _Tp>
418       static bool
419       _M_not_empty_function(const _Tp&)
420       {
421         return true;
422       }
424     private:
425       static void
426       _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type)
427       {
428         new (__functor._M_access()) _Functor(__f);
429       }
431       static void
432       _M_init_functor(_Any_data& __functor, const _Functor& __f, false_type)
433       {
434         __functor._M_access<_Functor*>() = new _Functor(__f);
435       }
436     };
438     template<typename _Functor>
439     class _Ref_manager : public _Base_manager<_Functor*>
440     {
441       typedef _Function_base::_Base_manager<_Functor*> _Base;
443     public:
444       static bool
445       _M_manager(_Any_data& __dest, const _Any_data& __source,
446                  _Manager_operation __op)
447       {
448         switch (__op) {
449         case __get_type_info:
450           __dest._M_access<const type_info*>() = &typeid(_Functor);
451           break;
453         case __get_functor_ptr:
454           __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source);
455           return is_const<_Functor>::value;
456           break;
458         default:
459           _Base::_M_manager(__dest, __source, __op);
460         }
461         return false;
462       }
464       static void
465       _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f)
466       {
467         // TBD: Use address_of function instead
468         _Base::_M_init_functor(__functor, &__f.get());
469       }
470     };
472     _Function_base() : _M_manager(0) { }
474     ~_Function_base()
475     {
476       if (_M_manager)
477         {
478           _M_manager(_M_functor, _M_functor, __destroy_functor);
479         }
480     }
483     bool _M_empty() const { return !_M_manager; }
485     typedef bool (*_Manager_type)(_Any_data&, const _Any_data&,
486                                   _Manager_operation);
488     _Any_data     _M_functor;
489     _Manager_type _M_manager;
490   };
492 #define _GLIBCXX_NUM_ARGS 0
493 #define _GLIBCXX_COMMA
494 #define _GLIBCXX_TEMPLATE_PARAMS
495 #define _GLIBCXX_TEMPLATE_ARGS
496 #define _GLIBCXX_PARAMS
497 #define _GLIBCXX_ARGS
498 #define _GLIBCXX_COMMA_SHIFTED
499 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
500 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED
501 #define _GLIBCXX_PARAMS_SHIFTED
502 #define _GLIBCXX_ARGS_SHIFTED
503 #include <tr1/functional_iterate.h>
504 #undef _GLIBCXX_ARGS_SHIFTED
505 #undef _GLIBCXX_PARAMS_SHIFTED
506 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
507 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
508 #undef _GLIBCXX_COMMA_SHIFTED
509 #undef _GLIBCXX_ARGS
510 #undef _GLIBCXX_PARAMS
511 #undef _GLIBCXX_TEMPLATE_ARGS
512 #undef _GLIBCXX_TEMPLATE_PARAMS
513 #undef _GLIBCXX_COMMA
514 #undef _GLIBCXX_NUM_ARGS
516 #define _GLIBCXX_NUM_ARGS 1
517 #define _GLIBCXX_COMMA ,
518 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1
519 #define _GLIBCXX_TEMPLATE_ARGS _T1
520 #define _GLIBCXX_PARAMS _T1 __a1
521 #define _GLIBCXX_ARGS __a1
522 #define _GLIBCXX_COMMA_SHIFTED
523 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
524 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED
525 #define _GLIBCXX_PARAMS_SHIFTED
526 #define _GLIBCXX_ARGS_SHIFTED
527 #include <tr1/functional_iterate.h>
528 #undef _GLIBCXX_ARGS_SHIFTED
529 #undef _GLIBCXX_PARAMS_SHIFTED
530 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
531 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
532 #undef _GLIBCXX_COMMA_SHIFTED
533 #undef _GLIBCXX_ARGS
534 #undef _GLIBCXX_PARAMS
535 #undef _GLIBCXX_TEMPLATE_ARGS
536 #undef _GLIBCXX_TEMPLATE_PARAMS
537 #undef _GLIBCXX_COMMA
538 #undef _GLIBCXX_NUM_ARGS
540 #define _GLIBCXX_NUM_ARGS 2
541 #define _GLIBCXX_COMMA ,
542 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2
543 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2
544 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2
545 #define _GLIBCXX_ARGS __a1, __a2
546 #define _GLIBCXX_COMMA_SHIFTED ,
547 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1
548 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1
549 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1
550 #define _GLIBCXX_ARGS_SHIFTED __a1
551 #include <tr1/functional_iterate.h>
552 #undef _GLIBCXX_ARGS_SHIFTED
553 #undef _GLIBCXX_PARAMS_SHIFTED
554 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
555 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
556 #undef _GLIBCXX_COMMA_SHIFTED
557 #undef _GLIBCXX_ARGS
558 #undef _GLIBCXX_PARAMS
559 #undef _GLIBCXX_TEMPLATE_ARGS
560 #undef _GLIBCXX_TEMPLATE_PARAMS
561 #undef _GLIBCXX_COMMA
562 #undef _GLIBCXX_NUM_ARGS
564 #define _GLIBCXX_NUM_ARGS 3
565 #define _GLIBCXX_COMMA ,
566 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3
567 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3
568 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3
569 #define _GLIBCXX_ARGS __a1, __a2, __a3
570 #define _GLIBCXX_COMMA_SHIFTED ,
571 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2
572 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2
573 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2
574 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2
575 #include <tr1/functional_iterate.h>
576 #undef _GLIBCXX_ARGS_SHIFTED
577 #undef _GLIBCXX_PARAMS_SHIFTED
578 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
579 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
580 #undef _GLIBCXX_COMMA_SHIFTED
581 #undef _GLIBCXX_ARGS
582 #undef _GLIBCXX_PARAMS
583 #undef _GLIBCXX_TEMPLATE_ARGS
584 #undef _GLIBCXX_TEMPLATE_PARAMS
585 #undef _GLIBCXX_COMMA
586 #undef _GLIBCXX_NUM_ARGS
588 #define _GLIBCXX_NUM_ARGS 4
589 #define _GLIBCXX_COMMA ,
590 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4
591 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4
592 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4
593 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4
594 #define _GLIBCXX_COMMA_SHIFTED ,
595 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3
596 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3
597 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3
598 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3
599 #include <tr1/functional_iterate.h>
600 #undef _GLIBCXX_ARGS_SHIFTED
601 #undef _GLIBCXX_PARAMS_SHIFTED
602 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
603 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
604 #undef _GLIBCXX_COMMA_SHIFTED
605 #undef _GLIBCXX_ARGS
606 #undef _GLIBCXX_PARAMS
607 #undef _GLIBCXX_TEMPLATE_ARGS
608 #undef _GLIBCXX_TEMPLATE_PARAMS
609 #undef _GLIBCXX_COMMA
610 #undef _GLIBCXX_NUM_ARGS
612 #define _GLIBCXX_NUM_ARGS 5
613 #define _GLIBCXX_COMMA ,
614 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5
615 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5
616 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5
617 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5
618 #define _GLIBCXX_COMMA_SHIFTED ,
619 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4
620 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4
621 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4
622 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4
623 #include <tr1/functional_iterate.h>
624 #undef _GLIBCXX_ARGS_SHIFTED
625 #undef _GLIBCXX_PARAMS_SHIFTED
626 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
627 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
628 #undef _GLIBCXX_COMMA_SHIFTED
629 #undef _GLIBCXX_ARGS
630 #undef _GLIBCXX_PARAMS
631 #undef _GLIBCXX_TEMPLATE_ARGS
632 #undef _GLIBCXX_TEMPLATE_PARAMS
633 #undef _GLIBCXX_COMMA
634 #undef _GLIBCXX_NUM_ARGS
636 #define _GLIBCXX_NUM_ARGS 6
637 #define _GLIBCXX_COMMA ,
638 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6
639 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6
640 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6
641 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6
642 #define _GLIBCXX_COMMA_SHIFTED ,
643 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5
644 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5
645 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5
646 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5
647 #include <tr1/functional_iterate.h>
648 #undef _GLIBCXX_ARGS_SHIFTED
649 #undef _GLIBCXX_PARAMS_SHIFTED
650 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
651 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
652 #undef _GLIBCXX_COMMA_SHIFTED
653 #undef _GLIBCXX_ARGS
654 #undef _GLIBCXX_PARAMS
655 #undef _GLIBCXX_TEMPLATE_ARGS
656 #undef _GLIBCXX_TEMPLATE_PARAMS
657 #undef _GLIBCXX_COMMA
658 #undef _GLIBCXX_NUM_ARGS
660 #define _GLIBCXX_NUM_ARGS 7
661 #define _GLIBCXX_COMMA ,
662 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7
663 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7
664 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7
665 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7
666 #define _GLIBCXX_COMMA_SHIFTED ,
667 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6
668 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6
669 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6
670 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6
671 #include <tr1/functional_iterate.h>
672 #undef _GLIBCXX_ARGS_SHIFTED
673 #undef _GLIBCXX_PARAMS_SHIFTED
674 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
675 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
676 #undef _GLIBCXX_COMMA_SHIFTED
677 #undef _GLIBCXX_ARGS
678 #undef _GLIBCXX_PARAMS
679 #undef _GLIBCXX_TEMPLATE_ARGS
680 #undef _GLIBCXX_TEMPLATE_PARAMS
681 #undef _GLIBCXX_COMMA
682 #undef _GLIBCXX_NUM_ARGS
684 #define _GLIBCXX_NUM_ARGS 8
685 #define _GLIBCXX_COMMA ,
686 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8
687 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8
688 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8
689 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8
690 #define _GLIBCXX_COMMA_SHIFTED ,
691 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7
692 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7
693 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7
694 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7
695 #include <tr1/functional_iterate.h>
696 #undef _GLIBCXX_ARGS_SHIFTED
697 #undef _GLIBCXX_PARAMS_SHIFTED
698 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
699 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
700 #undef _GLIBCXX_COMMA_SHIFTED
701 #undef _GLIBCXX_ARGS
702 #undef _GLIBCXX_PARAMS
703 #undef _GLIBCXX_TEMPLATE_ARGS
704 #undef _GLIBCXX_TEMPLATE_PARAMS
705 #undef _GLIBCXX_COMMA
706 #undef _GLIBCXX_NUM_ARGS
708 #define _GLIBCXX_NUM_ARGS 9
709 #define _GLIBCXX_COMMA ,
710 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9
711 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9
712 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9
713 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9
714 #define _GLIBCXX_COMMA_SHIFTED ,
715 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8
716 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8
717 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8
718 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8
719 #include <tr1/functional_iterate.h>
720 #undef _GLIBCXX_ARGS_SHIFTED
721 #undef _GLIBCXX_PARAMS_SHIFTED
722 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
723 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
724 #undef _GLIBCXX_COMMA_SHIFTED
725 #undef _GLIBCXX_ARGS
726 #undef _GLIBCXX_PARAMS
727 #undef _GLIBCXX_TEMPLATE_ARGS
728 #undef _GLIBCXX_TEMPLATE_PARAMS
729 #undef _GLIBCXX_COMMA
730 #undef _GLIBCXX_NUM_ARGS
732 #define _GLIBCXX_NUM_ARGS 10
733 #define _GLIBCXX_COMMA ,
734 #define _GLIBCXX_TEMPLATE_PARAMS typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9, typename _T10
735 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10
736 #define _GLIBCXX_PARAMS _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10
737 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10
738 #define _GLIBCXX_COMMA_SHIFTED ,
739 #define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6, typename _T7, typename _T8, typename _T9
740 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9
741 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9
742 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9
743 #include <tr1/functional_iterate.h>
744 #undef _GLIBCXX_ARGS_SHIFTED
745 #undef _GLIBCXX_PARAMS_SHIFTED
746 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
747 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
748 #undef _GLIBCXX_COMMA_SHIFTED
749 #undef _GLIBCXX_ARGS
750 #undef _GLIBCXX_PARAMS
751 #undef _GLIBCXX_TEMPLATE_ARGS
752 #undef _GLIBCXX_TEMPLATE_PARAMS
753 #undef _GLIBCXX_COMMA
754 #undef _GLIBCXX_NUM_ARGS
756 #define _GLIBCXX_NUM_ARGS 11
757 #define _GLIBCXX_COMMA ,
758 #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
759 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11
760 #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
761 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11
762 #define _GLIBCXX_COMMA_SHIFTED ,
763 #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
764 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10
765 #define _GLIBCXX_PARAMS_SHIFTED _T1 __a1, _T2 __a2, _T3 __a3, _T4 __a4, _T5 __a5, _T6 __a6, _T7 __a7, _T8 __a8, _T9 __a9, _T10 __a10
766 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10
767 #include <tr1/functional_iterate.h>
768 #undef _GLIBCXX_ARGS_SHIFTED
769 #undef _GLIBCXX_PARAMS_SHIFTED
770 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
771 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
772 #undef _GLIBCXX_COMMA_SHIFTED
773 #undef _GLIBCXX_ARGS
774 #undef _GLIBCXX_PARAMS
775 #undef _GLIBCXX_TEMPLATE_ARGS
776 #undef _GLIBCXX_TEMPLATE_PARAMS
777 #undef _GLIBCXX_COMMA
778 #undef _GLIBCXX_NUM_ARGS
780 #define _GLIBCXX_NUM_ARGS 12
781 #define _GLIBCXX_COMMA ,
782 #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
783 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12
784 #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
785 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12
786 #define _GLIBCXX_COMMA_SHIFTED ,
787 #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
788 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11
789 #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
790 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11
791 #include <tr1/functional_iterate.h>
792 #undef _GLIBCXX_ARGS_SHIFTED
793 #undef _GLIBCXX_PARAMS_SHIFTED
794 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
795 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
796 #undef _GLIBCXX_COMMA_SHIFTED
797 #undef _GLIBCXX_ARGS
798 #undef _GLIBCXX_PARAMS
799 #undef _GLIBCXX_TEMPLATE_ARGS
800 #undef _GLIBCXX_TEMPLATE_PARAMS
801 #undef _GLIBCXX_COMMA
802 #undef _GLIBCXX_NUM_ARGS
804 #define _GLIBCXX_NUM_ARGS 13
805 #define _GLIBCXX_COMMA ,
806 #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
807 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13
808 #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
809 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13
810 #define _GLIBCXX_COMMA_SHIFTED ,
811 #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
812 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12
813 #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
814 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12
815 #include <tr1/functional_iterate.h>
816 #undef _GLIBCXX_ARGS_SHIFTED
817 #undef _GLIBCXX_PARAMS_SHIFTED
818 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
819 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
820 #undef _GLIBCXX_COMMA_SHIFTED
821 #undef _GLIBCXX_ARGS
822 #undef _GLIBCXX_PARAMS
823 #undef _GLIBCXX_TEMPLATE_ARGS
824 #undef _GLIBCXX_TEMPLATE_PARAMS
825 #undef _GLIBCXX_COMMA
826 #undef _GLIBCXX_NUM_ARGS
828 #define _GLIBCXX_NUM_ARGS 14
829 #define _GLIBCXX_COMMA ,
830 #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
831 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14
832 #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
833 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14
834 #define _GLIBCXX_COMMA_SHIFTED ,
835 #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
836 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13
837 #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
838 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13
839 #include <tr1/functional_iterate.h>
840 #undef _GLIBCXX_ARGS_SHIFTED
841 #undef _GLIBCXX_PARAMS_SHIFTED
842 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
843 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
844 #undef _GLIBCXX_COMMA_SHIFTED
845 #undef _GLIBCXX_ARGS
846 #undef _GLIBCXX_PARAMS
847 #undef _GLIBCXX_TEMPLATE_ARGS
848 #undef _GLIBCXX_TEMPLATE_PARAMS
849 #undef _GLIBCXX_COMMA
850 #undef _GLIBCXX_NUM_ARGS
852 #define _GLIBCXX_NUM_ARGS 15
853 #define _GLIBCXX_COMMA ,
854 #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
855 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15
856 #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
857 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15
858 #define _GLIBCXX_COMMA_SHIFTED ,
859 #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
860 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14
861 #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
862 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14
863 #include <tr1/functional_iterate.h>
864 #undef _GLIBCXX_ARGS_SHIFTED
865 #undef _GLIBCXX_PARAMS_SHIFTED
866 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
867 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
868 #undef _GLIBCXX_COMMA_SHIFTED
869 #undef _GLIBCXX_ARGS
870 #undef _GLIBCXX_PARAMS
871 #undef _GLIBCXX_TEMPLATE_ARGS
872 #undef _GLIBCXX_TEMPLATE_PARAMS
873 #undef _GLIBCXX_COMMA
874 #undef _GLIBCXX_NUM_ARGS
876 #define _GLIBCXX_NUM_ARGS 16
877 #define _GLIBCXX_COMMA ,
878 #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
879 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16
880 #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
881 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16
882 #define _GLIBCXX_COMMA_SHIFTED ,
883 #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
884 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15
885 #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
886 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15
887 #include <tr1/functional_iterate.h>
888 #undef _GLIBCXX_ARGS_SHIFTED
889 #undef _GLIBCXX_PARAMS_SHIFTED
890 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
891 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
892 #undef _GLIBCXX_COMMA_SHIFTED
893 #undef _GLIBCXX_ARGS
894 #undef _GLIBCXX_PARAMS
895 #undef _GLIBCXX_TEMPLATE_ARGS
896 #undef _GLIBCXX_TEMPLATE_PARAMS
897 #undef _GLIBCXX_COMMA
898 #undef _GLIBCXX_NUM_ARGS
900 #define _GLIBCXX_NUM_ARGS 17
901 #define _GLIBCXX_COMMA ,
902 #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
903 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17
904 #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
905 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17
906 #define _GLIBCXX_COMMA_SHIFTED ,
907 #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
908 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16
909 #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
910 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16
911 #include <tr1/functional_iterate.h>
912 #undef _GLIBCXX_ARGS_SHIFTED
913 #undef _GLIBCXX_PARAMS_SHIFTED
914 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
915 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
916 #undef _GLIBCXX_COMMA_SHIFTED
917 #undef _GLIBCXX_ARGS
918 #undef _GLIBCXX_PARAMS
919 #undef _GLIBCXX_TEMPLATE_ARGS
920 #undef _GLIBCXX_TEMPLATE_PARAMS
921 #undef _GLIBCXX_COMMA
922 #undef _GLIBCXX_NUM_ARGS
924 #define _GLIBCXX_NUM_ARGS 18
925 #define _GLIBCXX_COMMA ,
926 #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
927 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18
928 #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
929 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18
930 #define _GLIBCXX_COMMA_SHIFTED ,
931 #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
932 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17
933 #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
934 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17
935 #include <tr1/functional_iterate.h>
936 #undef _GLIBCXX_ARGS_SHIFTED
937 #undef _GLIBCXX_PARAMS_SHIFTED
938 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
939 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
940 #undef _GLIBCXX_COMMA_SHIFTED
941 #undef _GLIBCXX_ARGS
942 #undef _GLIBCXX_PARAMS
943 #undef _GLIBCXX_TEMPLATE_ARGS
944 #undef _GLIBCXX_TEMPLATE_PARAMS
945 #undef _GLIBCXX_COMMA
946 #undef _GLIBCXX_NUM_ARGS
948 #define _GLIBCXX_NUM_ARGS 19
949 #define _GLIBCXX_COMMA ,
950 #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
951 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19
952 #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
953 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19
954 #define _GLIBCXX_COMMA_SHIFTED ,
955 #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
956 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18
957 #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
958 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18
959 #include <tr1/functional_iterate.h>
960 #undef _GLIBCXX_ARGS_SHIFTED
961 #undef _GLIBCXX_PARAMS_SHIFTED
962 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
963 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
964 #undef _GLIBCXX_COMMA_SHIFTED
965 #undef _GLIBCXX_ARGS
966 #undef _GLIBCXX_PARAMS
967 #undef _GLIBCXX_TEMPLATE_ARGS
968 #undef _GLIBCXX_TEMPLATE_PARAMS
969 #undef _GLIBCXX_COMMA
970 #undef _GLIBCXX_NUM_ARGS
972 #define _GLIBCXX_NUM_ARGS 20
973 #define _GLIBCXX_COMMA ,
974 #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
975 #define _GLIBCXX_TEMPLATE_ARGS _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20
976 #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
977 #define _GLIBCXX_ARGS __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19, __a20
978 #define _GLIBCXX_COMMA_SHIFTED ,
979 #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
980 #define _GLIBCXX_TEMPLATE_ARGS_SHIFTED _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19
981 #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
982 #define _GLIBCXX_ARGS_SHIFTED __a1, __a2, __a3, __a4, __a5, __a6, __a7, __a8, __a9, __a10, __a11, __a12, __a13, __a14, __a15, __a16, __a17, __a18, __a19
983 #include <tr1/functional_iterate.h>
984 #undef _GLIBCXX_ARGS_SHIFTED
985 #undef _GLIBCXX_PARAMS_SHIFTED
986 #undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED
987 #undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED
988 #undef _GLIBCXX_COMMA_SHIFTED
989 #undef _GLIBCXX_ARGS
990 #undef _GLIBCXX_PARAMS
991 #undef _GLIBCXX_TEMPLATE_ARGS
992 #undef _GLIBCXX_TEMPLATE_PARAMS
993 #undef _GLIBCXX_COMMA
994 #undef _GLIBCXX_NUM_ARGS
996   // [3.7.2.7] null pointer comparisons
998   /**
999    *  @brief Compares a polymorphic function object wrapper against 0
1000    *  (the NULL pointer).
1001    *  @returns @c true if the wrapper has no target, @c false otherwise
1002    *
1003    *  This function will not throw an exception.
1004    */
1005   template<typename _Signature>
1006     inline bool
1007     operator==(const function<_Signature>& __f, _M_clear_type*)
1008     {
1009       return !__f;
1010     }
1012   /**
1013    *  @overload
1014    */
1015   template<typename _Signature>
1016     inline bool
1017     operator==(_M_clear_type*, const function<_Signature>& __f)
1018     {
1019       return !__f;
1020     }
1022   /**
1023    *  @brief Compares a polymorphic function object wrapper against 0
1024    *  (the NULL pointer).
1025    *  @returns @c false if the wrapper has no target, @c true otherwise
1026    *
1027    *  This function will not throw an exception.
1028    */
1029   template<typename _Signature>
1030     inline bool
1031     operator!=(const function<_Signature>& __f, _M_clear_type*)
1032     {
1033       return __f;
1034     }
1036   /**
1037    *  @overload
1038    */
1039   template<typename _Signature>
1040     inline bool
1041     operator!=(_M_clear_type*, const function<_Signature>& __f)
1042     {
1043       return __f;
1044     }
1046   // [3.7.2.8] specialized algorithms
1048   /**
1049    *  @brief Swap the targets of two polymorphic function object wrappers.
1050    *
1051    *  This function will not throw an exception.
1052    */
1053   template<typename _Signature>
1054     inline void
1055     swap(function<_Signature>& __x, function<_Signature>& __y)
1056     {
1057       __x.swap(__y);
1058     }
1061 // Definition of default hash function std::tr1::hash<>.  The types for
1062 // which std::tr1::hash<T> is defined is in clause 6.3.3. of the PDTR.
1064   template <typename T> struct hash;
1066   #define tr1_hashtable_define_trivial_hash(T)                              \
1067     template <> struct hash<T> {                                                    \
1068       std::size_t operator()(T val) const { return static_cast<std::size_t>(val); } \
1069     }                                                                       \
1071   tr1_hashtable_define_trivial_hash(bool);
1072   tr1_hashtable_define_trivial_hash(char);
1073   tr1_hashtable_define_trivial_hash(signed char);
1074   tr1_hashtable_define_trivial_hash(unsigned char);
1075   tr1_hashtable_define_trivial_hash(wchar_t);
1076   tr1_hashtable_define_trivial_hash(short);
1077   tr1_hashtable_define_trivial_hash(int);
1078   tr1_hashtable_define_trivial_hash(long);
1079   tr1_hashtable_define_trivial_hash(unsigned short);
1080   tr1_hashtable_define_trivial_hash(unsigned int);
1081   tr1_hashtable_define_trivial_hash(unsigned long);
1083   tr1_hashtable_define_trivial_hash(float);
1084   tr1_hashtable_define_trivial_hash(double);
1085   tr1_hashtable_define_trivial_hash(long double);
1087   #undef tr1_hashtable_define_trivial_hash
1089   template <typename T>
1090     struct hash<T*> {
1091       std::size_t operator()(T* p) const {
1092         return reinterpret_cast<std::size_t>(p);
1093       }
1094     };
1096   // ??? We can probably find a better hash function than this (i.e. one
1097   // that vectorizes better and that produces a more uniform distribution).
1099   // XXX String hash probably shouldn't be an inline member function,
1100   // since it's nontrivial.  Once we have the framework for TR1 .cc
1101   // files, this should go in one.
1103   template <>
1104     struct hash<std::string>
1105     {
1106       std::size_t operator()(const std::string& s) const
1107       {
1108         std::size_t result = 0;
1109         for (std::string::const_iterator i = s.begin(); i != s.end(); ++i)
1110           result = (result * 131) + *i;
1111         return result;
1112       }
1113     };
1115 #ifdef _GLIBCXX_USE_WCHAR_T
1116   template <>
1117     struct hash<std::wstring>
1118     {
1119       std::size_t operator()(const std::wstring& s) const
1120       {
1121         std::size_t result = 0;
1122         for (std::wstring::const_iterator i = s.begin(); i != s.end(); ++i)
1123           result = (result * 131) + *i;
1124         return result;
1125       }
1126     };
1127 #endif
1132 #endif