Clang Project

include/c++/7/functional
1// <functional> -*- C++ -*-
2
3// Copyright (C) 2001-2017 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 3, or (at your option)
9// any later version.
10
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.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/*
26 * Copyright (c) 1997
27 * Silicon Graphics Computer Systems, Inc.
28 *
29 * Permission to use, copy, modify, distribute and sell this software
30 * and its documentation for any purpose is hereby granted without fee,
31 * provided that the above copyright notice appear in all copies and
32 * that both that copyright notice and this permission notice appear
33 * in supporting documentation.  Silicon Graphics makes no
34 * representations about the suitability of this software for any
35 * purpose.  It is provided "as is" without express or implied warranty.
36 *
37 */
38
39/** @file include/functional
40 *  This is a Standard C++ Library header.
41 */
42
43#ifndef _GLIBCXX_FUNCTIONAL
44#define _GLIBCXX_FUNCTIONAL 1
45
46#pragma GCC system_header
47
48#include <bits/c++config.h>
49#include <bits/stl_function.h>
50
51#if __cplusplus >= 201103L
52
53#include <new>
54#include <tuple>
55#include <type_traits>
56#include <bits/functional_hash.h>
57#include <bits/invoke.h>
58#include <bits/std_function.h>
59#if __cplusplus > 201402L
60include <unordered_map>
61include <vector>
62include <array>
63include <utility>
64include <bits/stl_algo.h>
65#endif
66
67namespace std _GLIBCXX_VISIBILITY(default)
68{
69_GLIBCXX_BEGIN_NAMESPACE_VERSION
70
71#if __cplusplus > 201402L
72define __cpp_lib_invoke 201411
73
74  /// Invoke a callable object.
75  template<typename _Callable, typename... _Args>
76    inline invoke_result_t<_Callable, _Args...>
77    invoke(_Callable&& __fn, _Args&&... __args)
78    noexcept(is_nothrow_invocable_v<_Callable, _Args...>)
79    {
80      return std::__invoke(std::forward<_Callable>(__fn),
81    std::forward<_Args>(__args)...);
82    }
83#endif
84
85  template<typename... _Types>
86    struct _Pack : integral_constant<size_tsizeof...(_Types)>
87    { };
88
89  template<typename _From, typename _To, bool = _From::value == _To::value>
90    struct _AllConvertible : false_type
91    { };
92
93  template<typename... _From, typename... _To>
94    struct _AllConvertible<_Pack<_From...>, _Pack<_To...>, true>
95    : __and_<is_convertible<_From, _To>...>
96    { };
97
98  template<typename _Tp1, typename _Tp2>
99    using _NotSame = __not_<is_same<typename std::decay<_Tp1>::type,
100     typename std::decay<_Tp2>::type>>;
101
102  template<typename _Signature>
103    struct _Mem_fn_traits;
104
105  template<typename _Res, typename _Class, typename... _ArgTypes>
106    struct _Mem_fn_traits_base
107    {
108      using __result_type = _Res;
109      using __maybe_type
110_Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...>;
111      using __arity = integral_constant<size_tsizeof...(_ArgTypes)>;
112    };
113
114#define _GLIBCXX_MEM_FN_TRAITS2(_CV, _REF, _LVAL, _RVAL) \
115  template<typename _Res, typename _Class, typename... _ArgTypes> \
116    struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) _CV _REF> \
117    : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \
118    { \
119      using __vararg = false_type; \
120    }; \
121  template<typename _Res, typename _Class, typename... _ArgTypes> \
122    struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) _CV _REF> \
123    : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \
124    { \
125      using __vararg = true_type; \
126    };
127
128#define _GLIBCXX_MEM_FN_TRAITS(_REF, _LVAL, _RVAL) \
129  _GLIBCXX_MEM_FN_TRAITS2( , _REF, _LVAL, _RVAL) \
130  _GLIBCXX_MEM_FN_TRAITS2(const , _REF, _LVAL, _RVAL) \
131  _GLIBCXX_MEM_FN_TRAITS2(volatile , _REF, _LVAL, _RVAL) \
132  _GLIBCXX_MEM_FN_TRAITS2(const volatile, _REF, _LVAL, _RVAL)
133
134_GLIBCXX_MEM_FN_TRAITS( , true_type, true_type)
135_GLIBCXX_MEM_FN_TRAITS(&, true_type, false_type)
136_GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
137
138#if __cplusplus > 201402L
139_GLIBCXX_MEM_FN_TRAITS(noexcept, true_type, true_type)
140_GLIBCXX_MEM_FN_TRAITS(& noexcept, true_type, false_type)
141_GLIBCXX_MEM_FN_TRAITS(&& noexcept, false_type, true_type)
142#endif
143
144#undef _GLIBCXX_MEM_FN_TRAITS
145#undef _GLIBCXX_MEM_FN_TRAITS2
146
147  template<typename _MemFunPtr,
148    bool __is_mem_fn = is_member_function_pointer<_MemFunPtr>::value>
149    class _Mem_fn_base
150    : public _Mem_fn_traits<_MemFunPtr>::__maybe_type
151    {
152      using _Traits = _Mem_fn_traits<_MemFunPtr>;
153
154      using _Arity = typename _Traits::__arity;
155      using _Varargs = typename _Traits::__vararg;
156
157      template<typename _Func, typename... _BoundArgs>
158 friend struct _Bind_check_arity;
159
160      _MemFunPtr _M_pmf;
161
162    public:
163
164      using result_type = typename _Traits::__result_type;
165
166      explicit constexpr
167      _Mem_fn_base(_MemFunPtr __pmfnoexcept : _M_pmf(__pmf) { }
168
169      template<typename... _Args>
170 auto
171 operator()(_Args&&... __argsconst
172 noexcept(noexcept(
173       std::__invoke(_M_pmfstd::forward<_Args>(__args)...)))
174 -> decltype(std::__invoke(_M_pmfstd::forward<_Args>(__args)...))
175return std::__invoke(_M_pmfstd::forward<_Args>(__args)...); }
176    };
177
178  // Partial specialization for member object pointers.
179  template<typename _MemObjPtr>
180    class _Mem_fn_base<_MemObjPtr, false>
181    {
182      using _Arity = integral_constant<size_t0>;
183      using _Varargs = false_type;
184
185      template<typename _Func, typename... _BoundArgs>
186 friend struct _Bind_check_arity;
187
188      _MemObjPtr _M_pm;
189
190    public:
191      explicit constexpr
192      _Mem_fn_base(_MemObjPtr __pmnoexcept : _M_pm(__pm) { }
193
194      template<typename _Tp>
195 auto
196 operator()(_Tp&& __objconst
197 noexcept(noexcept(std::__invoke(_M_pmstd::forward<_Tp>(__obj))))
198 -> decltype(std::__invoke(_M_pmstd::forward<_Tp>(__obj)))
199return std::__invoke(_M_pmstd::forward<_Tp>(__obj)); }
200    };
201
202  template<typename _MemberPointer>
203    struct _Mem_fn// undefined
204
205  template<typename _Res, typename _Class>
206    struct _Mem_fn<_Res _Class::*>
207    : _Mem_fn_base<_Res _Class::*>
208    {
209      using _Mem_fn_base<_Res _Class::*>::_Mem_fn_base;
210    };
211
212  // _GLIBCXX_RESOLVE_LIB_DEFECTS
213  // 2048.  Unnecessary mem_fn overloads
214  /**
215   *  @brief Returns a function object that forwards to the member
216   *  pointer @a pm.
217   *  @ingroup functors
218   */
219  template<typename _Tp, typename _Class>
220    inline _Mem_fn<_Tp _Class::*>
221    mem_fn(_Tp _Class::* __pmnoexcept
222    {
223      return _Mem_fn<_Tp _Class::*>(__pm);
224    }
225
226  /**
227   *  @brief Determines if the given type _Tp is a function object that
228   *  should be treated as a subexpression when evaluating calls to
229   *  function objects returned by bind().
230   *
231   *  C++11 [func.bind.isbind].
232   *  @ingroup binders
233   */
234  template<typename _Tp>
235    struct is_bind_expression
236    : public false_type { };
237
238  /**
239   *  @brief Determines if the given type _Tp is a placeholder in a
240   *  bind() expression and, if so, which placeholder it is.
241   *
242   *  C++11 [func.bind.isplace].
243   *  @ingroup binders
244   */
245  template<typename _Tp>
246    struct is_placeholder
247    : public integral_constant<int0>
248    { };
249
250#if __cplusplus > 201402L
251  template <typename _Tp> inline constexpr bool is_bind_expression_v
252    = is_bind_expression<_Tp>::value;
253  template <typename _Tp> inline constexpr int is_placeholder_v
254    = is_placeholder<_Tp>::value;
255#endif // C++17
256
257  /** @brief The type of placeholder objects defined by libstdc++.
258   *  @ingroup binders
259   */
260  template<int _Num> struct _Placeholder { };
261
262  _GLIBCXX_END_NAMESPACE_VERSION
263
264  /** @namespace std::placeholders
265   *  @brief ISO C++11 entities sub-namespace for functional.
266   *  @ingroup binders
267   */
268  namespace placeholders
269  {
270  _GLIBCXX_BEGIN_NAMESPACE_VERSION
271  /* Define a large number of placeholders. There is no way to
272   * simplify this with variadic templates, because we're introducing
273   * unique names for each.
274   */
275    extern const _Placeholder<1_1;
276    extern const _Placeholder<2_2;
277    extern const _Placeholder<3_3;
278    extern const _Placeholder<4_4;
279    extern const _Placeholder<5_5;
280    extern const _Placeholder<6_6;
281    extern const _Placeholder<7_7;
282    extern const _Placeholder<8_8;
283    extern const _Placeholder<9_9;
284    extern const _Placeholder<10_10;
285    extern const _Placeholder<11_11;
286    extern const _Placeholder<12_12;
287    extern const _Placeholder<13_13;
288    extern const _Placeholder<14_14;
289    extern const _Placeholder<15_15;
290    extern const _Placeholder<16_16;
291    extern const _Placeholder<17_17;
292    extern const _Placeholder<18_18;
293    extern const _Placeholder<19_19;
294    extern const _Placeholder<20_20;
295    extern const _Placeholder<21_21;
296    extern const _Placeholder<22_22;
297    extern const _Placeholder<23_23;
298    extern const _Placeholder<24_24;
299    extern const _Placeholder<25_25;
300    extern const _Placeholder<26_26;
301    extern const _Placeholder<27_27;
302    extern const _Placeholder<28_28;
303    extern const _Placeholder<29_29;
304  _GLIBCXX_END_NAMESPACE_VERSION
305  }
306
307  _GLIBCXX_BEGIN_NAMESPACE_VERSION
308
309  /**
310   *  Partial specialization of is_placeholder that provides the placeholder
311   *  number for the placeholder objects defined by libstdc++.
312   *  @ingroup binders
313   */
314  template<int _Num>
315    struct is_placeholder<_Placeholder<_Num> >
316    : public integral_constant<int_Num>
317    { };
318
319  template<int _Num>
320    struct is_placeholder<const _Placeholder<_Num> >
321    : public integral_constant<int_Num>
322    { };
323
324
325  // Like tuple_element_t but SFINAE-friendly.
326  template<std::size_t __i, typename _Tuple>
327    using _Safe_tuple_element_t
328      = typename enable_if<(__i < tuple_size<_Tuple>::value),
329    tuple_element<__i, _Tuple>>::type::type;
330
331  /**
332   *  Maps an argument to bind() into an actual argument to the bound
333   *  function object [func.bind.bind]/10. Only the first parameter should
334   *  be specified: the rest are used to determine among the various
335   *  implementations. Note that, although this class is a function
336   *  object, it isn't entirely normal because it takes only two
337   *  parameters regardless of the number of parameters passed to the
338   *  bind expression. The first parameter is the bound argument and
339   *  the second parameter is a tuple containing references to the
340   *  rest of the arguments.
341   */
342  template<typename _Arg,
343    bool _IsBindExp = is_bind_expression<_Arg>::value,
344    bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)>
345    class _Mu;
346
347  /**
348   *  If the argument is reference_wrapper<_Tp>, returns the
349   *  underlying reference.
350   *  C++11 [func.bind.bind] p10 bullet 1.
351   */
352  template<typename _Tp>
353    class _Mu<reference_wrapper<_Tp>, falsefalse>
354    {
355    public:
356      /* Note: This won't actually work for const volatile
357       * reference_wrappers, because reference_wrapper::get() is const
358       * but not volatile-qualified. This might be a defect in the TR.
359       */
360      template<typename _CVRef, typename _Tuple>
361 _Tp&
362 operator()(_CVRef& __arg, _Tuple&) const volatile
363return __arg.get(); }
364    };
365
366  /**
367   *  If the argument is a bind expression, we invoke the underlying
368   *  function object with the same cv-qualifiers as we are given and
369   *  pass along all of our arguments (unwrapped).
370   *  C++11 [func.bind.bind] p10 bullet 2.
371   */
372  template<typename _Arg>
373    class _Mu<_Arg, truefalse>
374    {
375    public:
376      template<typename _CVArg, typename... _Args>
377 auto
378 operator()(_CVArg& __arg,
379    tuple<_Args...>& __tupleconst volatile
380 -> decltype(__arg(declval<_Args>()...))
381 {
382   // Construct an index tuple and forward to __call
383   typedef typename _Build_index_tuple<sizeof...(_Args)>::__type
384     _Indexes;
385   return this->__call(__arg__tuple_Indexes());
386 }
387
388    private:
389      // Invokes the underlying function object __arg by unpacking all
390      // of the arguments in the tuple.
391      template<typename _CVArg, typename... _Args, std::size_t... _Indexes>
392 auto
393 __call(_CVArg& __argtuple<_Args...>& __tuple,
394        const _Index_tuple<_Indexes...>&) const volatile
395 -> decltype(__arg(declval<_Args>()...))
396 {
397   return __arg(std::get<_Indexes>(std::move(__tuple))...);
398 }
399    };
400
401  /**
402   *  If the argument is a placeholder for the Nth argument, returns
403   *  a reference to the Nth argument to the bind function object.
404   *  C++11 [func.bind.bind] p10 bullet 3.
405   */
406  template<typename _Arg>
407    class _Mu<_Arg, falsetrue>
408    {
409    public:
410      template<typename _Tuple>
411 _Safe_tuple_element_t<(is_placeholder<_Arg>::value - 1), _Tuple>&&
412 operator()(const volatile _Arg&, _Tuple& __tupleconst volatile
413 {
414   return
415     ::std::get<(is_placeholder<_Arg>::value - 1)>(std::move(__tuple));
416 }
417    };
418
419  /**
420   *  If the argument is just a value, returns a reference to that
421   *  value. The cv-qualifiers on the reference are determined by the caller.
422   *  C++11 [func.bind.bind] p10 bullet 4.
423   */
424  template<typename _Arg>
425    class _Mu<_Arg, falsefalse>
426    {
427    public:
428      template<typename _CVArg, typename _Tuple>
429 _CVArg&&
430 operator()(_CVArg&& __arg, _Tuple&) const volatile
431return std::forward<_CVArg>(__arg); }
432    };
433
434  // std::get<I> for volatile-qualified tuples
435  template<std::size_t _Ind, typename... _Tp>
436    inline auto
437    __volget(volatile tuple<_Tp...>& __tuple)
438    -> __tuple_element_t<_Indtuple<_Tp...>> volatile&
439    { return std::get<_Ind>(const_cast<tuple<_Tp...>&>(__tuple)); }
440
441  // std::get<I> for const-volatile-qualified tuples
442  template<std::size_t _Ind, typename... _Tp>
443    inline auto
444    __volget(const volatile tuple<_Tp...>& __tuple)
445    -> __tuple_element_t<_Indtuple<_Tp...>> const volatile&
446    { return std::get<_Ind>(const_cast<const tuple<_Tp...>&>(__tuple)); }
447
448  /// Type of the function object returned from bind().
449  template<typename _Signature>
450    struct _Bind;
451
452   template<typename _Functor, typename... _Bound_args>
453    class _Bind<_Functor(_Bound_args...)>
454    : public _Weak_result_type<_Functor>
455    {
456      typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type
457 _Bound_indexes;
458
459      _Functor _M_f;
460      tuple<_Bound_args...> _M_bound_args;
461
462      // Call unqualified
463      template<typename _Result, typename... _Args, std::size_t... _Indexes>
464 _Result
465 __call(tuple<_Args...>&& __args_Index_tuple<_Indexes...>)
466 {
467   return std::__invoke(_M_f,
468       _Mu<_Bound_args>()(std::get<_Indexes>(_M_bound_args), __args)...
469       );
470 }
471
472      // Call as const
473      template<typename _Result, typename... _Args, std::size_t... _Indexes>
474 _Result
475 __call_c(tuple<_Args...>&& __args_Index_tuple<_Indexes...>) const
476 {
477   return std::__invoke(_M_f,
478       _Mu<_Bound_args>()(std::get<_Indexes>(_M_bound_args), __args)...
479       );
480 }
481
482      // Call as volatile
483      template<typename _Result, typename... _Args, std::size_t... _Indexes>
484 _Result
485 __call_v(tuple<_Args...>&& __args,
486  _Index_tuple<_Indexes...>) volatile
487 {
488   return std::__invoke(_M_f,
489       _Mu<_Bound_args>()(__volget<_Indexes>(_M_bound_args), __args)...
490       );
491 }
492
493      // Call as const volatile
494      template<typename _Result, typename... _Args, std::size_t... _Indexes>
495 _Result
496 __call_c_v(tuple<_Args...>&& __args,
497    _Index_tuple<_Indexes...>) const volatile
498 {
499   return std::__invoke(_M_f,
500       _Mu<_Bound_args>()(__volget<_Indexes>(_M_bound_args), __args)...
501       );
502 }
503
504      template<typename _BoundArg, typename _CallArgs>
505 using _Mu_type = decltype(
506     _Mu<typename remove_cv<_BoundArg>::type>()(
507       std::declval<_BoundArg&>(), std::declval<_CallArgs&>()) );
508
509      template<typename _Fn, typename _CallArgs, typename... _BArgs>
510 using _Res_type_impl
511   = typename result_of< _Fn&(_Mu_type<_BArgs, _CallArgs>&&...) >::type;
512
513      template<typename _CallArgs>
514 using _Res_type = _Res_type_impl<_Functor, _CallArgs, _Bound_args...>;
515
516      template<typename _CallArgs>
517 using __dependent = typename
518   enable_if<bool(tuple_size<_CallArgs>::value+1), _Functor>::type;
519
520      template<typename _CallArgs, template<classclass __cv_quals>
521 using _Res_type_cv = _Res_type_impl<
522   typename __cv_quals<__dependent<_CallArgs>>::type,
523   _CallArgs,
524   typename __cv_quals<_Bound_args>::type...>;
525
526     public:
527      template<typename... _Args>
528 explicit _Bind(const _Functor& __f, _Args&&... __args)
529_M_f(__f), _M_bound_args(std::forward<_Args>(__args)...)
530 { }
531
532      template<typename... _Args>
533 explicit _Bind(_Functor&& __f, _Args&&... __args)
534_M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...)
535 { }
536
537      _Bind(const _Bind&) = default;
538
539      _Bind(_Bind&& __b)
540      : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args))
541      { }
542
543      // Call unqualified
544      template<typename... _Args,
545        typename _Result = _Res_type<tuple<_Args...>>>
546 _Result
547 operator()(_Args&&... __args)
548 {
549   return this->__call<_Result>(
550       std::forward_as_tuple(std::forward<_Args>(__args)...),
551       _Bound_indexes());
552 }
553
554      // Call as const
555      template<typename... _Args,
556        typename _Result = _Res_type_cv<tuple<_Args...>, add_const>>
557 _Result
558 operator()(_Args&&... __argsconst
559 {
560   return this->__call_c<_Result>(
561       std::forward_as_tuple(std::forward<_Args>(__args)...),
562       _Bound_indexes());
563 }
564
565#if __cplusplus > 201402L
566define _GLIBCXX_DEPR_BIND \
567      [[deprecated("std::bind does not support volatile in C++17")]]
568#else
569define _GLIBCXX_DEPR_BIND
570#endif
571      // Call as volatile
572      template<typename... _Args,
573        typename _Result = _Res_type_cv<tuple<_Args...>, add_volatile>>
574 _GLIBCXX_DEPR_BIND
575 _Result
576 operator()(_Args&&... __argsvolatile
577 {
578   return this->__call_v<_Result>(
579       std::forward_as_tuple(std::forward<_Args>(__args)...),
580       _Bound_indexes());
581 }
582
583      // Call as const volatile
584      template<typename... _Args,
585        typename _Result = _Res_type_cv<tuple<_Args...>, add_cv>>
586 _GLIBCXX_DEPR_BIND
587 _Result
588 operator()(_Args&&... __argsconst volatile
589 {
590   return this->__call_c_v<_Result>(
591       std::forward_as_tuple(std::forward<_Args>(__args)...),
592       _Bound_indexes());
593 }
594    };
595
596  /// Type of the function object returned from bind<R>().
597  template<typename _Result, typename _Signature>
598    struct _Bind_result;
599
600  template<typename _Result, typename _Functor, typename... _Bound_args>
601    class _Bind_result<_Result, _Functor(_Bound_args...)>
602    {
603      typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type
604 _Bound_indexes;
605
606      _Functor _M_f;
607      tuple<_Bound_args...> _M_bound_args;
608
609      // sfinae types
610      template<typename _Res>
611 using __enable_if_void
612   = typename enable_if<is_void<_Res>{}>::type;
613
614      template<typename _Res>
615 using __disable_if_void
616   = typename enable_if<!is_void<_Res>{}, _Result>::type;
617
618      // Call unqualified
619      template<typename _Res, typename... _Args, std::size_t... _Indexes>
620 __disable_if_void<_Res>
621 __call(tuple<_Args...>&& __args_Index_tuple<_Indexes...>)
622 {
623   return std::__invoke(_M_f_Mu<_Bound_args>()
624       (std::get<_Indexes>(_M_bound_args), __args)...);
625 }
626
627      // Call unqualified, return void
628      template<typename _Res, typename... _Args, std::size_t... _Indexes>
629 __enable_if_void<_Res>
630 __call(tuple<_Args...>&& __args_Index_tuple<_Indexes...>)
631 {
632   std::__invoke(_M_f_Mu<_Bound_args>()
633        (std::get<_Indexes>(_M_bound_args), __args)...);
634 }
635
636      // Call as const
637      template<typename _Res, typename... _Args, std::size_t... _Indexes>
638 __disable_if_void<_Res>
639 __call(tuple<_Args...>&& __args_Index_tuple<_Indexes...>) const
640 {
641   return std::__invoke(_M_f_Mu<_Bound_args>()
642       (std::get<_Indexes>(_M_bound_args), __args)...);
643 }
644
645      // Call as const, return void
646      template<typename _Res, typename... _Args, std::size_t... _Indexes>
647 __enable_if_void<_Res>
648 __call(tuple<_Args...>&& __args_Index_tuple<_Indexes...>) const
649 {
650   std::__invoke(_M_f_Mu<_Bound_args>()
651        (std::get<_Indexes>(_M_bound_args),  __args)...);
652 }
653
654      // Call as volatile
655      template<typename _Res, typename... _Args, std::size_t... _Indexes>
656 __disable_if_void<_Res>
657 __call(tuple<_Args...>&& __args_Index_tuple<_Indexes...>) volatile
658 {
659   return std::__invoke(_M_f_Mu<_Bound_args>()
660       (__volget<_Indexes>(_M_bound_args), __args)...);
661 }
662
663      // Call as volatile, return void
664      template<typename _Res, typename... _Args, std::size_t... _Indexes>
665 __enable_if_void<_Res>
666 __call(tuple<_Args...>&& __args_Index_tuple<_Indexes...>) volatile
667 {
668   std::__invoke(_M_f_Mu<_Bound_args>()
669        (__volget<_Indexes>(_M_bound_args), __args)...);
670 }
671
672      // Call as const volatile
673      template<typename _Res, typename... _Args, std::size_t... _Indexes>
674 __disable_if_void<_Res>
675 __call(tuple<_Args...>&& __args,
676        _Index_tuple<_Indexes...>) const volatile
677 {
678   return std::__invoke(_M_f_Mu<_Bound_args>()
679       (__volget<_Indexes>(_M_bound_args), __args)...);
680 }
681
682      // Call as const volatile, return void
683      template<typename _Res, typename... _Args, std::size_t... _Indexes>
684 __enable_if_void<_Res>
685 __call(tuple<_Args...>&& __args,
686        _Index_tuple<_Indexes...>) const volatile
687 {
688   std::__invoke(_M_f_Mu<_Bound_args>()
689        (__volget<_Indexes>(_M_bound_args), __args)...);
690 }
691
692    public:
693      typedef _Result result_type;
694
695      template<typename... _Args>
696 explicit _Bind_result(const _Functor& __f, _Args&&... __args)
697_M_f(__f), _M_bound_args(std::forward<_Args>(__args)...)
698 { }
699
700      template<typename... _Args>
701 explicit _Bind_result(_Functor&& __f, _Args&&... __args)
702_M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...)
703 { }
704
705      _Bind_result(const _Bind_result&) = default;
706
707      _Bind_result(_Bind_result&& __b)
708      : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args))
709      { }
710
711      // Call unqualified
712      template<typename... _Args>
713 result_type
714 operator()(_Args&&... __args)
715 {
716   return this->__call<_Result>(
717       std::forward_as_tuple(std::forward<_Args>(__args)...),
718       _Bound_indexes());
719 }
720
721      // Call as const
722      template<typename... _Args>
723 result_type
724 operator()(_Args&&... __argsconst
725 {
726   return this->__call<_Result>(
727       std::forward_as_tuple(std::forward<_Args>(__args)...),
728       _Bound_indexes());
729 }
730
731      // Call as volatile
732      template<typename... _Args>
733 _GLIBCXX_DEPR_BIND
734 result_type
735 operator()(_Args&&... __argsvolatile
736 {
737   return this->__call<_Result>(
738       std::forward_as_tuple(std::forward<_Args>(__args)...),
739       _Bound_indexes());
740 }
741
742      // Call as const volatile
743      template<typename... _Args>
744 _GLIBCXX_DEPR_BIND
745 result_type
746 operator()(_Args&&... __argsconst volatile
747 {
748   return this->__call<_Result>(
749       std::forward_as_tuple(std::forward<_Args>(__args)...),
750       _Bound_indexes());
751 }
752    };
753#undef _GLIBCXX_DEPR_BIND
754
755  /**
756   *  @brief Class template _Bind is always a bind expression.
757   *  @ingroup binders
758   */
759  template<typename _Signature>
760    struct is_bind_expression<_Bind<_Signature> >
761    : public true_type { };
762
763  /**
764   *  @brief Class template _Bind is always a bind expression.
765   *  @ingroup binders
766   */
767  template<typename _Signature>
768    struct is_bind_expression<const _Bind<_Signature> >
769    : public true_type { };
770
771  /**
772   *  @brief Class template _Bind is always a bind expression.
773   *  @ingroup binders
774   */
775  template<typename _Signature>
776    struct is_bind_expression<volatile _Bind<_Signature> >
777    : public true_type { };
778
779  /**
780   *  @brief Class template _Bind is always a bind expression.
781   *  @ingroup binders
782   */
783  template<typename _Signature>
784    struct is_bind_expression<const volatile _Bind<_Signature>>
785    : public true_type { };
786
787  /**
788   *  @brief Class template _Bind_result is always a bind expression.
789   *  @ingroup binders
790   */
791  template<typename _Result, typename _Signature>
792    struct is_bind_expression<_Bind_result<_Result, _Signature>>
793    : public true_type { };
794
795  /**
796   *  @brief Class template _Bind_result is always a bind expression.
797   *  @ingroup binders
798   */
799  template<typename _Result, typename _Signature>
800    struct is_bind_expression<const _Bind_result<_Result, _Signature>>
801    : public true_type { };
802
803  /**
804   *  @brief Class template _Bind_result is always a bind expression.
805   *  @ingroup binders
806   */
807  template<typename _Result, typename _Signature>
808    struct is_bind_expression<volatile _Bind_result<_Result, _Signature>>
809    : public true_type { };
810
811  /**
812   *  @brief Class template _Bind_result is always a bind expression.
813   *  @ingroup binders
814   */
815  template<typename _Result, typename _Signature>
816    struct is_bind_expression<const volatile _Bind_result<_Result, _Signature>>
817    : public true_type { };
818
819  template<typename _Func, typename... _BoundArgs>
820    struct _Bind_check_arity { };
821
822  template<typename _Ret, typename... _Args, typename... _BoundArgs>
823    struct _Bind_check_arity<_Ret (*)(_Args...), _BoundArgs...>
824    {
825      static_assert(sizeof...(_BoundArgs) == sizeof...(_Args),
826                   "Wrong number of arguments for function");
827    };
828
829  template<typename _Ret, typename... _Args, typename... _BoundArgs>
830    struct _Bind_check_arity<_Ret (*)(_Args......), _BoundArgs...>
831    {
832      static_assert(sizeof...(_BoundArgs) >= sizeof...(_Args),
833                   "Wrong number of arguments for function");
834    };
835
836  template<typename _Tp, typename _Class, typename... _BoundArgs>
837    struct _Bind_check_arity<_Tp _Class::*, _BoundArgs...>
838    {
839      using _Arity = typename _Mem_fn<_Tp _Class::*>::_Arity;
840      using _Varargs = typename _Mem_fn<_Tp _Class::*>::_Varargs;
841      static_assert(_Varargs::value
842     ? sizeof...(_BoundArgs) >= _Arity::value + 1
843     : sizeof...(_BoundArgs) == _Arity::value + 1,
844     "Wrong number of arguments for pointer-to-member");
845    };
846
847  // Trait type used to remove std::bind() from overload set via SFINAE
848  // when first argument has integer type, so that std::bind() will
849  // not be a better match than ::bind() from the BSD Sockets API.
850  template<typename _Tp, typename _Tp2 = typename decay<_Tp>::type>
851    using __is_socketlike = __or_<is_integral<_Tp2>, is_enum<_Tp2>>;
852
853  template<bool _SocketLike, typename _Func, typename... _BoundArgs>
854    struct _Bind_helper
855    : _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...>
856    {
857      typedef typename decay<_Func>::type __func_type;
858      typedef _Bind<__func_type(typename decay<_BoundArgs>::type...)> type;
859    };
860
861  // Partial specialization for is_socketlike == true, does not define
862  // nested type so std::bind() will not participate in overload resolution
863  // when the first argument might be a socket file descriptor.
864  template<typename _Func, typename... _BoundArgs>
865    struct _Bind_helper<true, _Func, _BoundArgs...>
866    { };
867
868  /**
869   *  @brief Function template for std::bind.
870   *  @ingroup binders
871   */
872  template<typename _Func, typename... _BoundArgs>
873    inline typename
874    _Bind_helper<__is_socketlike<_Func>::value, _Func, _BoundArgs...>::type
875    bind(_Func&& __f, _BoundArgs&&... __args)
876    {
877      typedef _Bind_helper<false, _Func, _BoundArgs...> __helper_type;
878      return typename __helper_type::type(std::forward<_Func>(__f),
879   std::forward<_BoundArgs>(__args)...);
880    }
881
882  template<typename _Result, typename _Func, typename... _BoundArgs>
883    struct _Bindres_helper
884    : _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...>
885    {
886      typedef typename decay<_Func>::type __functor_type;
887      typedef _Bind_result<_Result,
888    __functor_type(typename decay<_BoundArgs>::type...)>
889 type;
890    };
891
892  /**
893   *  @brief Function template for std::bind<R>.
894   *  @ingroup binders
895   */
896  template<typename _Result, typename _Func, typename... _BoundArgs>
897    inline
898    typename _Bindres_helper<_Result, _Func, _BoundArgs...>::type
899    bind(_Func&& __f, _BoundArgs&&... __args)
900    {
901      typedef _Bindres_helper<_Result, _Func, _BoundArgs...> __helper_type;
902      return typename __helper_type::type(std::forward<_Func>(__f),
903   std::forward<_BoundArgs>(__args)...);
904    }
905
906#if __cplusplus >= 201402L
907  /// Generalized negator.
908  template<typename _Fn>
909    class _Not_fn
910    {
911      template<typename _Fn2, typename... _Args>
912 using __inv_res_t = typename __invoke_result<_Fn2, _Args...>::type;
913
914      template<typename _Tp>
915 static decltype(!std::declval<_Tp>())
916 _S_not() noexcept(noexcept(!std::declval<_Tp>()));
917
918    public:
919      template<typename _Fn2>
920 _Not_fn(_Fn2&& __fn, int)
921 : _M_fn(std::forward<_Fn2>(__fn)) { }
922
923      _Not_fn(const _Not_fn& __fn) = default;
924      _Not_fn(_Not_fn&& __fn) = default;
925      ~_Not_fn() = default;
926
927      // Macro to define operator() with given cv-qualifiers ref-qualifiers,
928      // forwarding _M_fn and the function arguments with the same qualifiers,
929      // and deducing the return type and exception-specification.
930#define _GLIBCXX_NOT_FN_CALL_OP( _QUALS ) \
931      template<typename... _Args> \
932 decltype(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>()) \
933 operator()(_Args&&... __args) _QUALS \
934 noexcept(__is_nothrow_invocable<_Fn _QUALS, _Args...>::value \
935     && noexcept(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>())) \
936 { \
937   return !std::__invoke(std::forward< _Fn _QUALS >(_M_fn), \
938 std::forward<_Args>(__args)...); \
939 }
940      _GLIBCXX_NOT_FN_CALL_OP( & )
941      _GLIBCXX_NOT_FN_CALL_OP( const & )
942      _GLIBCXX_NOT_FN_CALL_OP( && )
943      _GLIBCXX_NOT_FN_CALL_OP( const && )
944#undef _GLIBCXX_NOT_FN_CALL
945
946    private:
947      _Fn _M_fn;
948    };
949
950#if __cplusplus > 201402L
951#define __cpp_lib_not_fn 201603
952  /// [func.not_fn] Function template not_fn
953  template<typename _Fn>
954    inline auto
955    not_fn(_Fn&& __fn)
956    noexcept(std::is_nothrow_constructible<std::decay_t<_Fn>, _Fn&&>::value)
957    {
958      return _Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn), 0};
959    }
960
961  // Searchers
962#define __cpp_lib_boyer_moore_searcher 201603
963
964  template<typename _ForwardIterator1, typename _BinaryPredicate = equal_to<>>
965    class default_searcher
966    {
967    public:
968      default_searcher(_ForwardIterator1 __pat_first,
969        _ForwardIterator1 __pat_last,
970        _BinaryPredicate __pred = _BinaryPredicate())
971      : _M_m(__pat_first, __pat_last, std::move(__pred))
972      { }
973
974      template<typename _ForwardIterator2>
975        pair<_ForwardIterator2, _ForwardIterator2>
976 operator()(_ForwardIterator2 __first, _ForwardIterator2 __last) const
977 {
978   _ForwardIterator2 __first_ret =
979     std::search(__first, __last, std::get<0>(_M_m), std::get<1>(_M_m),
980 std::get<2>(_M_m));
981   auto __ret = std::make_pair(__first_ret, __first_ret);
982   if (__ret.first != __last)
983     std::advance(__ret.second, std::distance(std::get<0>(_M_m),
984      std::get<1>(_M_m)));
985   return __ret;
986 }
987
988    private:
989      tuple<_ForwardIterator1, _ForwardIterator1, _BinaryPredicate> _M_m;
990    };
991
992  template<typename _Key, typename _Tp, typename _Hash, typename _Pred>
993    struct __boyer_moore_map_base
994    {
995      template<typename _RAIter>
996 __boyer_moore_map_base(_RAIter __pat, size_t __patlen,
997        _Hash&& __hf, _Pred&& __pred)
998 : _M_bad_char{ __patlen, std::move(__hf), std::move(__pred) }
999 {
1000   if (__patlen > 0)
1001     for (__diff_type __i = 0; __i < __patlen - 1; ++__i)
1002       _M_bad_char[__pat[__i]] = __patlen - 1 - __i;
1003 }
1004
1005      using __diff_type = _Tp;
1006
1007      __diff_type
1008      _M_lookup(_Key __key, __diff_type __not_found) const
1009      {
1010 auto __iter = _M_bad_char.find(__key);
1011 if (__iter == _M_bad_char.end())
1012   return __not_found;
1013 return __iter->second;
1014      }
1015
1016      _Pred
1017      _M_pred() const { return _M_bad_char.key_eq(); }
1018
1019      _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, _Pred> _M_bad_char;
1020    };
1021
1022  template<typename _Tp, size_t _Len, typename _Pred>
1023    struct __boyer_moore_array_base
1024    {
1025      template<typename _RAIter, typename _Unused>
1026 __boyer_moore_array_base(_RAIter __pat, size_t __patlen,
1027  _Unused&&, _Pred&& __pred)
1028 : _M_bad_char{ _GLIBCXX_STD_C::array<_Tp, _Len>{}, std::move(__pred) }
1029 {
1030   std::get<0>(_M_bad_char).fill(__patlen);
1031   if (__patlen > 0)
1032     for (__diff_type __i = 0; __i < __patlen - 1; ++__i)
1033       {
1034 auto __ch = __pat[__i];
1035 using _UCh = make_unsigned_t<decltype(__ch)>;
1036 auto __uch = static_cast<_UCh>(__ch);
1037 std::get<0>(_M_bad_char)[__uch] = __patlen - 1 - __i;
1038       }
1039 }
1040
1041      using __diff_type = _Tp;
1042
1043      template<typename _Key>
1044 __diff_type
1045 _M_lookup(_Key __key, __diff_type __not_found) const
1046 {
1047   auto __ukey = static_cast<make_unsigned_t<_Key>>(__key);
1048   if (__ukey >= _Len)
1049     return __not_found;
1050   return std::get<0>(_M_bad_char)[__ukey];
1051 }
1052
1053      const _Pred&
1054      _M_pred() const { return std::get<1>(_M_bad_char); }
1055
1056      tuple<_GLIBCXX_STD_C::array<_Tp, _Len>, _Pred> _M_bad_char;
1057    };
1058
1059  template<typename _Pred>
1060    struct __is_std_equal_to : false_type { };
1061
1062  template<>
1063    struct __is_std_equal_to<equal_to<void>> : true_type { };
1064
1065  // Use __boyer_moore_array_base when pattern consists of narrow characters
1066  // and uses std::equal_to as the predicate.
1067  template<typename _RAIter, typename _Hash, typename _Pred,
1068           typename _Val = typename iterator_traits<_RAIter>::value_type,
1069    typename _Diff = typename iterator_traits<_RAIter>::difference_type>
1070    using __boyer_moore_base_t
1071      = conditional_t<sizeof(_Val) == 1 && is_integral<_Val>::value
1072       && __is_std_equal_to<_Pred>::value,
1073       __boyer_moore_array_base<_Diff, 256, _Pred>,
1074       __boyer_moore_map_base<_Val, _Diff, _Hash, _Pred>>;
1075
1076  template<typename _RAIter, typename _Hash
1077      = hash<typename iterator_traits<_RAIter>::value_type>,
1078    typename _BinaryPredicate = equal_to<>>
1079    class boyer_moore_searcher
1080    : __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate>
1081    {
1082      using _Base = __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate>;
1083      using typename _Base::__diff_type;
1084
1085    public:
1086      boyer_moore_searcher(_RAIter __pat_first, _RAIter __pat_last,
1087    _Hash __hf = _Hash(),
1088    _BinaryPredicate __pred = _BinaryPredicate());
1089
1090      template<typename _RandomAccessIterator2>
1091        pair<_RandomAccessIterator2, _RandomAccessIterator2>
1092 operator()(_RandomAccessIterator2 __first,
1093    _RandomAccessIterator2 __last) const;
1094
1095    private:
1096      bool
1097      _M_is_prefix(_RAIter __word, __diff_type __len,
1098    __diff_type __pos)
1099      {
1100 const auto& __pred = this->_M_pred();
1101 __diff_type __suffixlen = __len - __pos;
1102 for (__diff_type __i = 0; __i < __suffixlen; ++__i)
1103   if (!__pred(__word[__i], __word[__pos + __i]))
1104     return false;
1105 return true;
1106      }
1107
1108      __diff_type
1109      _M_suffix_length(_RAIter __word, __diff_type __len,
1110        __diff_type __pos)
1111      {
1112 const auto& __pred = this->_M_pred();
1113 __diff_type __i = 0;
1114 while (__pred(__word[__pos - __i], __word[__len - 1 - __i])
1115        && __i < __pos)
1116   {
1117     ++__i;
1118   }
1119 return __i;
1120      }
1121
1122      template<typename _Tp>
1123 __diff_type
1124 _M_bad_char_shift(_Tp __c) const
1125return this->_M_lookup(__c, _M_pat_end - _M_pat); }
1126
1127      _RAIter _M_pat;
1128      _RAIter _M_pat_end;
1129      _GLIBCXX_STD_C::vector<__diff_type> _M_good_suffix;
1130    };
1131
1132  template<typename _RAIter, typename _Hash
1133      = hash<typename iterator_traits<_RAIter>::value_type>,
1134    typename _BinaryPredicate = equal_to<>>
1135    class boyer_moore_horspool_searcher
1136    : __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate>
1137    {
1138      using _Base = __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate>;
1139      using typename _Base::__diff_type;
1140
1141    public:
1142      boyer_moore_horspool_searcher(_RAIter __pat,
1143     _RAIter __pat_end,
1144     _Hash __hf = _Hash(),
1145     _BinaryPredicate __pred
1146     = _BinaryPredicate())
1147      : _Base(__pat, __pat_end - __pat, std::move(__hf), std::move(__pred)),
1148 _M_pat(__pat), _M_pat_end(__pat_end)
1149      { }
1150
1151      template<typename _RandomAccessIterator2>
1152        pair<_RandomAccessIterator2, _RandomAccessIterator2>
1153 operator()(_RandomAccessIterator2 __first,
1154    _RandomAccessIterator2 __last) const
1155 {
1156   const auto& __pred = this->_M_pred();
1157   auto __patlen = _M_pat_end - _M_pat;
1158   if (__patlen == 0)
1159     return std::make_pair(__first, __first);
1160   auto __len = __last - __first;
1161   while (__len >= __patlen)
1162     {
1163       for (auto __scan = __patlen - 1;
1164    __pred(__first[__scan], _M_pat[__scan]); --__scan)
1165 if (__scan == 0)
1166   return std::make_pair(__first, __first + __patlen);
1167       auto __shift = _M_bad_char_shift(__first[__patlen - 1]);
1168       __len -= __shift;
1169       __first += __shift;
1170     }
1171   return std::make_pair(__last, __last);
1172 }
1173
1174    private:
1175      template<typename _Tp>
1176 __diff_type
1177 _M_bad_char_shift(_Tp __c) const
1178return this->_M_lookup(__c, _M_pat_end - _M_pat); }
1179
1180      _RAIter _M_pat;
1181      _RAIter _M_pat_end;
1182    };
1183
1184  template<typename _RAIter, typename _Hash, typename _BinaryPredicate>
1185    boyer_moore_searcher<_RAIter, _Hash, _BinaryPredicate>::
1186    boyer_moore_searcher(_RAIter __pat, _RAIter __pat_end,
1187  _Hash __hf, _BinaryPredicate __pred)
1188    : _Base(__pat, __pat_end - __pat, std::move(__hf), std::move(__pred)),
1189      _M_pat(__pat), _M_pat_end(__pat_end), _M_good_suffix(__pat_end - __pat)
1190    {
1191      auto __patlen = __pat_end - __pat;
1192      if (__patlen == 0)
1193 return;
1194      __diff_type __last_prefix = __patlen - 1;
1195      for (__diff_type __p = __patlen - 1; __p >= 0; --__p)
1196 {
1197   if (_M_is_prefix(__pat, __patlen, __p + 1))
1198     __last_prefix = __p + 1;
1199   _M_good_suffix[__p] = __last_prefix + (__patlen - 1 - __p);
1200 }
1201      for (__diff_type __p = 0; __p < __patlen - 1; ++__p)
1202 {
1203   auto __slen = _M_suffix_length(__pat, __patlen, __p);
1204   auto __pos = __patlen - 1 - __slen;
1205   if (!__pred(__pat[__p - __slen], __pat[__pos]))
1206     _M_good_suffix[__pos] = __patlen - 1 - __p + __slen;
1207 }
1208    }
1209
1210  template<typename _RAIter, typename _Hash, typename _BinaryPredicate>
1211  template<typename _RandomAccessIterator2>
1212    pair<_RandomAccessIterator2, _RandomAccessIterator2>
1213    boyer_moore_searcher<_RAIter, _Hash, _BinaryPredicate>::
1214    operator()(_RandomAccessIterator2 __first,
1215        _RandomAccessIterator2 __last) const
1216    {
1217      auto __patlen = _M_pat_end - _M_pat;
1218      if (__patlen == 0)
1219 return std::make_pair(__first, __first);
1220      const auto& __pred = this->_M_pred();
1221      __diff_type __i = __patlen - 1;
1222      auto __stringlen = __last - __first;
1223      while (__i < __stringlen)
1224 {
1225   __diff_type __j = __patlen - 1;
1226   while (__j >= 0 && __pred(__first[__i], _M_pat[__j]))
1227     {
1228       --__i;
1229       --__j;
1230     }
1231   if (__j < 0)
1232     {
1233       const auto __match = __first + __i + 1;
1234       return std::make_pair(__match, __match + __patlen);
1235     }
1236   __i += std::max(_M_bad_char_shift(__first[__i]),
1237   _M_good_suffix[__j]);
1238 }
1239      return std::make_pair(__last, __last);
1240    }
1241
1242#endif // C++17
1243#endif // C++14
1244
1245_GLIBCXX_END_NAMESPACE_VERSION
1246// namespace std
1247
1248#endif // C++11
1249
1250#endif // _GLIBCXX_FUNCTIONAL
1251
std::_Mem_fn_base::_M_pmf
std::_Mem_fn_base::_M_pm
std::_Mu::__call
std::_Bind::_M_f
std::_Bind::_M_bound_args
std::_Bind::__call
std::_Bind::__call_c
std::_Bind::__call_v
std::_Bind::__call_c_v
std::_Bind_result::_M_f
std::_Bind_result::_M_bound_args
std::_Bind_result::__call
std::_Bind_result::__call
std::_Bind_result::__call
std::_Bind_result::__call