xref: /aosp_15_r20/external/libcxx/include/functional (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*-
2*58b9f456SAndroid Build Coastguard Worker//===------------------------ functional ----------------------------------===//
3*58b9f456SAndroid Build Coastguard Worker//
4*58b9f456SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
5*58b9f456SAndroid Build Coastguard Worker//
6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open
7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details.
8*58b9f456SAndroid Build Coastguard Worker//
9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
10*58b9f456SAndroid Build Coastguard Worker
11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_FUNCTIONAL
12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_FUNCTIONAL
13*58b9f456SAndroid Build Coastguard Worker
14*58b9f456SAndroid Build Coastguard Worker/*
15*58b9f456SAndroid Build Coastguard Worker    functional synopsis
16*58b9f456SAndroid Build Coastguard Worker
17*58b9f456SAndroid Build Coastguard Workernamespace std
18*58b9f456SAndroid Build Coastguard Worker{
19*58b9f456SAndroid Build Coastguard Worker
20*58b9f456SAndroid Build Coastguard Workertemplate <class Arg, class Result>
21*58b9f456SAndroid Build Coastguard Workerstruct unary_function
22*58b9f456SAndroid Build Coastguard Worker{
23*58b9f456SAndroid Build Coastguard Worker    typedef Arg    argument_type;
24*58b9f456SAndroid Build Coastguard Worker    typedef Result result_type;
25*58b9f456SAndroid Build Coastguard Worker};
26*58b9f456SAndroid Build Coastguard Worker
27*58b9f456SAndroid Build Coastguard Workertemplate <class Arg1, class Arg2, class Result>
28*58b9f456SAndroid Build Coastguard Workerstruct binary_function
29*58b9f456SAndroid Build Coastguard Worker{
30*58b9f456SAndroid Build Coastguard Worker    typedef Arg1   first_argument_type;
31*58b9f456SAndroid Build Coastguard Worker    typedef Arg2   second_argument_type;
32*58b9f456SAndroid Build Coastguard Worker    typedef Result result_type;
33*58b9f456SAndroid Build Coastguard Worker};
34*58b9f456SAndroid Build Coastguard Worker
35*58b9f456SAndroid Build Coastguard Workertemplate <class T>
36*58b9f456SAndroid Build Coastguard Workerclass reference_wrapper
37*58b9f456SAndroid Build Coastguard Worker    : public unary_function<T1, R> // if wrapping a unary functor
38*58b9f456SAndroid Build Coastguard Worker    : public binary_function<T1, T2, R> // if wraping a binary functor
39*58b9f456SAndroid Build Coastguard Worker{
40*58b9f456SAndroid Build Coastguard Workerpublic:
41*58b9f456SAndroid Build Coastguard Worker    // types
42*58b9f456SAndroid Build Coastguard Worker    typedef T type;
43*58b9f456SAndroid Build Coastguard Worker    typedef see below result_type; // Not always defined
44*58b9f456SAndroid Build Coastguard Worker
45*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy
46*58b9f456SAndroid Build Coastguard Worker    reference_wrapper(T&) noexcept;
47*58b9f456SAndroid Build Coastguard Worker    reference_wrapper(T&&) = delete; // do not bind to temps
48*58b9f456SAndroid Build Coastguard Worker    reference_wrapper(const reference_wrapper<T>& x) noexcept;
49*58b9f456SAndroid Build Coastguard Worker
50*58b9f456SAndroid Build Coastguard Worker    // assignment
51*58b9f456SAndroid Build Coastguard Worker    reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
52*58b9f456SAndroid Build Coastguard Worker
53*58b9f456SAndroid Build Coastguard Worker    // access
54*58b9f456SAndroid Build Coastguard Worker    operator T& () const noexcept;
55*58b9f456SAndroid Build Coastguard Worker    T& get() const noexcept;
56*58b9f456SAndroid Build Coastguard Worker
57*58b9f456SAndroid Build Coastguard Worker    // invoke
58*58b9f456SAndroid Build Coastguard Worker    template <class... ArgTypes>
59*58b9f456SAndroid Build Coastguard Worker      typename result_of<T&(ArgTypes&&...)>::type
60*58b9f456SAndroid Build Coastguard Worker          operator() (ArgTypes&&...) const;
61*58b9f456SAndroid Build Coastguard Worker};
62*58b9f456SAndroid Build Coastguard Worker
63*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<T> ref(T& t) noexcept;
64*58b9f456SAndroid Build Coastguard Workertemplate <class T> void ref(const T&& t) = delete;
65*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
66*58b9f456SAndroid Build Coastguard Worker
67*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<const T> cref(const T& t) noexcept;
68*58b9f456SAndroid Build Coastguard Workertemplate <class T> void cref(const T&& t) = delete;
69*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
70*58b9f456SAndroid Build Coastguard Worker
71*58b9f456SAndroid Build Coastguard Workertemplate <class T> struct unwrap_reference;                                       // since C++20
72*58b9f456SAndroid Build Coastguard Workertemplate <class T> struct unwrap_ref_decay : unwrap_reference<decay_t<T>> { };    // since C++20
73*58b9f456SAndroid Build Coastguard Workertemplate <class T> using unwrap_reference_t = typename unwrap_reference<T>::type; // since C++20
74*58b9f456SAndroid Build Coastguard Workertemplate <class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; // since C++20
75*58b9f456SAndroid Build Coastguard Worker
76*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
77*58b9f456SAndroid Build Coastguard Workerstruct plus : binary_function<T, T, T>
78*58b9f456SAndroid Build Coastguard Worker{
79*58b9f456SAndroid Build Coastguard Worker    T operator()(const T& x, const T& y) const;
80*58b9f456SAndroid Build Coastguard Worker};
81*58b9f456SAndroid Build Coastguard Worker
82*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
83*58b9f456SAndroid Build Coastguard Workerstruct minus : binary_function<T, T, T>
84*58b9f456SAndroid Build Coastguard Worker{
85*58b9f456SAndroid Build Coastguard Worker    T operator()(const T& x, const T& y) const;
86*58b9f456SAndroid Build Coastguard Worker};
87*58b9f456SAndroid Build Coastguard Worker
88*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
89*58b9f456SAndroid Build Coastguard Workerstruct multiplies : binary_function<T, T, T>
90*58b9f456SAndroid Build Coastguard Worker{
91*58b9f456SAndroid Build Coastguard Worker    T operator()(const T& x, const T& y) const;
92*58b9f456SAndroid Build Coastguard Worker};
93*58b9f456SAndroid Build Coastguard Worker
94*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
95*58b9f456SAndroid Build Coastguard Workerstruct divides : binary_function<T, T, T>
96*58b9f456SAndroid Build Coastguard Worker{
97*58b9f456SAndroid Build Coastguard Worker    T operator()(const T& x, const T& y) const;
98*58b9f456SAndroid Build Coastguard Worker};
99*58b9f456SAndroid Build Coastguard Worker
100*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
101*58b9f456SAndroid Build Coastguard Workerstruct modulus : binary_function<T, T, T>
102*58b9f456SAndroid Build Coastguard Worker{
103*58b9f456SAndroid Build Coastguard Worker    T operator()(const T& x, const T& y) const;
104*58b9f456SAndroid Build Coastguard Worker};
105*58b9f456SAndroid Build Coastguard Worker
106*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
107*58b9f456SAndroid Build Coastguard Workerstruct negate : unary_function<T, T>
108*58b9f456SAndroid Build Coastguard Worker{
109*58b9f456SAndroid Build Coastguard Worker    T operator()(const T& x) const;
110*58b9f456SAndroid Build Coastguard Worker};
111*58b9f456SAndroid Build Coastguard Worker
112*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
113*58b9f456SAndroid Build Coastguard Workerstruct equal_to : binary_function<T, T, bool>
114*58b9f456SAndroid Build Coastguard Worker{
115*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
116*58b9f456SAndroid Build Coastguard Worker};
117*58b9f456SAndroid Build Coastguard Worker
118*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
119*58b9f456SAndroid Build Coastguard Workerstruct not_equal_to : binary_function<T, T, bool>
120*58b9f456SAndroid Build Coastguard Worker{
121*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
122*58b9f456SAndroid Build Coastguard Worker};
123*58b9f456SAndroid Build Coastguard Worker
124*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
125*58b9f456SAndroid Build Coastguard Workerstruct greater : binary_function<T, T, bool>
126*58b9f456SAndroid Build Coastguard Worker{
127*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
128*58b9f456SAndroid Build Coastguard Worker};
129*58b9f456SAndroid Build Coastguard Worker
130*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
131*58b9f456SAndroid Build Coastguard Workerstruct less : binary_function<T, T, bool>
132*58b9f456SAndroid Build Coastguard Worker{
133*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
134*58b9f456SAndroid Build Coastguard Worker};
135*58b9f456SAndroid Build Coastguard Worker
136*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
137*58b9f456SAndroid Build Coastguard Workerstruct greater_equal : binary_function<T, T, bool>
138*58b9f456SAndroid Build Coastguard Worker{
139*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
140*58b9f456SAndroid Build Coastguard Worker};
141*58b9f456SAndroid Build Coastguard Worker
142*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
143*58b9f456SAndroid Build Coastguard Workerstruct less_equal : binary_function<T, T, bool>
144*58b9f456SAndroid Build Coastguard Worker{
145*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
146*58b9f456SAndroid Build Coastguard Worker};
147*58b9f456SAndroid Build Coastguard Worker
148*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
149*58b9f456SAndroid Build Coastguard Workerstruct logical_and : binary_function<T, T, bool>
150*58b9f456SAndroid Build Coastguard Worker{
151*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
152*58b9f456SAndroid Build Coastguard Worker};
153*58b9f456SAndroid Build Coastguard Worker
154*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
155*58b9f456SAndroid Build Coastguard Workerstruct logical_or : binary_function<T, T, bool>
156*58b9f456SAndroid Build Coastguard Worker{
157*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
158*58b9f456SAndroid Build Coastguard Worker};
159*58b9f456SAndroid Build Coastguard Worker
160*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
161*58b9f456SAndroid Build Coastguard Workerstruct logical_not : unary_function<T, bool>
162*58b9f456SAndroid Build Coastguard Worker{
163*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x) const;
164*58b9f456SAndroid Build Coastguard Worker};
165*58b9f456SAndroid Build Coastguard Worker
166*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
167*58b9f456SAndroid Build Coastguard Workerstruct bit_and : unary_function<T, bool>
168*58b9f456SAndroid Build Coastguard Worker{
169*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
170*58b9f456SAndroid Build Coastguard Worker};
171*58b9f456SAndroid Build Coastguard Worker
172*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
173*58b9f456SAndroid Build Coastguard Workerstruct bit_or : unary_function<T, bool>
174*58b9f456SAndroid Build Coastguard Worker{
175*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
176*58b9f456SAndroid Build Coastguard Worker};
177*58b9f456SAndroid Build Coastguard Worker
178*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14
179*58b9f456SAndroid Build Coastguard Workerstruct bit_xor : unary_function<T, bool>
180*58b9f456SAndroid Build Coastguard Worker{
181*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x, const T& y) const;
182*58b9f456SAndroid Build Coastguard Worker};
183*58b9f456SAndroid Build Coastguard Worker
184*58b9f456SAndroid Build Coastguard Workertemplate <class T=void> // C++14
185*58b9f456SAndroid Build Coastguard Workerstruct bit_xor : unary_function<T, bool>
186*58b9f456SAndroid Build Coastguard Worker{
187*58b9f456SAndroid Build Coastguard Worker    bool operator()(const T& x) const;
188*58b9f456SAndroid Build Coastguard Worker};
189*58b9f456SAndroid Build Coastguard Worker
190*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate>
191*58b9f456SAndroid Build Coastguard Workerclass unary_negate // deprecated in C++17
192*58b9f456SAndroid Build Coastguard Worker    : public unary_function<typename Predicate::argument_type, bool>
193*58b9f456SAndroid Build Coastguard Worker{
194*58b9f456SAndroid Build Coastguard Workerpublic:
195*58b9f456SAndroid Build Coastguard Worker    explicit unary_negate(const Predicate& pred);
196*58b9f456SAndroid Build Coastguard Worker    bool operator()(const typename Predicate::argument_type& x) const;
197*58b9f456SAndroid Build Coastguard Worker};
198*58b9f456SAndroid Build Coastguard Worker
199*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate> // deprecated in C++17
200*58b9f456SAndroid Build Coastguard Workerunary_negate<Predicate> not1(const Predicate& pred);
201*58b9f456SAndroid Build Coastguard Worker
202*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate>
203*58b9f456SAndroid Build Coastguard Workerclass binary_negate // deprecated in C++17
204*58b9f456SAndroid Build Coastguard Worker    : public binary_function<typename Predicate::first_argument_type,
205*58b9f456SAndroid Build Coastguard Worker                             typename Predicate::second_argument_type,
206*58b9f456SAndroid Build Coastguard Worker                             bool>
207*58b9f456SAndroid Build Coastguard Worker{
208*58b9f456SAndroid Build Coastguard Workerpublic:
209*58b9f456SAndroid Build Coastguard Worker    explicit binary_negate(const Predicate& pred);
210*58b9f456SAndroid Build Coastguard Worker    bool operator()(const typename Predicate::first_argument_type& x,
211*58b9f456SAndroid Build Coastguard Worker                    const typename Predicate::second_argument_type& y) const;
212*58b9f456SAndroid Build Coastguard Worker};
213*58b9f456SAndroid Build Coastguard Worker
214*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate> // deprecated in C++17
215*58b9f456SAndroid Build Coastguard Workerbinary_negate<Predicate> not2(const Predicate& pred);
216*58b9f456SAndroid Build Coastguard Worker
217*58b9f456SAndroid Build Coastguard Workertemplate <class F> unspecified not_fn(F&& f); // C++17
218*58b9f456SAndroid Build Coastguard Worker
219*58b9f456SAndroid Build Coastguard Workertemplate<class T> struct is_bind_expression;
220*58b9f456SAndroid Build Coastguard Workertemplate<class T> struct is_placeholder;
221*58b9f456SAndroid Build Coastguard Worker
222*58b9f456SAndroid Build Coastguard Worker    // See C++14 20.9.9, Function object binders
223*58b9f456SAndroid Build Coastguard Workertemplate <class T> inline constexpr bool is_bind_expression_v
224*58b9f456SAndroid Build Coastguard Worker  = is_bind_expression<T>::value; // C++17
225*58b9f456SAndroid Build Coastguard Workertemplate <class T> inline constexpr int is_placeholder_v
226*58b9f456SAndroid Build Coastguard Worker  = is_placeholder<T>::value; // C++17
227*58b9f456SAndroid Build Coastguard Worker
228*58b9f456SAndroid Build Coastguard Worker
229*58b9f456SAndroid Build Coastguard Workertemplate<class Fn, class... BoundArgs>
230*58b9f456SAndroid Build Coastguard Worker  unspecified bind(Fn&&, BoundArgs&&...);
231*58b9f456SAndroid Build Coastguard Workertemplate<class R, class Fn, class... BoundArgs>
232*58b9f456SAndroid Build Coastguard Worker  unspecified bind(Fn&&, BoundArgs&&...);
233*58b9f456SAndroid Build Coastguard Worker
234*58b9f456SAndroid Build Coastguard Workernamespace placeholders {
235*58b9f456SAndroid Build Coastguard Worker  // M is the implementation-defined number of placeholders
236*58b9f456SAndroid Build Coastguard Worker  extern unspecified _1;
237*58b9f456SAndroid Build Coastguard Worker  extern unspecified _2;
238*58b9f456SAndroid Build Coastguard Worker  .
239*58b9f456SAndroid Build Coastguard Worker  .
240*58b9f456SAndroid Build Coastguard Worker  .
241*58b9f456SAndroid Build Coastguard Worker  extern unspecified _Mp;
242*58b9f456SAndroid Build Coastguard Worker}
243*58b9f456SAndroid Build Coastguard Worker
244*58b9f456SAndroid Build Coastguard Workertemplate <class Operation>
245*58b9f456SAndroid Build Coastguard Workerclass binder1st     // deprecated in C++11, removed in C++17
246*58b9f456SAndroid Build Coastguard Worker    : public unary_function<typename Operation::second_argument_type,
247*58b9f456SAndroid Build Coastguard Worker                            typename Operation::result_type>
248*58b9f456SAndroid Build Coastguard Worker{
249*58b9f456SAndroid Build Coastguard Workerprotected:
250*58b9f456SAndroid Build Coastguard Worker    Operation                               op;
251*58b9f456SAndroid Build Coastguard Worker    typename Operation::first_argument_type value;
252*58b9f456SAndroid Build Coastguard Workerpublic:
253*58b9f456SAndroid Build Coastguard Worker    binder1st(const Operation& x, const typename Operation::first_argument_type y);
254*58b9f456SAndroid Build Coastguard Worker    typename Operation::result_type operator()(      typename Operation::second_argument_type& x) const;
255*58b9f456SAndroid Build Coastguard Worker    typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const;
256*58b9f456SAndroid Build Coastguard Worker};
257*58b9f456SAndroid Build Coastguard Worker
258*58b9f456SAndroid Build Coastguard Workertemplate <class Operation, class T>
259*58b9f456SAndroid Build Coastguard Workerbinder1st<Operation> bind1st(const Operation& op, const T& x);  // deprecated in C++11, removed in C++17
260*58b9f456SAndroid Build Coastguard Worker
261*58b9f456SAndroid Build Coastguard Workertemplate <class Operation>
262*58b9f456SAndroid Build Coastguard Workerclass binder2nd     // deprecated in C++11, removed in C++17
263*58b9f456SAndroid Build Coastguard Worker    : public unary_function<typename Operation::first_argument_type,
264*58b9f456SAndroid Build Coastguard Worker                            typename Operation::result_type>
265*58b9f456SAndroid Build Coastguard Worker{
266*58b9f456SAndroid Build Coastguard Workerprotected:
267*58b9f456SAndroid Build Coastguard Worker    Operation                                op;
268*58b9f456SAndroid Build Coastguard Worker    typename Operation::second_argument_type value;
269*58b9f456SAndroid Build Coastguard Workerpublic:
270*58b9f456SAndroid Build Coastguard Worker    binder2nd(const Operation& x, const typename Operation::second_argument_type y);
271*58b9f456SAndroid Build Coastguard Worker    typename Operation::result_type operator()(      typename Operation::first_argument_type& x) const;
272*58b9f456SAndroid Build Coastguard Worker    typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const;
273*58b9f456SAndroid Build Coastguard Worker};
274*58b9f456SAndroid Build Coastguard Worker
275*58b9f456SAndroid Build Coastguard Workertemplate <class Operation, class T>
276*58b9f456SAndroid Build Coastguard Workerbinder2nd<Operation> bind2nd(const Operation& op, const T& x);  // deprecated in C++11, removed in C++17
277*58b9f456SAndroid Build Coastguard Worker
278*58b9f456SAndroid Build Coastguard Workertemplate <class Arg, class Result>      // deprecated in C++11, removed in C++17
279*58b9f456SAndroid Build Coastguard Workerclass pointer_to_unary_function : public unary_function<Arg, Result>
280*58b9f456SAndroid Build Coastguard Worker{
281*58b9f456SAndroid Build Coastguard Workerpublic:
282*58b9f456SAndroid Build Coastguard Worker    explicit pointer_to_unary_function(Result (*f)(Arg));
283*58b9f456SAndroid Build Coastguard Worker    Result operator()(Arg x) const;
284*58b9f456SAndroid Build Coastguard Worker};
285*58b9f456SAndroid Build Coastguard Worker
286*58b9f456SAndroid Build Coastguard Workertemplate <class Arg, class Result>
287*58b9f456SAndroid Build Coastguard Workerpointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg));      // deprecated in C++11, removed in C++17
288*58b9f456SAndroid Build Coastguard Worker
289*58b9f456SAndroid Build Coastguard Workertemplate <class Arg1, class Arg2, class Result>      // deprecated in C++11, removed in C++17
290*58b9f456SAndroid Build Coastguard Workerclass pointer_to_binary_function : public binary_function<Arg1, Arg2, Result>
291*58b9f456SAndroid Build Coastguard Worker{
292*58b9f456SAndroid Build Coastguard Workerpublic:
293*58b9f456SAndroid Build Coastguard Worker    explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
294*58b9f456SAndroid Build Coastguard Worker    Result operator()(Arg1 x, Arg2 y) const;
295*58b9f456SAndroid Build Coastguard Worker};
296*58b9f456SAndroid Build Coastguard Worker
297*58b9f456SAndroid Build Coastguard Workertemplate <class Arg1, class Arg2, class Result>
298*58b9f456SAndroid Build Coastguard Workerpointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2));      // deprecated in C++11, removed in C++17
299*58b9f456SAndroid Build Coastguard Worker
300*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T>      // deprecated in C++11, removed in C++17
301*58b9f456SAndroid Build Coastguard Workerclass mem_fun_t : public unary_function<T*, S>
302*58b9f456SAndroid Build Coastguard Worker{
303*58b9f456SAndroid Build Coastguard Workerpublic:
304*58b9f456SAndroid Build Coastguard Worker    explicit mem_fun_t(S (T::*p)());
305*58b9f456SAndroid Build Coastguard Worker    S operator()(T* p) const;
306*58b9f456SAndroid Build Coastguard Worker};
307*58b9f456SAndroid Build Coastguard Worker
308*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T, class A>
309*58b9f456SAndroid Build Coastguard Workerclass mem_fun1_t : public binary_function<T*, A, S>      // deprecated in C++11, removed in C++17
310*58b9f456SAndroid Build Coastguard Worker{
311*58b9f456SAndroid Build Coastguard Workerpublic:
312*58b9f456SAndroid Build Coastguard Worker    explicit mem_fun1_t(S (T::*p)(A));
313*58b9f456SAndroid Build Coastguard Worker    S operator()(T* p, A x) const;
314*58b9f456SAndroid Build Coastguard Worker};
315*58b9f456SAndroid Build Coastguard Worker
316*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T>          mem_fun_t<S,T>    mem_fun(S (T::*f)());      // deprecated in C++11, removed in C++17
317*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T, class A> mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A));     // deprecated in C++11, removed in C++17
318*58b9f456SAndroid Build Coastguard Worker
319*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T>
320*58b9f456SAndroid Build Coastguard Workerclass mem_fun_ref_t : public unary_function<T, S>      // deprecated in C++11, removed in C++17
321*58b9f456SAndroid Build Coastguard Worker{
322*58b9f456SAndroid Build Coastguard Workerpublic:
323*58b9f456SAndroid Build Coastguard Worker    explicit mem_fun_ref_t(S (T::*p)());
324*58b9f456SAndroid Build Coastguard Worker    S operator()(T& p) const;
325*58b9f456SAndroid Build Coastguard Worker};
326*58b9f456SAndroid Build Coastguard Worker
327*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T, class A>
328*58b9f456SAndroid Build Coastguard Workerclass mem_fun1_ref_t : public binary_function<T, A, S>      // deprecated in C++11, removed in C++17
329*58b9f456SAndroid Build Coastguard Worker{
330*58b9f456SAndroid Build Coastguard Workerpublic:
331*58b9f456SAndroid Build Coastguard Worker    explicit mem_fun1_ref_t(S (T::*p)(A));
332*58b9f456SAndroid Build Coastguard Worker    S operator()(T& p, A x) const;
333*58b9f456SAndroid Build Coastguard Worker};
334*58b9f456SAndroid Build Coastguard Worker
335*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T>          mem_fun_ref_t<S,T>    mem_fun_ref(S (T::*f)());      // deprecated in C++11, removed in C++17
336*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A));     // deprecated in C++11, removed in C++17
337*58b9f456SAndroid Build Coastguard Worker
338*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T>
339*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun_t : public unary_function<const T*, S>      // deprecated in C++11, removed in C++17
340*58b9f456SAndroid Build Coastguard Worker{
341*58b9f456SAndroid Build Coastguard Workerpublic:
342*58b9f456SAndroid Build Coastguard Worker    explicit const_mem_fun_t(S (T::*p)() const);
343*58b9f456SAndroid Build Coastguard Worker    S operator()(const T* p) const;
344*58b9f456SAndroid Build Coastguard Worker};
345*58b9f456SAndroid Build Coastguard Worker
346*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T, class A>
347*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun1_t : public binary_function<const T*, A, S>      // deprecated in C++11, removed in C++17
348*58b9f456SAndroid Build Coastguard Worker{
349*58b9f456SAndroid Build Coastguard Workerpublic:
350*58b9f456SAndroid Build Coastguard Worker    explicit const_mem_fun1_t(S (T::*p)(A) const);
351*58b9f456SAndroid Build Coastguard Worker    S operator()(const T* p, A x) const;
352*58b9f456SAndroid Build Coastguard Worker};
353*58b9f456SAndroid Build Coastguard Worker
354*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T>          const_mem_fun_t<S,T>    mem_fun(S (T::*f)() const);      // deprecated in C++11, removed in C++17
355*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T, class A> const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const);     // deprecated in C++11, removed in C++17
356*58b9f456SAndroid Build Coastguard Worker
357*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T>
358*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun_ref_t : public unary_function<T, S>      // deprecated in C++11, removed in C++17
359*58b9f456SAndroid Build Coastguard Worker{
360*58b9f456SAndroid Build Coastguard Workerpublic:
361*58b9f456SAndroid Build Coastguard Worker    explicit const_mem_fun_ref_t(S (T::*p)() const);
362*58b9f456SAndroid Build Coastguard Worker    S operator()(const T& p) const;
363*58b9f456SAndroid Build Coastguard Worker};
364*58b9f456SAndroid Build Coastguard Worker
365*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T, class A>
366*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun1_ref_t : public binary_function<T, A, S>      // deprecated in C++11, removed in C++17
367*58b9f456SAndroid Build Coastguard Worker{
368*58b9f456SAndroid Build Coastguard Workerpublic:
369*58b9f456SAndroid Build Coastguard Worker    explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
370*58b9f456SAndroid Build Coastguard Worker    S operator()(const T& p, A x) const;
371*58b9f456SAndroid Build Coastguard Worker};
372*58b9f456SAndroid Build Coastguard Worker
373*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T>          const_mem_fun_ref_t<S,T>    mem_fun_ref(S (T::*f)() const);   // deprecated in C++11, removed in C++17
374*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T, class A> const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const);  // deprecated in C++11, removed in C++17
375*58b9f456SAndroid Build Coastguard Worker
376*58b9f456SAndroid Build Coastguard Workertemplate<class R, class T> unspecified mem_fn(R T::*);
377*58b9f456SAndroid Build Coastguard Worker
378*58b9f456SAndroid Build Coastguard Workerclass bad_function_call
379*58b9f456SAndroid Build Coastguard Worker    : public exception
380*58b9f456SAndroid Build Coastguard Worker{
381*58b9f456SAndroid Build Coastguard Worker};
382*58b9f456SAndroid Build Coastguard Worker
383*58b9f456SAndroid Build Coastguard Workertemplate<class> class function; // undefined
384*58b9f456SAndroid Build Coastguard Worker
385*58b9f456SAndroid Build Coastguard Workertemplate<class R, class... ArgTypes>
386*58b9f456SAndroid Build Coastguard Workerclass function<R(ArgTypes...)>
387*58b9f456SAndroid Build Coastguard Worker  : public unary_function<T1, R>      // iff sizeof...(ArgTypes) == 1 and
388*58b9f456SAndroid Build Coastguard Worker                                      // ArgTypes contains T1
389*58b9f456SAndroid Build Coastguard Worker  : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and
390*58b9f456SAndroid Build Coastguard Worker                                      // ArgTypes contains T1 and T2
391*58b9f456SAndroid Build Coastguard Worker{
392*58b9f456SAndroid Build Coastguard Workerpublic:
393*58b9f456SAndroid Build Coastguard Worker    typedef R result_type;
394*58b9f456SAndroid Build Coastguard Worker
395*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy:
396*58b9f456SAndroid Build Coastguard Worker    function() noexcept;
397*58b9f456SAndroid Build Coastguard Worker    function(nullptr_t) noexcept;
398*58b9f456SAndroid Build Coastguard Worker    function(const function&);
399*58b9f456SAndroid Build Coastguard Worker    function(function&&) noexcept;
400*58b9f456SAndroid Build Coastguard Worker    template<class F>
401*58b9f456SAndroid Build Coastguard Worker      function(F);
402*58b9f456SAndroid Build Coastguard Worker    template<Allocator Alloc>
403*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const Alloc&) noexcept;            // removed in C++17
404*58b9f456SAndroid Build Coastguard Worker    template<Allocator Alloc>
405*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17
406*58b9f456SAndroid Build Coastguard Worker    template<Allocator Alloc>
407*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const Alloc&, const function&);    // removed in C++17
408*58b9f456SAndroid Build Coastguard Worker    template<Allocator Alloc>
409*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const Alloc&, function&&);         // removed in C++17
410*58b9f456SAndroid Build Coastguard Worker    template<class F, Allocator Alloc>
411*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const Alloc&, F);                  // removed in C++17
412*58b9f456SAndroid Build Coastguard Worker
413*58b9f456SAndroid Build Coastguard Worker    function& operator=(const function&);
414*58b9f456SAndroid Build Coastguard Worker    function& operator=(function&&) noexcept;
415*58b9f456SAndroid Build Coastguard Worker    function& operator=(nullptr_t) noexcept;
416*58b9f456SAndroid Build Coastguard Worker    template<class F>
417*58b9f456SAndroid Build Coastguard Worker      function& operator=(F&&);
418*58b9f456SAndroid Build Coastguard Worker    template<class F>
419*58b9f456SAndroid Build Coastguard Worker      function& operator=(reference_wrapper<F>) noexcept;
420*58b9f456SAndroid Build Coastguard Worker
421*58b9f456SAndroid Build Coastguard Worker    ~function();
422*58b9f456SAndroid Build Coastguard Worker
423*58b9f456SAndroid Build Coastguard Worker    // function modifiers:
424*58b9f456SAndroid Build Coastguard Worker    void swap(function&) noexcept;
425*58b9f456SAndroid Build Coastguard Worker    template<class F, class Alloc>
426*58b9f456SAndroid Build Coastguard Worker      void assign(F&&, const Alloc&);                 // Removed in C++17
427*58b9f456SAndroid Build Coastguard Worker
428*58b9f456SAndroid Build Coastguard Worker    // function capacity:
429*58b9f456SAndroid Build Coastguard Worker    explicit operator bool() const noexcept;
430*58b9f456SAndroid Build Coastguard Worker
431*58b9f456SAndroid Build Coastguard Worker    // function invocation:
432*58b9f456SAndroid Build Coastguard Worker    R operator()(ArgTypes...) const;
433*58b9f456SAndroid Build Coastguard Worker
434*58b9f456SAndroid Build Coastguard Worker    // function target access:
435*58b9f456SAndroid Build Coastguard Worker    const std::type_info& target_type() const noexcept;
436*58b9f456SAndroid Build Coastguard Worker    template <typename T>       T* target() noexcept;
437*58b9f456SAndroid Build Coastguard Worker    template <typename T> const T* target() const noexcept;
438*58b9f456SAndroid Build Coastguard Worker};
439*58b9f456SAndroid Build Coastguard Worker
440*58b9f456SAndroid Build Coastguard Worker// Null pointer comparisons:
441*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes>
442*58b9f456SAndroid Build Coastguard Worker  bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
443*58b9f456SAndroid Build Coastguard Worker
444*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes>
445*58b9f456SAndroid Build Coastguard Worker  bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
446*58b9f456SAndroid Build Coastguard Worker
447*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes>
448*58b9f456SAndroid Build Coastguard Worker  bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
449*58b9f456SAndroid Build Coastguard Worker
450*58b9f456SAndroid Build Coastguard Workertemplate <class  R, class ... ArgTypes>
451*58b9f456SAndroid Build Coastguard Worker  bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
452*58b9f456SAndroid Build Coastguard Worker
453*58b9f456SAndroid Build Coastguard Worker// specialized algorithms:
454*58b9f456SAndroid Build Coastguard Workertemplate <class  R, class ... ArgTypes>
455*58b9f456SAndroid Build Coastguard Worker  void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
456*58b9f456SAndroid Build Coastguard Worker
457*58b9f456SAndroid Build Coastguard Workertemplate <class T> struct hash;
458*58b9f456SAndroid Build Coastguard Worker
459*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<bool>;
460*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<char>;
461*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<signed char>;
462*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned char>;
463*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<char16_t>;
464*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<char32_t>;
465*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<wchar_t>;
466*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<short>;
467*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned short>;
468*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<int>;
469*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned int>;
470*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<long>;
471*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<long long>;
472*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned long>;
473*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned long long>;
474*58b9f456SAndroid Build Coastguard Worker
475*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<float>;
476*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<double>;
477*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<long double>;
478*58b9f456SAndroid Build Coastguard Worker
479*58b9f456SAndroid Build Coastguard Workertemplate<class T> struct hash<T*>;
480*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<nullptr_t>;  // C++17
481*58b9f456SAndroid Build Coastguard Worker
482*58b9f456SAndroid Build Coastguard Worker}  // std
483*58b9f456SAndroid Build Coastguard Worker
484*58b9f456SAndroid Build Coastguard WorkerPOLICY:  For non-variadic implementations, the number of arguments is limited
485*58b9f456SAndroid Build Coastguard Worker         to 3.  It is hoped that the need for non-variadic implementations
486*58b9f456SAndroid Build Coastguard Worker         will be minimal.
487*58b9f456SAndroid Build Coastguard Worker
488*58b9f456SAndroid Build Coastguard Worker*/
489*58b9f456SAndroid Build Coastguard Worker
490*58b9f456SAndroid Build Coastguard Worker#include <__config>
491*58b9f456SAndroid Build Coastguard Worker#include <type_traits>
492*58b9f456SAndroid Build Coastguard Worker#include <typeinfo>
493*58b9f456SAndroid Build Coastguard Worker#include <exception>
494*58b9f456SAndroid Build Coastguard Worker#include <memory>
495*58b9f456SAndroid Build Coastguard Worker#include <tuple>
496*58b9f456SAndroid Build Coastguard Worker#include <utility>
497*58b9f456SAndroid Build Coastguard Worker#include <version>
498*58b9f456SAndroid Build Coastguard Worker
499*58b9f456SAndroid Build Coastguard Worker#include <__functional_base>
500*58b9f456SAndroid Build Coastguard Worker
501*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
502*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header
503*58b9f456SAndroid Build Coastguard Worker#endif
504*58b9f456SAndroid Build Coastguard Worker
505*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD
506*58b9f456SAndroid Build Coastguard Worker
507*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
508*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
509*58b9f456SAndroid Build Coastguard Worker#else
510*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
511*58b9f456SAndroid Build Coastguard Worker#endif
512*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS plus : binary_function<_Tp, _Tp, _Tp>
513*58b9f456SAndroid Build Coastguard Worker{
514*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
515*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
516*58b9f456SAndroid Build Coastguard Worker        {return __x + __y;}
517*58b9f456SAndroid Build Coastguard Worker};
518*58b9f456SAndroid Build Coastguard Worker
519*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
520*58b9f456SAndroid Build Coastguard Workertemplate <>
521*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS plus<void>
522*58b9f456SAndroid Build Coastguard Worker{
523*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
524*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
525*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
526*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
527*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
528*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
529*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
530*58b9f456SAndroid Build Coastguard Worker};
531*58b9f456SAndroid Build Coastguard Worker#endif
532*58b9f456SAndroid Build Coastguard Worker
533*58b9f456SAndroid Build Coastguard Worker
534*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
535*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
536*58b9f456SAndroid Build Coastguard Worker#else
537*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
538*58b9f456SAndroid Build Coastguard Worker#endif
539*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS minus : binary_function<_Tp, _Tp, _Tp>
540*58b9f456SAndroid Build Coastguard Worker{
541*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
542*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
543*58b9f456SAndroid Build Coastguard Worker        {return __x - __y;}
544*58b9f456SAndroid Build Coastguard Worker};
545*58b9f456SAndroid Build Coastguard Worker
546*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
547*58b9f456SAndroid Build Coastguard Workertemplate <>
548*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS minus<void>
549*58b9f456SAndroid Build Coastguard Worker{
550*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
551*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
552*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
553*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)))
554*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))
555*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); }
556*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
557*58b9f456SAndroid Build Coastguard Worker};
558*58b9f456SAndroid Build Coastguard Worker#endif
559*58b9f456SAndroid Build Coastguard Worker
560*58b9f456SAndroid Build Coastguard Worker
561*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
562*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
563*58b9f456SAndroid Build Coastguard Worker#else
564*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
565*58b9f456SAndroid Build Coastguard Worker#endif
566*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS multiplies : binary_function<_Tp, _Tp, _Tp>
567*58b9f456SAndroid Build Coastguard Worker{
568*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
569*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
570*58b9f456SAndroid Build Coastguard Worker        {return __x * __y;}
571*58b9f456SAndroid Build Coastguard Worker};
572*58b9f456SAndroid Build Coastguard Worker
573*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
574*58b9f456SAndroid Build Coastguard Workertemplate <>
575*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS multiplies<void>
576*58b9f456SAndroid Build Coastguard Worker{
577*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
578*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
579*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
580*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)))
581*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))
582*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); }
583*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
584*58b9f456SAndroid Build Coastguard Worker};
585*58b9f456SAndroid Build Coastguard Worker#endif
586*58b9f456SAndroid Build Coastguard Worker
587*58b9f456SAndroid Build Coastguard Worker
588*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
589*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
590*58b9f456SAndroid Build Coastguard Worker#else
591*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
592*58b9f456SAndroid Build Coastguard Worker#endif
593*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS divides : binary_function<_Tp, _Tp, _Tp>
594*58b9f456SAndroid Build Coastguard Worker{
595*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
596*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
597*58b9f456SAndroid Build Coastguard Worker        {return __x / __y;}
598*58b9f456SAndroid Build Coastguard Worker};
599*58b9f456SAndroid Build Coastguard Worker
600*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
601*58b9f456SAndroid Build Coastguard Workertemplate <>
602*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS divides<void>
603*58b9f456SAndroid Build Coastguard Worker{
604*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
605*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
606*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
607*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)))
608*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))
609*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); }
610*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
611*58b9f456SAndroid Build Coastguard Worker};
612*58b9f456SAndroid Build Coastguard Worker#endif
613*58b9f456SAndroid Build Coastguard Worker
614*58b9f456SAndroid Build Coastguard Worker
615*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
616*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
617*58b9f456SAndroid Build Coastguard Worker#else
618*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
619*58b9f456SAndroid Build Coastguard Worker#endif
620*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS modulus : binary_function<_Tp, _Tp, _Tp>
621*58b9f456SAndroid Build Coastguard Worker{
622*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
623*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
624*58b9f456SAndroid Build Coastguard Worker        {return __x % __y;}
625*58b9f456SAndroid Build Coastguard Worker};
626*58b9f456SAndroid Build Coastguard Worker
627*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
628*58b9f456SAndroid Build Coastguard Workertemplate <>
629*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS modulus<void>
630*58b9f456SAndroid Build Coastguard Worker{
631*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
632*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
633*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
634*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)))
635*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))
636*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); }
637*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
638*58b9f456SAndroid Build Coastguard Worker};
639*58b9f456SAndroid Build Coastguard Worker#endif
640*58b9f456SAndroid Build Coastguard Worker
641*58b9f456SAndroid Build Coastguard Worker
642*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
643*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
644*58b9f456SAndroid Build Coastguard Worker#else
645*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
646*58b9f456SAndroid Build Coastguard Worker#endif
647*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS negate : unary_function<_Tp, _Tp>
648*58b9f456SAndroid Build Coastguard Worker{
649*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
650*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x) const
651*58b9f456SAndroid Build Coastguard Worker        {return -__x;}
652*58b9f456SAndroid Build Coastguard Worker};
653*58b9f456SAndroid Build Coastguard Worker
654*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
655*58b9f456SAndroid Build Coastguard Workertemplate <>
656*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS negate<void>
657*58b9f456SAndroid Build Coastguard Worker{
658*58b9f456SAndroid Build Coastguard Worker    template <class _Tp>
659*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
660*58b9f456SAndroid Build Coastguard Worker    auto operator()(_Tp&& __x) const
661*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x)))
662*58b9f456SAndroid Build Coastguard Worker    -> decltype        (- _VSTD::forward<_Tp>(__x))
663*58b9f456SAndroid Build Coastguard Worker        { return        - _VSTD::forward<_Tp>(__x); }
664*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
665*58b9f456SAndroid Build Coastguard Worker};
666*58b9f456SAndroid Build Coastguard Worker#endif
667*58b9f456SAndroid Build Coastguard Worker
668*58b9f456SAndroid Build Coastguard Worker
669*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
670*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
671*58b9f456SAndroid Build Coastguard Worker#else
672*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
673*58b9f456SAndroid Build Coastguard Worker#endif
674*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS equal_to : binary_function<_Tp, _Tp, bool>
675*58b9f456SAndroid Build Coastguard Worker{
676*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
677*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
678*58b9f456SAndroid Build Coastguard Worker        {return __x == __y;}
679*58b9f456SAndroid Build Coastguard Worker};
680*58b9f456SAndroid Build Coastguard Worker
681*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
682*58b9f456SAndroid Build Coastguard Workertemplate <>
683*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS equal_to<void>
684*58b9f456SAndroid Build Coastguard Worker{
685*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
686*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
687*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
688*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)))
689*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))
690*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); }
691*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
692*58b9f456SAndroid Build Coastguard Worker};
693*58b9f456SAndroid Build Coastguard Worker#endif
694*58b9f456SAndroid Build Coastguard Worker
695*58b9f456SAndroid Build Coastguard Worker
696*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
697*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
698*58b9f456SAndroid Build Coastguard Worker#else
699*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
700*58b9f456SAndroid Build Coastguard Worker#endif
701*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS not_equal_to : binary_function<_Tp, _Tp, bool>
702*58b9f456SAndroid Build Coastguard Worker{
703*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
704*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
705*58b9f456SAndroid Build Coastguard Worker        {return __x != __y;}
706*58b9f456SAndroid Build Coastguard Worker};
707*58b9f456SAndroid Build Coastguard Worker
708*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
709*58b9f456SAndroid Build Coastguard Workertemplate <>
710*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS not_equal_to<void>
711*58b9f456SAndroid Build Coastguard Worker{
712*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
713*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
714*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
715*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)))
716*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))
717*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); }
718*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
719*58b9f456SAndroid Build Coastguard Worker};
720*58b9f456SAndroid Build Coastguard Worker#endif
721*58b9f456SAndroid Build Coastguard Worker
722*58b9f456SAndroid Build Coastguard Worker
723*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
724*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
725*58b9f456SAndroid Build Coastguard Worker#else
726*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
727*58b9f456SAndroid Build Coastguard Worker#endif
728*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool>
729*58b9f456SAndroid Build Coastguard Worker{
730*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
731*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
732*58b9f456SAndroid Build Coastguard Worker        {return __x > __y;}
733*58b9f456SAndroid Build Coastguard Worker};
734*58b9f456SAndroid Build Coastguard Worker
735*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
736*58b9f456SAndroid Build Coastguard Workertemplate <>
737*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater<void>
738*58b9f456SAndroid Build Coastguard Worker{
739*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
740*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
741*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
742*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)))
743*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))
744*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); }
745*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
746*58b9f456SAndroid Build Coastguard Worker};
747*58b9f456SAndroid Build Coastguard Worker#endif
748*58b9f456SAndroid Build Coastguard Worker
749*58b9f456SAndroid Build Coastguard Worker
750*58b9f456SAndroid Build Coastguard Worker// less in <__functional_base>
751*58b9f456SAndroid Build Coastguard Worker
752*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
753*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
754*58b9f456SAndroid Build Coastguard Worker#else
755*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
756*58b9f456SAndroid Build Coastguard Worker#endif
757*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater_equal : binary_function<_Tp, _Tp, bool>
758*58b9f456SAndroid Build Coastguard Worker{
759*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
760*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
761*58b9f456SAndroid Build Coastguard Worker        {return __x >= __y;}
762*58b9f456SAndroid Build Coastguard Worker};
763*58b9f456SAndroid Build Coastguard Worker
764*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
765*58b9f456SAndroid Build Coastguard Workertemplate <>
766*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater_equal<void>
767*58b9f456SAndroid Build Coastguard Worker{
768*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
769*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
770*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
771*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)))
772*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))
773*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); }
774*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
775*58b9f456SAndroid Build Coastguard Worker};
776*58b9f456SAndroid Build Coastguard Worker#endif
777*58b9f456SAndroid Build Coastguard Worker
778*58b9f456SAndroid Build Coastguard Worker
779*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
780*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
781*58b9f456SAndroid Build Coastguard Worker#else
782*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
783*58b9f456SAndroid Build Coastguard Worker#endif
784*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS less_equal : binary_function<_Tp, _Tp, bool>
785*58b9f456SAndroid Build Coastguard Worker{
786*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
787*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
788*58b9f456SAndroid Build Coastguard Worker        {return __x <= __y;}
789*58b9f456SAndroid Build Coastguard Worker};
790*58b9f456SAndroid Build Coastguard Worker
791*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
792*58b9f456SAndroid Build Coastguard Workertemplate <>
793*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS less_equal<void>
794*58b9f456SAndroid Build Coastguard Worker{
795*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
796*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
797*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
798*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)))
799*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))
800*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); }
801*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
802*58b9f456SAndroid Build Coastguard Worker};
803*58b9f456SAndroid Build Coastguard Worker#endif
804*58b9f456SAndroid Build Coastguard Worker
805*58b9f456SAndroid Build Coastguard Worker
806*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
807*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
808*58b9f456SAndroid Build Coastguard Worker#else
809*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
810*58b9f456SAndroid Build Coastguard Worker#endif
811*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_and : binary_function<_Tp, _Tp, bool>
812*58b9f456SAndroid Build Coastguard Worker{
813*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
814*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
815*58b9f456SAndroid Build Coastguard Worker        {return __x && __y;}
816*58b9f456SAndroid Build Coastguard Worker};
817*58b9f456SAndroid Build Coastguard Worker
818*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
819*58b9f456SAndroid Build Coastguard Workertemplate <>
820*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_and<void>
821*58b9f456SAndroid Build Coastguard Worker{
822*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
823*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
824*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
825*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)))
826*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))
827*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); }
828*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
829*58b9f456SAndroid Build Coastguard Worker};
830*58b9f456SAndroid Build Coastguard Worker#endif
831*58b9f456SAndroid Build Coastguard Worker
832*58b9f456SAndroid Build Coastguard Worker
833*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
834*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
835*58b9f456SAndroid Build Coastguard Worker#else
836*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
837*58b9f456SAndroid Build Coastguard Worker#endif
838*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_or : binary_function<_Tp, _Tp, bool>
839*58b9f456SAndroid Build Coastguard Worker{
840*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
841*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
842*58b9f456SAndroid Build Coastguard Worker        {return __x || __y;}
843*58b9f456SAndroid Build Coastguard Worker};
844*58b9f456SAndroid Build Coastguard Worker
845*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
846*58b9f456SAndroid Build Coastguard Workertemplate <>
847*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_or<void>
848*58b9f456SAndroid Build Coastguard Worker{
849*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
850*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
851*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
852*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)))
853*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))
854*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); }
855*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
856*58b9f456SAndroid Build Coastguard Worker};
857*58b9f456SAndroid Build Coastguard Worker#endif
858*58b9f456SAndroid Build Coastguard Worker
859*58b9f456SAndroid Build Coastguard Worker
860*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
861*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
862*58b9f456SAndroid Build Coastguard Worker#else
863*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
864*58b9f456SAndroid Build Coastguard Worker#endif
865*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_not : unary_function<_Tp, bool>
866*58b9f456SAndroid Build Coastguard Worker{
867*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
868*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x) const
869*58b9f456SAndroid Build Coastguard Worker        {return !__x;}
870*58b9f456SAndroid Build Coastguard Worker};
871*58b9f456SAndroid Build Coastguard Worker
872*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
873*58b9f456SAndroid Build Coastguard Workertemplate <>
874*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_not<void>
875*58b9f456SAndroid Build Coastguard Worker{
876*58b9f456SAndroid Build Coastguard Worker    template <class _Tp>
877*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
878*58b9f456SAndroid Build Coastguard Worker    auto operator()(_Tp&& __x) const
879*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x)))
880*58b9f456SAndroid Build Coastguard Worker    -> decltype        (!_VSTD::forward<_Tp>(__x))
881*58b9f456SAndroid Build Coastguard Worker        { return        !_VSTD::forward<_Tp>(__x); }
882*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
883*58b9f456SAndroid Build Coastguard Worker};
884*58b9f456SAndroid Build Coastguard Worker#endif
885*58b9f456SAndroid Build Coastguard Worker
886*58b9f456SAndroid Build Coastguard Worker
887*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
888*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
889*58b9f456SAndroid Build Coastguard Worker#else
890*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
891*58b9f456SAndroid Build Coastguard Worker#endif
892*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_and : binary_function<_Tp, _Tp, _Tp>
893*58b9f456SAndroid Build Coastguard Worker{
894*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
895*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
896*58b9f456SAndroid Build Coastguard Worker        {return __x & __y;}
897*58b9f456SAndroid Build Coastguard Worker};
898*58b9f456SAndroid Build Coastguard Worker
899*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
900*58b9f456SAndroid Build Coastguard Workertemplate <>
901*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_and<void>
902*58b9f456SAndroid Build Coastguard Worker{
903*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
904*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
905*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
906*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)))
907*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))
908*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); }
909*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
910*58b9f456SAndroid Build Coastguard Worker};
911*58b9f456SAndroid Build Coastguard Worker#endif
912*58b9f456SAndroid Build Coastguard Worker
913*58b9f456SAndroid Build Coastguard Worker
914*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
915*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
916*58b9f456SAndroid Build Coastguard Worker#else
917*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
918*58b9f456SAndroid Build Coastguard Worker#endif
919*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_or : binary_function<_Tp, _Tp, _Tp>
920*58b9f456SAndroid Build Coastguard Worker{
921*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
922*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
923*58b9f456SAndroid Build Coastguard Worker        {return __x | __y;}
924*58b9f456SAndroid Build Coastguard Worker};
925*58b9f456SAndroid Build Coastguard Worker
926*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
927*58b9f456SAndroid Build Coastguard Workertemplate <>
928*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_or<void>
929*58b9f456SAndroid Build Coastguard Worker{
930*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
931*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
932*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
933*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)))
934*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))
935*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); }
936*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
937*58b9f456SAndroid Build Coastguard Worker};
938*58b9f456SAndroid Build Coastguard Worker#endif
939*58b9f456SAndroid Build Coastguard Worker
940*58b9f456SAndroid Build Coastguard Worker
941*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
942*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
943*58b9f456SAndroid Build Coastguard Worker#else
944*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
945*58b9f456SAndroid Build Coastguard Worker#endif
946*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_xor : binary_function<_Tp, _Tp, _Tp>
947*58b9f456SAndroid Build Coastguard Worker{
948*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
949*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x, const _Tp& __y) const
950*58b9f456SAndroid Build Coastguard Worker        {return __x ^ __y;}
951*58b9f456SAndroid Build Coastguard Worker};
952*58b9f456SAndroid Build Coastguard Worker
953*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
954*58b9f456SAndroid Build Coastguard Workertemplate <>
955*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_xor<void>
956*58b9f456SAndroid Build Coastguard Worker{
957*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
958*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
959*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
960*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)))
961*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))
962*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); }
963*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
964*58b9f456SAndroid Build Coastguard Worker};
965*58b9f456SAndroid Build Coastguard Worker#endif
966*58b9f456SAndroid Build Coastguard Worker
967*58b9f456SAndroid Build Coastguard Worker
968*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
969*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
970*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_not : unary_function<_Tp, _Tp>
971*58b9f456SAndroid Build Coastguard Worker{
972*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
973*58b9f456SAndroid Build Coastguard Worker    _Tp operator()(const _Tp& __x) const
974*58b9f456SAndroid Build Coastguard Worker        {return ~__x;}
975*58b9f456SAndroid Build Coastguard Worker};
976*58b9f456SAndroid Build Coastguard Worker
977*58b9f456SAndroid Build Coastguard Workertemplate <>
978*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_not<void>
979*58b9f456SAndroid Build Coastguard Worker{
980*58b9f456SAndroid Build Coastguard Worker    template <class _Tp>
981*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
982*58b9f456SAndroid Build Coastguard Worker    auto operator()(_Tp&& __x) const
983*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x)))
984*58b9f456SAndroid Build Coastguard Worker    -> decltype        (~_VSTD::forward<_Tp>(__x))
985*58b9f456SAndroid Build Coastguard Worker        { return        ~_VSTD::forward<_Tp>(__x); }
986*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
987*58b9f456SAndroid Build Coastguard Worker};
988*58b9f456SAndroid Build Coastguard Worker#endif
989*58b9f456SAndroid Build Coastguard Worker
990*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate>
991*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 unary_negate
992*58b9f456SAndroid Build Coastguard Worker    : public unary_function<typename _Predicate::argument_type, bool>
993*58b9f456SAndroid Build Coastguard Worker{
994*58b9f456SAndroid Build Coastguard Worker    _Predicate __pred_;
995*58b9f456SAndroid Build Coastguard Workerpublic:
996*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
997*58b9f456SAndroid Build Coastguard Worker    explicit unary_negate(const _Predicate& __pred)
998*58b9f456SAndroid Build Coastguard Worker        : __pred_(__pred) {}
999*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1000*58b9f456SAndroid Build Coastguard Worker    bool operator()(const typename _Predicate::argument_type& __x) const
1001*58b9f456SAndroid Build Coastguard Worker        {return !__pred_(__x);}
1002*58b9f456SAndroid Build Coastguard Worker};
1003*58b9f456SAndroid Build Coastguard Worker
1004*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate>
1005*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1006*58b9f456SAndroid Build Coastguard Workerunary_negate<_Predicate>
1007*58b9f456SAndroid Build Coastguard Workernot1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);}
1008*58b9f456SAndroid Build Coastguard Worker
1009*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate>
1010*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 binary_negate
1011*58b9f456SAndroid Build Coastguard Worker    : public binary_function<typename _Predicate::first_argument_type,
1012*58b9f456SAndroid Build Coastguard Worker                             typename _Predicate::second_argument_type,
1013*58b9f456SAndroid Build Coastguard Worker                             bool>
1014*58b9f456SAndroid Build Coastguard Worker{
1015*58b9f456SAndroid Build Coastguard Worker    _Predicate __pred_;
1016*58b9f456SAndroid Build Coastguard Workerpublic:
1017*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11
1018*58b9f456SAndroid Build Coastguard Worker    binary_negate(const _Predicate& __pred) : __pred_(__pred) {}
1019*58b9f456SAndroid Build Coastguard Worker
1020*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1021*58b9f456SAndroid Build Coastguard Worker    bool operator()(const typename _Predicate::first_argument_type& __x,
1022*58b9f456SAndroid Build Coastguard Worker                    const typename _Predicate::second_argument_type& __y) const
1023*58b9f456SAndroid Build Coastguard Worker        {return !__pred_(__x, __y);}
1024*58b9f456SAndroid Build Coastguard Worker};
1025*58b9f456SAndroid Build Coastguard Worker
1026*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate>
1027*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1028*58b9f456SAndroid Build Coastguard Workerbinary_negate<_Predicate>
1029*58b9f456SAndroid Build Coastguard Workernot2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);}
1030*58b9f456SAndroid Build Coastguard Worker
1031*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
1032*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation>
1033*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder1st
1034*58b9f456SAndroid Build Coastguard Worker    : public unary_function<typename __Operation::second_argument_type,
1035*58b9f456SAndroid Build Coastguard Worker                            typename __Operation::result_type>
1036*58b9f456SAndroid Build Coastguard Worker{
1037*58b9f456SAndroid Build Coastguard Workerprotected:
1038*58b9f456SAndroid Build Coastguard Worker    __Operation                               op;
1039*58b9f456SAndroid Build Coastguard Worker    typename __Operation::first_argument_type value;
1040*58b9f456SAndroid Build Coastguard Workerpublic:
1041*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x,
1042*58b9f456SAndroid Build Coastguard Worker                               const typename __Operation::first_argument_type __y)
1043*58b9f456SAndroid Build Coastguard Worker        : op(__x), value(__y) {}
1044*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1045*58b9f456SAndroid Build Coastguard Worker        (typename __Operation::second_argument_type& __x) const
1046*58b9f456SAndroid Build Coastguard Worker            {return op(value, __x);}
1047*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1048*58b9f456SAndroid Build Coastguard Worker        (const typename __Operation::second_argument_type& __x) const
1049*58b9f456SAndroid Build Coastguard Worker            {return op(value, __x);}
1050*58b9f456SAndroid Build Coastguard Worker};
1051*58b9f456SAndroid Build Coastguard Worker
1052*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation, class _Tp>
1053*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1054*58b9f456SAndroid Build Coastguard Workerbinder1st<__Operation>
1055*58b9f456SAndroid Build Coastguard Workerbind1st(const __Operation& __op, const _Tp& __x)
1056*58b9f456SAndroid Build Coastguard Worker    {return binder1st<__Operation>(__op, __x);}
1057*58b9f456SAndroid Build Coastguard Worker
1058*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation>
1059*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder2nd
1060*58b9f456SAndroid Build Coastguard Worker    : public unary_function<typename __Operation::first_argument_type,
1061*58b9f456SAndroid Build Coastguard Worker                            typename __Operation::result_type>
1062*58b9f456SAndroid Build Coastguard Worker{
1063*58b9f456SAndroid Build Coastguard Workerprotected:
1064*58b9f456SAndroid Build Coastguard Worker    __Operation                                op;
1065*58b9f456SAndroid Build Coastguard Worker    typename __Operation::second_argument_type value;
1066*58b9f456SAndroid Build Coastguard Workerpublic:
1067*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1068*58b9f456SAndroid Build Coastguard Worker    binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y)
1069*58b9f456SAndroid Build Coastguard Worker        : op(__x), value(__y) {}
1070*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1071*58b9f456SAndroid Build Coastguard Worker        (      typename __Operation::first_argument_type& __x) const
1072*58b9f456SAndroid Build Coastguard Worker            {return op(__x, value);}
1073*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1074*58b9f456SAndroid Build Coastguard Worker        (const typename __Operation::first_argument_type& __x) const
1075*58b9f456SAndroid Build Coastguard Worker            {return op(__x, value);}
1076*58b9f456SAndroid Build Coastguard Worker};
1077*58b9f456SAndroid Build Coastguard Worker
1078*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation, class _Tp>
1079*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1080*58b9f456SAndroid Build Coastguard Workerbinder2nd<__Operation>
1081*58b9f456SAndroid Build Coastguard Workerbind2nd(const __Operation& __op, const _Tp& __x)
1082*58b9f456SAndroid Build Coastguard Worker    {return binder2nd<__Operation>(__op, __x);}
1083*58b9f456SAndroid Build Coastguard Worker
1084*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg, class _Result>
1085*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_unary_function
1086*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_Arg, _Result>
1087*58b9f456SAndroid Build Coastguard Worker{
1088*58b9f456SAndroid Build Coastguard Worker    _Result (*__f_)(_Arg);
1089*58b9f456SAndroid Build Coastguard Workerpublic:
1090*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg))
1091*58b9f456SAndroid Build Coastguard Worker        : __f_(__f) {}
1092*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const
1093*58b9f456SAndroid Build Coastguard Worker        {return __f_(__x);}
1094*58b9f456SAndroid Build Coastguard Worker};
1095*58b9f456SAndroid Build Coastguard Worker
1096*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg, class _Result>
1097*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1098*58b9f456SAndroid Build Coastguard Workerpointer_to_unary_function<_Arg,_Result>
1099*58b9f456SAndroid Build Coastguard Workerptr_fun(_Result (*__f)(_Arg))
1100*58b9f456SAndroid Build Coastguard Worker    {return pointer_to_unary_function<_Arg,_Result>(__f);}
1101*58b9f456SAndroid Build Coastguard Worker
1102*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg1, class _Arg2, class _Result>
1103*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_binary_function
1104*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_Arg1, _Arg2, _Result>
1105*58b9f456SAndroid Build Coastguard Worker{
1106*58b9f456SAndroid Build Coastguard Worker    _Result (*__f_)(_Arg1, _Arg2);
1107*58b9f456SAndroid Build Coastguard Workerpublic:
1108*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2))
1109*58b9f456SAndroid Build Coastguard Worker        : __f_(__f) {}
1110*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const
1111*58b9f456SAndroid Build Coastguard Worker        {return __f_(__x, __y);}
1112*58b9f456SAndroid Build Coastguard Worker};
1113*58b9f456SAndroid Build Coastguard Worker
1114*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg1, class _Arg2, class _Result>
1115*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1116*58b9f456SAndroid Build Coastguard Workerpointer_to_binary_function<_Arg1,_Arg2,_Result>
1117*58b9f456SAndroid Build Coastguard Workerptr_fun(_Result (*__f)(_Arg1,_Arg2))
1118*58b9f456SAndroid Build Coastguard Worker    {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);}
1119*58b9f456SAndroid Build Coastguard Worker
1120*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp>
1121*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_t
1122*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_Tp*, _Sp>
1123*58b9f456SAndroid Build Coastguard Worker{
1124*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)();
1125*58b9f456SAndroid Build Coastguard Workerpublic:
1126*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)())
1127*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1128*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const
1129*58b9f456SAndroid Build Coastguard Worker        {return (__p->*__p_)();}
1130*58b9f456SAndroid Build Coastguard Worker};
1131*58b9f456SAndroid Build Coastguard Worker
1132*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap>
1133*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_t
1134*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_Tp*, _Ap, _Sp>
1135*58b9f456SAndroid Build Coastguard Worker{
1136*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)(_Ap);
1137*58b9f456SAndroid Build Coastguard Workerpublic:
1138*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap))
1139*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1140*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const
1141*58b9f456SAndroid Build Coastguard Worker        {return (__p->*__p_)(__x);}
1142*58b9f456SAndroid Build Coastguard Worker};
1143*58b9f456SAndroid Build Coastguard Worker
1144*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp>
1145*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1146*58b9f456SAndroid Build Coastguard Workermem_fun_t<_Sp,_Tp>
1147*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)())
1148*58b9f456SAndroid Build Coastguard Worker    {return mem_fun_t<_Sp,_Tp>(__f);}
1149*58b9f456SAndroid Build Coastguard Worker
1150*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap>
1151*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1152*58b9f456SAndroid Build Coastguard Workermem_fun1_t<_Sp,_Tp,_Ap>
1153*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)(_Ap))
1154*58b9f456SAndroid Build Coastguard Worker    {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
1155*58b9f456SAndroid Build Coastguard Worker
1156*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp>
1157*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_ref_t
1158*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_Tp, _Sp>
1159*58b9f456SAndroid Build Coastguard Worker{
1160*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)();
1161*58b9f456SAndroid Build Coastguard Workerpublic:
1162*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)())
1163*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1164*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const
1165*58b9f456SAndroid Build Coastguard Worker        {return (__p.*__p_)();}
1166*58b9f456SAndroid Build Coastguard Worker};
1167*58b9f456SAndroid Build Coastguard Worker
1168*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap>
1169*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_ref_t
1170*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_Tp, _Ap, _Sp>
1171*58b9f456SAndroid Build Coastguard Worker{
1172*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)(_Ap);
1173*58b9f456SAndroid Build Coastguard Workerpublic:
1174*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap))
1175*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1176*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const
1177*58b9f456SAndroid Build Coastguard Worker        {return (__p.*__p_)(__x);}
1178*58b9f456SAndroid Build Coastguard Worker};
1179*58b9f456SAndroid Build Coastguard Worker
1180*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp>
1181*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1182*58b9f456SAndroid Build Coastguard Workermem_fun_ref_t<_Sp,_Tp>
1183*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)())
1184*58b9f456SAndroid Build Coastguard Worker    {return mem_fun_ref_t<_Sp,_Tp>(__f);}
1185*58b9f456SAndroid Build Coastguard Worker
1186*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap>
1187*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1188*58b9f456SAndroid Build Coastguard Workermem_fun1_ref_t<_Sp,_Tp,_Ap>
1189*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)(_Ap))
1190*58b9f456SAndroid Build Coastguard Worker    {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
1191*58b9f456SAndroid Build Coastguard Worker
1192*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp>
1193*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_t
1194*58b9f456SAndroid Build Coastguard Worker    : public unary_function<const _Tp*, _Sp>
1195*58b9f456SAndroid Build Coastguard Worker{
1196*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)() const;
1197*58b9f456SAndroid Build Coastguard Workerpublic:
1198*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const)
1199*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1200*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const
1201*58b9f456SAndroid Build Coastguard Worker        {return (__p->*__p_)();}
1202*58b9f456SAndroid Build Coastguard Worker};
1203*58b9f456SAndroid Build Coastguard Worker
1204*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap>
1205*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_t
1206*58b9f456SAndroid Build Coastguard Worker    : public binary_function<const _Tp*, _Ap, _Sp>
1207*58b9f456SAndroid Build Coastguard Worker{
1208*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)(_Ap) const;
1209*58b9f456SAndroid Build Coastguard Workerpublic:
1210*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const)
1211*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1212*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const
1213*58b9f456SAndroid Build Coastguard Worker        {return (__p->*__p_)(__x);}
1214*58b9f456SAndroid Build Coastguard Worker};
1215*58b9f456SAndroid Build Coastguard Worker
1216*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp>
1217*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1218*58b9f456SAndroid Build Coastguard Workerconst_mem_fun_t<_Sp,_Tp>
1219*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)() const)
1220*58b9f456SAndroid Build Coastguard Worker    {return const_mem_fun_t<_Sp,_Tp>(__f);}
1221*58b9f456SAndroid Build Coastguard Worker
1222*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap>
1223*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1224*58b9f456SAndroid Build Coastguard Workerconst_mem_fun1_t<_Sp,_Tp,_Ap>
1225*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)(_Ap) const)
1226*58b9f456SAndroid Build Coastguard Worker    {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
1227*58b9f456SAndroid Build Coastguard Worker
1228*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp>
1229*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_ref_t
1230*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_Tp, _Sp>
1231*58b9f456SAndroid Build Coastguard Worker{
1232*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)() const;
1233*58b9f456SAndroid Build Coastguard Workerpublic:
1234*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const)
1235*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1236*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const
1237*58b9f456SAndroid Build Coastguard Worker        {return (__p.*__p_)();}
1238*58b9f456SAndroid Build Coastguard Worker};
1239*58b9f456SAndroid Build Coastguard Worker
1240*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap>
1241*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_ref_t
1242*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_Tp, _Ap, _Sp>
1243*58b9f456SAndroid Build Coastguard Worker{
1244*58b9f456SAndroid Build Coastguard Worker    _Sp (_Tp::*__p_)(_Ap) const;
1245*58b9f456SAndroid Build Coastguard Workerpublic:
1246*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const)
1247*58b9f456SAndroid Build Coastguard Worker        : __p_(__p) {}
1248*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const
1249*58b9f456SAndroid Build Coastguard Worker        {return (__p.*__p_)(__x);}
1250*58b9f456SAndroid Build Coastguard Worker};
1251*58b9f456SAndroid Build Coastguard Worker
1252*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp>
1253*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1254*58b9f456SAndroid Build Coastguard Workerconst_mem_fun_ref_t<_Sp,_Tp>
1255*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)() const)
1256*58b9f456SAndroid Build Coastguard Worker    {return const_mem_fun_ref_t<_Sp,_Tp>(__f);}
1257*58b9f456SAndroid Build Coastguard Worker
1258*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap>
1259*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
1260*58b9f456SAndroid Build Coastguard Workerconst_mem_fun1_ref_t<_Sp,_Tp,_Ap>
1261*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)(_Ap) const)
1262*58b9f456SAndroid Build Coastguard Worker    {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
1263*58b9f456SAndroid Build Coastguard Worker#endif
1264*58b9f456SAndroid Build Coastguard Worker
1265*58b9f456SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
1266*58b9f456SAndroid Build Coastguard Worker//                                MEMFUN
1267*58b9f456SAndroid Build Coastguard Worker//==============================================================================
1268*58b9f456SAndroid Build Coastguard Worker
1269*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1270*58b9f456SAndroid Build Coastguard Workerclass __mem_fn
1271*58b9f456SAndroid Build Coastguard Worker    : public __weak_result_type<_Tp>
1272*58b9f456SAndroid Build Coastguard Worker{
1273*58b9f456SAndroid Build Coastguard Workerpublic:
1274*58b9f456SAndroid Build Coastguard Worker    // types
1275*58b9f456SAndroid Build Coastguard Worker    typedef _Tp type;
1276*58b9f456SAndroid Build Coastguard Workerprivate:
1277*58b9f456SAndroid Build Coastguard Worker    type __f_;
1278*58b9f456SAndroid Build Coastguard Worker
1279*58b9f456SAndroid Build Coastguard Workerpublic:
1280*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
1281*58b9f456SAndroid Build Coastguard Worker
1282*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
1283*58b9f456SAndroid Build Coastguard Worker    // invoke
1284*58b9f456SAndroid Build Coastguard Worker    template <class... _ArgTypes>
1285*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1286*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return<type, _ArgTypes...>::type
1287*58b9f456SAndroid Build Coastguard Worker    operator() (_ArgTypes&&... __args) const {
1288*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
1289*58b9f456SAndroid Build Coastguard Worker    }
1290*58b9f456SAndroid Build Coastguard Worker#else
1291*58b9f456SAndroid Build Coastguard Worker
1292*58b9f456SAndroid Build Coastguard Worker    template <class _A0>
1293*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1294*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return0<type, _A0>::type
1295*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0) const {
1296*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0);
1297*58b9f456SAndroid Build Coastguard Worker    }
1298*58b9f456SAndroid Build Coastguard Worker
1299*58b9f456SAndroid Build Coastguard Worker    template <class _A0>
1300*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1301*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return0<type, _A0 const>::type
1302*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0) const {
1303*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0);
1304*58b9f456SAndroid Build Coastguard Worker    }
1305*58b9f456SAndroid Build Coastguard Worker
1306*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
1307*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1308*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0, _A1>::type
1309*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1& __a1) const {
1310*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1);
1311*58b9f456SAndroid Build Coastguard Worker    }
1312*58b9f456SAndroid Build Coastguard Worker
1313*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
1314*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1315*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0 const, _A1>::type
1316*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1& __a1) const {
1317*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1);
1318*58b9f456SAndroid Build Coastguard Worker    }
1319*58b9f456SAndroid Build Coastguard Worker
1320*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
1321*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1322*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0, _A1 const>::type
1323*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1 const& __a1) const {
1324*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1);
1325*58b9f456SAndroid Build Coastguard Worker    }
1326*58b9f456SAndroid Build Coastguard Worker
1327*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
1328*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1329*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0 const, _A1 const>::type
1330*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1 const& __a1) const {
1331*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1);
1332*58b9f456SAndroid Build Coastguard Worker    }
1333*58b9f456SAndroid Build Coastguard Worker
1334*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1335*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1336*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1, _A2>::type
1337*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
1338*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1339*58b9f456SAndroid Build Coastguard Worker    }
1340*58b9f456SAndroid Build Coastguard Worker
1341*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1342*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1343*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1, _A2>::type
1344*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
1345*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1346*58b9f456SAndroid Build Coastguard Worker    }
1347*58b9f456SAndroid Build Coastguard Worker
1348*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1349*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1350*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1 const, _A2>::type
1351*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
1352*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1353*58b9f456SAndroid Build Coastguard Worker    }
1354*58b9f456SAndroid Build Coastguard Worker
1355*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1356*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1357*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1, _A2 const>::type
1358*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
1359*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1360*58b9f456SAndroid Build Coastguard Worker    }
1361*58b9f456SAndroid Build Coastguard Worker
1362*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1363*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1364*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
1365*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
1366*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1367*58b9f456SAndroid Build Coastguard Worker    }
1368*58b9f456SAndroid Build Coastguard Worker
1369*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1370*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1371*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
1372*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
1373*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1374*58b9f456SAndroid Build Coastguard Worker    }
1375*58b9f456SAndroid Build Coastguard Worker
1376*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1377*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1378*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
1379*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
1380*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1381*58b9f456SAndroid Build Coastguard Worker    }
1382*58b9f456SAndroid Build Coastguard Worker
1383*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
1384*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1385*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
1386*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
1387*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f_, __a0, __a1, __a2);
1388*58b9f456SAndroid Build Coastguard Worker    }
1389*58b9f456SAndroid Build Coastguard Worker#endif
1390*58b9f456SAndroid Build Coastguard Worker};
1391*58b9f456SAndroid Build Coastguard Worker
1392*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Tp>
1393*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
1394*58b9f456SAndroid Build Coastguard Worker__mem_fn<_Rp _Tp::*>
1395*58b9f456SAndroid Build Coastguard Workermem_fn(_Rp _Tp::* __pm) _NOEXCEPT
1396*58b9f456SAndroid Build Coastguard Worker{
1397*58b9f456SAndroid Build Coastguard Worker    return __mem_fn<_Rp _Tp::*>(__pm);
1398*58b9f456SAndroid Build Coastguard Worker}
1399*58b9f456SAndroid Build Coastguard Worker
1400*58b9f456SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
1401*58b9f456SAndroid Build Coastguard Worker//                                FUNCTION
1402*58b9f456SAndroid Build Coastguard Worker//==============================================================================
1403*58b9f456SAndroid Build Coastguard Worker
1404*58b9f456SAndroid Build Coastguard Worker// bad_function_call
1405*58b9f456SAndroid Build Coastguard Worker
1406*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_EXCEPTION_ABI bad_function_call
1407*58b9f456SAndroid Build Coastguard Worker    : public exception
1408*58b9f456SAndroid Build Coastguard Worker{
1409*58b9f456SAndroid Build Coastguard Worker#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
1410*58b9f456SAndroid Build Coastguard Workerpublic:
1411*58b9f456SAndroid Build Coastguard Worker    virtual ~bad_function_call() _NOEXCEPT;
1412*58b9f456SAndroid Build Coastguard Worker
1413*58b9f456SAndroid Build Coastguard Worker    virtual const char* what() const _NOEXCEPT;
1414*58b9f456SAndroid Build Coastguard Worker#endif
1415*58b9f456SAndroid Build Coastguard Worker};
1416*58b9f456SAndroid Build Coastguard Worker
1417*58b9f456SAndroid Build Coastguard Worker_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
1418*58b9f456SAndroid Build Coastguard Workervoid __throw_bad_function_call()
1419*58b9f456SAndroid Build Coastguard Worker{
1420*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_EXCEPTIONS
1421*58b9f456SAndroid Build Coastguard Worker    throw bad_function_call();
1422*58b9f456SAndroid Build Coastguard Worker#else
1423*58b9f456SAndroid Build Coastguard Worker    _VSTD::abort();
1424*58b9f456SAndroid Build Coastguard Worker#endif
1425*58b9f456SAndroid Build Coastguard Worker}
1426*58b9f456SAndroid Build Coastguard Worker
1427*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp> class _LIBCPP_TEMPLATE_VIS function; // undefined
1428*58b9f456SAndroid Build Coastguard Worker
1429*58b9f456SAndroid Build Coastguard Workernamespace __function
1430*58b9f456SAndroid Build Coastguard Worker{
1431*58b9f456SAndroid Build Coastguard Worker
1432*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp>
1433*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_unary_function
1434*58b9f456SAndroid Build Coastguard Worker{
1435*58b9f456SAndroid Build Coastguard Worker};
1436*58b9f456SAndroid Build Coastguard Worker
1437*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _A1>
1438*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_unary_function<_Rp(_A1)>
1439*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_A1, _Rp>
1440*58b9f456SAndroid Build Coastguard Worker{
1441*58b9f456SAndroid Build Coastguard Worker};
1442*58b9f456SAndroid Build Coastguard Worker
1443*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp>
1444*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_binary_function
1445*58b9f456SAndroid Build Coastguard Worker{
1446*58b9f456SAndroid Build Coastguard Worker};
1447*58b9f456SAndroid Build Coastguard Worker
1448*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _A1, class _A2>
1449*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
1450*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_A1, _A2, _Rp>
1451*58b9f456SAndroid Build Coastguard Worker{
1452*58b9f456SAndroid Build Coastguard Worker};
1453*58b9f456SAndroid Build Coastguard Worker
1454*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp>
1455*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY
1456*58b9f456SAndroid Build Coastguard Workerbool __not_null(_Fp const&) { return true; }
1457*58b9f456SAndroid Build Coastguard Worker
1458*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp>
1459*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY
1460*58b9f456SAndroid Build Coastguard Workerbool __not_null(_Fp* __ptr) { return __ptr; }
1461*58b9f456SAndroid Build Coastguard Worker
1462*58b9f456SAndroid Build Coastguard Workertemplate <class _Ret, class _Class>
1463*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY
1464*58b9f456SAndroid Build Coastguard Workerbool __not_null(_Ret _Class::*__ptr) { return __ptr; }
1465*58b9f456SAndroid Build Coastguard Worker
1466*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp>
1467*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY
1468*58b9f456SAndroid Build Coastguard Workerbool __not_null(function<_Fp> const& __f) { return !!__f; }
1469*58b9f456SAndroid Build Coastguard Worker
1470*58b9f456SAndroid Build Coastguard Worker} // namespace __function
1471*58b9f456SAndroid Build Coastguard Worker
1472*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
1473*58b9f456SAndroid Build Coastguard Worker
1474*58b9f456SAndroid Build Coastguard Workernamespace __function {
1475*58b9f456SAndroid Build Coastguard Worker
1476*58b9f456SAndroid Build Coastguard Worker// __alloc_func holds a functor and an allocator.
1477*58b9f456SAndroid Build Coastguard Worker
1478*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _Ap, class _FB> class __alloc_func;
1479*58b9f456SAndroid Build Coastguard Worker
1480*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _Ap, class _Rp, class... _ArgTypes>
1481*58b9f456SAndroid Build Coastguard Workerclass __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)>
1482*58b9f456SAndroid Build Coastguard Worker{
1483*58b9f456SAndroid Build Coastguard Worker    __compressed_pair<_Fp, _Ap> __f_;
1484*58b9f456SAndroid Build Coastguard Worker
1485*58b9f456SAndroid Build Coastguard Worker  public:
1486*58b9f456SAndroid Build Coastguard Worker    typedef _Fp _Target;
1487*58b9f456SAndroid Build Coastguard Worker    typedef _Ap _Alloc;
1488*58b9f456SAndroid Build Coastguard Worker
1489*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1490*58b9f456SAndroid Build Coastguard Worker    const _Target& __target() const { return __f_.first(); }
1491*58b9f456SAndroid Build Coastguard Worker
1492*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1493*58b9f456SAndroid Build Coastguard Worker    const _Alloc& __allocator() const { return __f_.second(); }
1494*58b9f456SAndroid Build Coastguard Worker
1495*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1496*58b9f456SAndroid Build Coastguard Worker    explicit __alloc_func(_Target&& __f)
1497*58b9f456SAndroid Build Coastguard Worker        : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
1498*58b9f456SAndroid Build Coastguard Worker               _VSTD::forward_as_tuple())
1499*58b9f456SAndroid Build Coastguard Worker    {
1500*58b9f456SAndroid Build Coastguard Worker    }
1501*58b9f456SAndroid Build Coastguard Worker
1502*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1503*58b9f456SAndroid Build Coastguard Worker    explicit __alloc_func(const _Target& __f, const _Alloc& __a)
1504*58b9f456SAndroid Build Coastguard Worker        : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
1505*58b9f456SAndroid Build Coastguard Worker               _VSTD::forward_as_tuple(__a))
1506*58b9f456SAndroid Build Coastguard Worker    {
1507*58b9f456SAndroid Build Coastguard Worker    }
1508*58b9f456SAndroid Build Coastguard Worker
1509*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1510*58b9f456SAndroid Build Coastguard Worker    explicit __alloc_func(const _Target& __f, _Alloc&& __a)
1511*58b9f456SAndroid Build Coastguard Worker        : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
1512*58b9f456SAndroid Build Coastguard Worker               _VSTD::forward_as_tuple(_VSTD::move(__a)))
1513*58b9f456SAndroid Build Coastguard Worker    {
1514*58b9f456SAndroid Build Coastguard Worker    }
1515*58b9f456SAndroid Build Coastguard Worker
1516*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1517*58b9f456SAndroid Build Coastguard Worker    explicit __alloc_func(_Target&& __f, _Alloc&& __a)
1518*58b9f456SAndroid Build Coastguard Worker        : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
1519*58b9f456SAndroid Build Coastguard Worker               _VSTD::forward_as_tuple(_VSTD::move(__a)))
1520*58b9f456SAndroid Build Coastguard Worker    {
1521*58b9f456SAndroid Build Coastguard Worker    }
1522*58b9f456SAndroid Build Coastguard Worker
1523*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1524*58b9f456SAndroid Build Coastguard Worker    _Rp operator()(_ArgTypes&&... __arg)
1525*58b9f456SAndroid Build Coastguard Worker    {
1526*58b9f456SAndroid Build Coastguard Worker        typedef __invoke_void_return_wrapper<_Rp> _Invoker;
1527*58b9f456SAndroid Build Coastguard Worker        return _Invoker::__call(__f_.first(),
1528*58b9f456SAndroid Build Coastguard Worker                                _VSTD::forward<_ArgTypes>(__arg)...);
1529*58b9f456SAndroid Build Coastguard Worker    }
1530*58b9f456SAndroid Build Coastguard Worker
1531*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1532*58b9f456SAndroid Build Coastguard Worker    __alloc_func* __clone() const
1533*58b9f456SAndroid Build Coastguard Worker    {
1534*58b9f456SAndroid Build Coastguard Worker        typedef allocator_traits<_Alloc> __alloc_traits;
1535*58b9f456SAndroid Build Coastguard Worker        typedef
1536*58b9f456SAndroid Build Coastguard Worker            typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type
1537*58b9f456SAndroid Build Coastguard Worker                _AA;
1538*58b9f456SAndroid Build Coastguard Worker        _AA __a(__f_.second());
1539*58b9f456SAndroid Build Coastguard Worker        typedef __allocator_destructor<_AA> _Dp;
1540*58b9f456SAndroid Build Coastguard Worker        unique_ptr<__alloc_func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1541*58b9f456SAndroid Build Coastguard Worker        ::new ((void*)__hold.get()) __alloc_func(__f_.first(), _Alloc(__a));
1542*58b9f456SAndroid Build Coastguard Worker        return __hold.release();
1543*58b9f456SAndroid Build Coastguard Worker    }
1544*58b9f456SAndroid Build Coastguard Worker
1545*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1546*58b9f456SAndroid Build Coastguard Worker    void destroy() _NOEXCEPT { __f_.~__compressed_pair<_Target, _Alloc>(); }
1547*58b9f456SAndroid Build Coastguard Worker};
1548*58b9f456SAndroid Build Coastguard Worker
1549*58b9f456SAndroid Build Coastguard Worker// __base provides an abstract interface for copyable functors.
1550*58b9f456SAndroid Build Coastguard Worker
1551*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp> class __base;
1552*58b9f456SAndroid Build Coastguard Worker
1553*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
1554*58b9f456SAndroid Build Coastguard Workerclass __base<_Rp(_ArgTypes...)>
1555*58b9f456SAndroid Build Coastguard Worker{
1556*58b9f456SAndroid Build Coastguard Worker    __base(const __base&);
1557*58b9f456SAndroid Build Coastguard Worker    __base& operator=(const __base&);
1558*58b9f456SAndroid Build Coastguard Workerpublic:
1559*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY __base() {}
1560*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
1561*58b9f456SAndroid Build Coastguard Worker    virtual __base* __clone() const = 0;
1562*58b9f456SAndroid Build Coastguard Worker    virtual void __clone(__base*) const = 0;
1563*58b9f456SAndroid Build Coastguard Worker    virtual void destroy() _NOEXCEPT = 0;
1564*58b9f456SAndroid Build Coastguard Worker    virtual void destroy_deallocate() _NOEXCEPT = 0;
1565*58b9f456SAndroid Build Coastguard Worker    virtual _Rp operator()(_ArgTypes&& ...) = 0;
1566*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
1567*58b9f456SAndroid Build Coastguard Worker    virtual const void* target(const type_info&) const _NOEXCEPT = 0;
1568*58b9f456SAndroid Build Coastguard Worker    virtual const std::type_info& target_type() const _NOEXCEPT = 0;
1569*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_NO_RTTI
1570*58b9f456SAndroid Build Coastguard Worker};
1571*58b9f456SAndroid Build Coastguard Worker
1572*58b9f456SAndroid Build Coastguard Worker// __func implements __base for a given functor type.
1573*58b9f456SAndroid Build Coastguard Worker
1574*58b9f456SAndroid Build Coastguard Workertemplate<class _FD, class _Alloc, class _FB> class __func;
1575*58b9f456SAndroid Build Coastguard Worker
1576*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1577*58b9f456SAndroid Build Coastguard Workerclass __func<_Fp, _Alloc, _Rp(_ArgTypes...)>
1578*58b9f456SAndroid Build Coastguard Worker    : public  __base<_Rp(_ArgTypes...)>
1579*58b9f456SAndroid Build Coastguard Worker{
1580*58b9f456SAndroid Build Coastguard Worker    __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> __f_;
1581*58b9f456SAndroid Build Coastguard Workerpublic:
1582*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1583*58b9f456SAndroid Build Coastguard Worker    explicit __func(_Fp&& __f)
1584*58b9f456SAndroid Build Coastguard Worker        : __f_(_VSTD::move(__f)) {}
1585*58b9f456SAndroid Build Coastguard Worker
1586*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1587*58b9f456SAndroid Build Coastguard Worker    explicit __func(const _Fp& __f, const _Alloc& __a)
1588*58b9f456SAndroid Build Coastguard Worker        : __f_(__f, __a) {}
1589*58b9f456SAndroid Build Coastguard Worker
1590*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1591*58b9f456SAndroid Build Coastguard Worker    explicit __func(const _Fp& __f, _Alloc&& __a)
1592*58b9f456SAndroid Build Coastguard Worker        : __f_(__f, _VSTD::move(__a)) {}
1593*58b9f456SAndroid Build Coastguard Worker
1594*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1595*58b9f456SAndroid Build Coastguard Worker    explicit __func(_Fp&& __f, _Alloc&& __a)
1596*58b9f456SAndroid Build Coastguard Worker        : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
1597*58b9f456SAndroid Build Coastguard Worker
1598*58b9f456SAndroid Build Coastguard Worker    virtual __base<_Rp(_ArgTypes...)>* __clone() const;
1599*58b9f456SAndroid Build Coastguard Worker    virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;
1600*58b9f456SAndroid Build Coastguard Worker    virtual void destroy() _NOEXCEPT;
1601*58b9f456SAndroid Build Coastguard Worker    virtual void destroy_deallocate() _NOEXCEPT;
1602*58b9f456SAndroid Build Coastguard Worker    virtual _Rp operator()(_ArgTypes&&... __arg);
1603*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
1604*58b9f456SAndroid Build Coastguard Worker    virtual const void* target(const type_info&) const _NOEXCEPT;
1605*58b9f456SAndroid Build Coastguard Worker    virtual const std::type_info& target_type() const _NOEXCEPT;
1606*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_NO_RTTI
1607*58b9f456SAndroid Build Coastguard Worker};
1608*58b9f456SAndroid Build Coastguard Worker
1609*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1610*58b9f456SAndroid Build Coastguard Worker__base<_Rp(_ArgTypes...)>*
1611*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const
1612*58b9f456SAndroid Build Coastguard Worker{
1613*58b9f456SAndroid Build Coastguard Worker    typedef allocator_traits<_Alloc> __alloc_traits;
1614*58b9f456SAndroid Build Coastguard Worker    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
1615*58b9f456SAndroid Build Coastguard Worker    _Ap __a(__f_.__allocator());
1616*58b9f456SAndroid Build Coastguard Worker    typedef __allocator_destructor<_Ap> _Dp;
1617*58b9f456SAndroid Build Coastguard Worker    unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1618*58b9f456SAndroid Build Coastguard Worker    ::new ((void*)__hold.get()) __func(__f_.__target(), _Alloc(__a));
1619*58b9f456SAndroid Build Coastguard Worker    return __hold.release();
1620*58b9f456SAndroid Build Coastguard Worker}
1621*58b9f456SAndroid Build Coastguard Worker
1622*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1623*58b9f456SAndroid Build Coastguard Workervoid
1624*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const
1625*58b9f456SAndroid Build Coastguard Worker{
1626*58b9f456SAndroid Build Coastguard Worker    ::new (__p) __func(__f_.__target(), __f_.__allocator());
1627*58b9f456SAndroid Build Coastguard Worker}
1628*58b9f456SAndroid Build Coastguard Worker
1629*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1630*58b9f456SAndroid Build Coastguard Workervoid
1631*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT
1632*58b9f456SAndroid Build Coastguard Worker{
1633*58b9f456SAndroid Build Coastguard Worker    __f_.destroy();
1634*58b9f456SAndroid Build Coastguard Worker}
1635*58b9f456SAndroid Build Coastguard Worker
1636*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1637*58b9f456SAndroid Build Coastguard Workervoid
1638*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
1639*58b9f456SAndroid Build Coastguard Worker{
1640*58b9f456SAndroid Build Coastguard Worker    typedef allocator_traits<_Alloc> __alloc_traits;
1641*58b9f456SAndroid Build Coastguard Worker    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
1642*58b9f456SAndroid Build Coastguard Worker    _Ap __a(__f_.__allocator());
1643*58b9f456SAndroid Build Coastguard Worker    __f_.destroy();
1644*58b9f456SAndroid Build Coastguard Worker    __a.deallocate(this, 1);
1645*58b9f456SAndroid Build Coastguard Worker}
1646*58b9f456SAndroid Build Coastguard Worker
1647*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1648*58b9f456SAndroid Build Coastguard Worker_Rp
1649*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
1650*58b9f456SAndroid Build Coastguard Worker{
1651*58b9f456SAndroid Build Coastguard Worker    return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
1652*58b9f456SAndroid Build Coastguard Worker}
1653*58b9f456SAndroid Build Coastguard Worker
1654*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
1655*58b9f456SAndroid Build Coastguard Worker
1656*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1657*58b9f456SAndroid Build Coastguard Workerconst void*
1658*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
1659*58b9f456SAndroid Build Coastguard Worker{
1660*58b9f456SAndroid Build Coastguard Worker    if (__ti == typeid(_Fp))
1661*58b9f456SAndroid Build Coastguard Worker        return &__f_.__target();
1662*58b9f456SAndroid Build Coastguard Worker    return (const void*)0;
1663*58b9f456SAndroid Build Coastguard Worker}
1664*58b9f456SAndroid Build Coastguard Worker
1665*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1666*58b9f456SAndroid Build Coastguard Workerconst std::type_info&
1667*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
1668*58b9f456SAndroid Build Coastguard Worker{
1669*58b9f456SAndroid Build Coastguard Worker    return typeid(_Fp);
1670*58b9f456SAndroid Build Coastguard Worker}
1671*58b9f456SAndroid Build Coastguard Worker
1672*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_NO_RTTI
1673*58b9f456SAndroid Build Coastguard Worker
1674*58b9f456SAndroid Build Coastguard Worker// __value_func creates a value-type from a __func.
1675*58b9f456SAndroid Build Coastguard Worker
1676*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> class __value_func;
1677*58b9f456SAndroid Build Coastguard Worker
1678*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)>
1679*58b9f456SAndroid Build Coastguard Worker{
1680*58b9f456SAndroid Build Coastguard Worker    typename aligned_storage<3 * sizeof(void*)>::type __buf_;
1681*58b9f456SAndroid Build Coastguard Worker
1682*58b9f456SAndroid Build Coastguard Worker    typedef __base<_Rp(_ArgTypes...)> __func;
1683*58b9f456SAndroid Build Coastguard Worker    __func* __f_;
1684*58b9f456SAndroid Build Coastguard Worker
1685*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_NO_CFI static __func* __as_base(void* p)
1686*58b9f456SAndroid Build Coastguard Worker    {
1687*58b9f456SAndroid Build Coastguard Worker        return reinterpret_cast<__func*>(p);
1688*58b9f456SAndroid Build Coastguard Worker    }
1689*58b9f456SAndroid Build Coastguard Worker
1690*58b9f456SAndroid Build Coastguard Worker  public:
1691*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1692*58b9f456SAndroid Build Coastguard Worker    __value_func() _NOEXCEPT : __f_(0) {}
1693*58b9f456SAndroid Build Coastguard Worker
1694*58b9f456SAndroid Build Coastguard Worker    template <class _Fp, class _Alloc>
1695*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY __value_func(_Fp&& __f, const _Alloc __a)
1696*58b9f456SAndroid Build Coastguard Worker        : __f_(0)
1697*58b9f456SAndroid Build Coastguard Worker    {
1698*58b9f456SAndroid Build Coastguard Worker        typedef allocator_traits<_Alloc> __alloc_traits;
1699*58b9f456SAndroid Build Coastguard Worker        typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
1700*58b9f456SAndroid Build Coastguard Worker        typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
1701*58b9f456SAndroid Build Coastguard Worker            _FunAlloc;
1702*58b9f456SAndroid Build Coastguard Worker
1703*58b9f456SAndroid Build Coastguard Worker        if (__function::__not_null(__f))
1704*58b9f456SAndroid Build Coastguard Worker        {
1705*58b9f456SAndroid Build Coastguard Worker            _FunAlloc __af(__a);
1706*58b9f456SAndroid Build Coastguard Worker            if (sizeof(_Fun) <= sizeof(__buf_) &&
1707*58b9f456SAndroid Build Coastguard Worker                is_nothrow_copy_constructible<_Fp>::value &&
1708*58b9f456SAndroid Build Coastguard Worker                is_nothrow_copy_constructible<_FunAlloc>::value)
1709*58b9f456SAndroid Build Coastguard Worker            {
1710*58b9f456SAndroid Build Coastguard Worker                __f_ =
1711*58b9f456SAndroid Build Coastguard Worker                    ::new ((void*)&__buf_) _Fun(_VSTD::move(__f), _Alloc(__af));
1712*58b9f456SAndroid Build Coastguard Worker            }
1713*58b9f456SAndroid Build Coastguard Worker            else
1714*58b9f456SAndroid Build Coastguard Worker            {
1715*58b9f456SAndroid Build Coastguard Worker                typedef __allocator_destructor<_FunAlloc> _Dp;
1716*58b9f456SAndroid Build Coastguard Worker                unique_ptr<__func, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
1717*58b9f456SAndroid Build Coastguard Worker                ::new ((void*)__hold.get()) _Fun(_VSTD::move(__f), _Alloc(__a));
1718*58b9f456SAndroid Build Coastguard Worker                __f_ = __hold.release();
1719*58b9f456SAndroid Build Coastguard Worker            }
1720*58b9f456SAndroid Build Coastguard Worker        }
1721*58b9f456SAndroid Build Coastguard Worker    }
1722*58b9f456SAndroid Build Coastguard Worker
1723*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1724*58b9f456SAndroid Build Coastguard Worker    __value_func(const __value_func& __f)
1725*58b9f456SAndroid Build Coastguard Worker    {
1726*58b9f456SAndroid Build Coastguard Worker        if (__f.__f_ == 0)
1727*58b9f456SAndroid Build Coastguard Worker            __f_ = 0;
1728*58b9f456SAndroid Build Coastguard Worker        else if ((void*)__f.__f_ == &__f.__buf_)
1729*58b9f456SAndroid Build Coastguard Worker        {
1730*58b9f456SAndroid Build Coastguard Worker            __f_ = __as_base(&__buf_);
1731*58b9f456SAndroid Build Coastguard Worker            __f.__f_->__clone(__f_);
1732*58b9f456SAndroid Build Coastguard Worker        }
1733*58b9f456SAndroid Build Coastguard Worker        else
1734*58b9f456SAndroid Build Coastguard Worker            __f_ = __f.__f_->__clone();
1735*58b9f456SAndroid Build Coastguard Worker    }
1736*58b9f456SAndroid Build Coastguard Worker
1737*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1738*58b9f456SAndroid Build Coastguard Worker    __value_func(__value_func&& __f) _NOEXCEPT
1739*58b9f456SAndroid Build Coastguard Worker    {
1740*58b9f456SAndroid Build Coastguard Worker        if (__f.__f_ == 0)
1741*58b9f456SAndroid Build Coastguard Worker            __f_ = 0;
1742*58b9f456SAndroid Build Coastguard Worker        else if ((void*)__f.__f_ == &__f.__buf_)
1743*58b9f456SAndroid Build Coastguard Worker        {
1744*58b9f456SAndroid Build Coastguard Worker            __f_ = __as_base(&__buf_);
1745*58b9f456SAndroid Build Coastguard Worker            __f.__f_->__clone(__f_);
1746*58b9f456SAndroid Build Coastguard Worker        }
1747*58b9f456SAndroid Build Coastguard Worker        else
1748*58b9f456SAndroid Build Coastguard Worker        {
1749*58b9f456SAndroid Build Coastguard Worker            __f_ = __f.__f_;
1750*58b9f456SAndroid Build Coastguard Worker            __f.__f_ = 0;
1751*58b9f456SAndroid Build Coastguard Worker        }
1752*58b9f456SAndroid Build Coastguard Worker    }
1753*58b9f456SAndroid Build Coastguard Worker
1754*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1755*58b9f456SAndroid Build Coastguard Worker    ~__value_func()
1756*58b9f456SAndroid Build Coastguard Worker    {
1757*58b9f456SAndroid Build Coastguard Worker        if ((void*)__f_ == &__buf_)
1758*58b9f456SAndroid Build Coastguard Worker            __f_->destroy();
1759*58b9f456SAndroid Build Coastguard Worker        else if (__f_)
1760*58b9f456SAndroid Build Coastguard Worker            __f_->destroy_deallocate();
1761*58b9f456SAndroid Build Coastguard Worker    }
1762*58b9f456SAndroid Build Coastguard Worker
1763*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1764*58b9f456SAndroid Build Coastguard Worker    __value_func& operator=(__value_func&& __f)
1765*58b9f456SAndroid Build Coastguard Worker    {
1766*58b9f456SAndroid Build Coastguard Worker        *this = nullptr;
1767*58b9f456SAndroid Build Coastguard Worker        if (__f.__f_ == 0)
1768*58b9f456SAndroid Build Coastguard Worker            __f_ = 0;
1769*58b9f456SAndroid Build Coastguard Worker        else if ((void*)__f.__f_ == &__f.__buf_)
1770*58b9f456SAndroid Build Coastguard Worker        {
1771*58b9f456SAndroid Build Coastguard Worker            __f_ = __as_base(&__buf_);
1772*58b9f456SAndroid Build Coastguard Worker            __f.__f_->__clone(__f_);
1773*58b9f456SAndroid Build Coastguard Worker        }
1774*58b9f456SAndroid Build Coastguard Worker        else
1775*58b9f456SAndroid Build Coastguard Worker        {
1776*58b9f456SAndroid Build Coastguard Worker            __f_ = __f.__f_;
1777*58b9f456SAndroid Build Coastguard Worker            __f.__f_ = 0;
1778*58b9f456SAndroid Build Coastguard Worker        }
1779*58b9f456SAndroid Build Coastguard Worker        return *this;
1780*58b9f456SAndroid Build Coastguard Worker    }
1781*58b9f456SAndroid Build Coastguard Worker
1782*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1783*58b9f456SAndroid Build Coastguard Worker    __value_func& operator=(nullptr_t)
1784*58b9f456SAndroid Build Coastguard Worker    {
1785*58b9f456SAndroid Build Coastguard Worker        __func* __f = __f_;
1786*58b9f456SAndroid Build Coastguard Worker        __f_ = 0;
1787*58b9f456SAndroid Build Coastguard Worker        if ((void*)__f == &__buf_)
1788*58b9f456SAndroid Build Coastguard Worker            __f->destroy();
1789*58b9f456SAndroid Build Coastguard Worker        else if (__f)
1790*58b9f456SAndroid Build Coastguard Worker            __f->destroy_deallocate();
1791*58b9f456SAndroid Build Coastguard Worker        return *this;
1792*58b9f456SAndroid Build Coastguard Worker    }
1793*58b9f456SAndroid Build Coastguard Worker
1794*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1795*58b9f456SAndroid Build Coastguard Worker    _Rp operator()(_ArgTypes&&... __args) const
1796*58b9f456SAndroid Build Coastguard Worker    {
1797*58b9f456SAndroid Build Coastguard Worker        if (__f_ == 0)
1798*58b9f456SAndroid Build Coastguard Worker            __throw_bad_function_call();
1799*58b9f456SAndroid Build Coastguard Worker        return (*__f_)(_VSTD::forward<_ArgTypes>(__args)...);
1800*58b9f456SAndroid Build Coastguard Worker    }
1801*58b9f456SAndroid Build Coastguard Worker
1802*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1803*58b9f456SAndroid Build Coastguard Worker    void swap(__value_func& __f) _NOEXCEPT
1804*58b9f456SAndroid Build Coastguard Worker    {
1805*58b9f456SAndroid Build Coastguard Worker        if (&__f == this)
1806*58b9f456SAndroid Build Coastguard Worker            return;
1807*58b9f456SAndroid Build Coastguard Worker        if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_)
1808*58b9f456SAndroid Build Coastguard Worker        {
1809*58b9f456SAndroid Build Coastguard Worker            typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1810*58b9f456SAndroid Build Coastguard Worker            __func* __t = __as_base(&__tempbuf);
1811*58b9f456SAndroid Build Coastguard Worker            __f_->__clone(__t);
1812*58b9f456SAndroid Build Coastguard Worker            __f_->destroy();
1813*58b9f456SAndroid Build Coastguard Worker            __f_ = 0;
1814*58b9f456SAndroid Build Coastguard Worker            __f.__f_->__clone(__as_base(&__buf_));
1815*58b9f456SAndroid Build Coastguard Worker            __f.__f_->destroy();
1816*58b9f456SAndroid Build Coastguard Worker            __f.__f_ = 0;
1817*58b9f456SAndroid Build Coastguard Worker            __f_ = __as_base(&__buf_);
1818*58b9f456SAndroid Build Coastguard Worker            __t->__clone(__as_base(&__f.__buf_));
1819*58b9f456SAndroid Build Coastguard Worker            __t->destroy();
1820*58b9f456SAndroid Build Coastguard Worker            __f.__f_ = __as_base(&__f.__buf_);
1821*58b9f456SAndroid Build Coastguard Worker        }
1822*58b9f456SAndroid Build Coastguard Worker        else if ((void*)__f_ == &__buf_)
1823*58b9f456SAndroid Build Coastguard Worker        {
1824*58b9f456SAndroid Build Coastguard Worker            __f_->__clone(__as_base(&__f.__buf_));
1825*58b9f456SAndroid Build Coastguard Worker            __f_->destroy();
1826*58b9f456SAndroid Build Coastguard Worker            __f_ = __f.__f_;
1827*58b9f456SAndroid Build Coastguard Worker            __f.__f_ = __as_base(&__f.__buf_);
1828*58b9f456SAndroid Build Coastguard Worker        }
1829*58b9f456SAndroid Build Coastguard Worker        else if ((void*)__f.__f_ == &__f.__buf_)
1830*58b9f456SAndroid Build Coastguard Worker        {
1831*58b9f456SAndroid Build Coastguard Worker            __f.__f_->__clone(__as_base(&__buf_));
1832*58b9f456SAndroid Build Coastguard Worker            __f.__f_->destroy();
1833*58b9f456SAndroid Build Coastguard Worker            __f.__f_ = __f_;
1834*58b9f456SAndroid Build Coastguard Worker            __f_ = __as_base(&__buf_);
1835*58b9f456SAndroid Build Coastguard Worker        }
1836*58b9f456SAndroid Build Coastguard Worker        else
1837*58b9f456SAndroid Build Coastguard Worker            _VSTD::swap(__f_, __f.__f_);
1838*58b9f456SAndroid Build Coastguard Worker    }
1839*58b9f456SAndroid Build Coastguard Worker
1840*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1841*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { return __f_ != 0; }
1842*58b9f456SAndroid Build Coastguard Worker
1843*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
1844*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1845*58b9f456SAndroid Build Coastguard Worker    const std::type_info& target_type() const _NOEXCEPT
1846*58b9f456SAndroid Build Coastguard Worker    {
1847*58b9f456SAndroid Build Coastguard Worker        if (__f_ == 0)
1848*58b9f456SAndroid Build Coastguard Worker            return typeid(void);
1849*58b9f456SAndroid Build Coastguard Worker        return __f_->target_type();
1850*58b9f456SAndroid Build Coastguard Worker    }
1851*58b9f456SAndroid Build Coastguard Worker
1852*58b9f456SAndroid Build Coastguard Worker    template <typename _Tp>
1853*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
1854*58b9f456SAndroid Build Coastguard Worker    {
1855*58b9f456SAndroid Build Coastguard Worker        if (__f_ == 0)
1856*58b9f456SAndroid Build Coastguard Worker            return 0;
1857*58b9f456SAndroid Build Coastguard Worker        return (const _Tp*)__f_->target(typeid(_Tp));
1858*58b9f456SAndroid Build Coastguard Worker    }
1859*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI
1860*58b9f456SAndroid Build Coastguard Worker};
1861*58b9f456SAndroid Build Coastguard Worker
1862*58b9f456SAndroid Build Coastguard Worker// Storage for a functor object, to be used with __policy to manage copy and
1863*58b9f456SAndroid Build Coastguard Worker// destruction.
1864*58b9f456SAndroid Build Coastguard Workerunion __policy_storage
1865*58b9f456SAndroid Build Coastguard Worker{
1866*58b9f456SAndroid Build Coastguard Worker    mutable char __small[sizeof(void*) * 2];
1867*58b9f456SAndroid Build Coastguard Worker    void* __large;
1868*58b9f456SAndroid Build Coastguard Worker};
1869*58b9f456SAndroid Build Coastguard Worker
1870*58b9f456SAndroid Build Coastguard Worker// True if _Fun can safely be held in __policy_storage.__small.
1871*58b9f456SAndroid Build Coastguard Workertemplate <typename _Fun>
1872*58b9f456SAndroid Build Coastguard Workerstruct __use_small_storage
1873*58b9f456SAndroid Build Coastguard Worker    : public _VSTD::integral_constant<
1874*58b9f456SAndroid Build Coastguard Worker          bool, sizeof(_Fun) <= sizeof(__policy_storage) &&
1875*58b9f456SAndroid Build Coastguard Worker                    alignof(_Fun) <= alignof(__policy_storage) &&
1876*58b9f456SAndroid Build Coastguard Worker                    _VSTD::is_trivially_copy_constructible<_Fun>::value &&
1877*58b9f456SAndroid Build Coastguard Worker                    _VSTD::is_trivially_destructible<_Fun>::value> {};
1878*58b9f456SAndroid Build Coastguard Worker
1879*58b9f456SAndroid Build Coastguard Worker// Policy contains information about how to copy, destroy, and move the
1880*58b9f456SAndroid Build Coastguard Worker// underlying functor. You can think of it as a vtable of sorts.
1881*58b9f456SAndroid Build Coastguard Workerstruct __policy
1882*58b9f456SAndroid Build Coastguard Worker{
1883*58b9f456SAndroid Build Coastguard Worker    // Used to copy or destroy __large values. null for trivial objects.
1884*58b9f456SAndroid Build Coastguard Worker    void* (*const __clone)(const void*);
1885*58b9f456SAndroid Build Coastguard Worker    void (*const __destroy)(void*);
1886*58b9f456SAndroid Build Coastguard Worker
1887*58b9f456SAndroid Build Coastguard Worker    // True if this is the null policy (no value).
1888*58b9f456SAndroid Build Coastguard Worker    const bool __is_null;
1889*58b9f456SAndroid Build Coastguard Worker
1890*58b9f456SAndroid Build Coastguard Worker    // The target type. May be null if RTTI is disabled.
1891*58b9f456SAndroid Build Coastguard Worker    const std::type_info* const __type_info;
1892*58b9f456SAndroid Build Coastguard Worker
1893*58b9f456SAndroid Build Coastguard Worker    // Returns a pointer to a static policy object suitable for the functor
1894*58b9f456SAndroid Build Coastguard Worker    // type.
1895*58b9f456SAndroid Build Coastguard Worker    template <typename _Fun>
1896*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY static const __policy* __create()
1897*58b9f456SAndroid Build Coastguard Worker    {
1898*58b9f456SAndroid Build Coastguard Worker        return __choose_policy<_Fun>(__use_small_storage<_Fun>());
1899*58b9f456SAndroid Build Coastguard Worker    }
1900*58b9f456SAndroid Build Coastguard Worker
1901*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1902*58b9f456SAndroid Build Coastguard Worker    static const __policy* __create_empty()
1903*58b9f456SAndroid Build Coastguard Worker    {
1904*58b9f456SAndroid Build Coastguard Worker        static const _LIBCPP_CONSTEXPR __policy __policy_ = {nullptr, nullptr,
1905*58b9f456SAndroid Build Coastguard Worker                                                             true,
1906*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
1907*58b9f456SAndroid Build Coastguard Worker                                                             &typeid(void)
1908*58b9f456SAndroid Build Coastguard Worker#else
1909*58b9f456SAndroid Build Coastguard Worker                                                             nullptr
1910*58b9f456SAndroid Build Coastguard Worker#endif
1911*58b9f456SAndroid Build Coastguard Worker        };
1912*58b9f456SAndroid Build Coastguard Worker        return &__policy_;
1913*58b9f456SAndroid Build Coastguard Worker    }
1914*58b9f456SAndroid Build Coastguard Worker
1915*58b9f456SAndroid Build Coastguard Worker  private:
1916*58b9f456SAndroid Build Coastguard Worker    template <typename _Fun> static void* __large_clone(const void* __s)
1917*58b9f456SAndroid Build Coastguard Worker    {
1918*58b9f456SAndroid Build Coastguard Worker        const _Fun* __f = static_cast<const _Fun*>(__s);
1919*58b9f456SAndroid Build Coastguard Worker        return __f->__clone();
1920*58b9f456SAndroid Build Coastguard Worker    }
1921*58b9f456SAndroid Build Coastguard Worker
1922*58b9f456SAndroid Build Coastguard Worker    template <typename _Fun> static void __large_destroy(void* __s)
1923*58b9f456SAndroid Build Coastguard Worker    {
1924*58b9f456SAndroid Build Coastguard Worker        typedef allocator_traits<typename _Fun::_Alloc> __alloc_traits;
1925*58b9f456SAndroid Build Coastguard Worker        typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
1926*58b9f456SAndroid Build Coastguard Worker            _FunAlloc;
1927*58b9f456SAndroid Build Coastguard Worker        _Fun* __f = static_cast<_Fun*>(__s);
1928*58b9f456SAndroid Build Coastguard Worker        _FunAlloc __a(__f->__allocator());
1929*58b9f456SAndroid Build Coastguard Worker        __f->destroy();
1930*58b9f456SAndroid Build Coastguard Worker        __a.deallocate(__f, 1);
1931*58b9f456SAndroid Build Coastguard Worker    }
1932*58b9f456SAndroid Build Coastguard Worker
1933*58b9f456SAndroid Build Coastguard Worker    template <typename _Fun>
1934*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY static const __policy*
1935*58b9f456SAndroid Build Coastguard Worker        __choose_policy(/* is_small = */ false_type)
1936*58b9f456SAndroid Build Coastguard Worker    {
1937*58b9f456SAndroid Build Coastguard Worker        static const _LIBCPP_CONSTEXPR __policy __policy_ = {
1938*58b9f456SAndroid Build Coastguard Worker            &__large_clone<_Fun>, &__large_destroy<_Fun>, false,
1939*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
1940*58b9f456SAndroid Build Coastguard Worker            &typeid(typename _Fun::_Target)
1941*58b9f456SAndroid Build Coastguard Worker#else
1942*58b9f456SAndroid Build Coastguard Worker            nullptr
1943*58b9f456SAndroid Build Coastguard Worker#endif
1944*58b9f456SAndroid Build Coastguard Worker        };
1945*58b9f456SAndroid Build Coastguard Worker        return &__policy_;
1946*58b9f456SAndroid Build Coastguard Worker    }
1947*58b9f456SAndroid Build Coastguard Worker
1948*58b9f456SAndroid Build Coastguard Worker    template <typename _Fun>
1949*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY static const __policy*
1950*58b9f456SAndroid Build Coastguard Worker        __choose_policy(/* is_small = */ true_type)
1951*58b9f456SAndroid Build Coastguard Worker    {
1952*58b9f456SAndroid Build Coastguard Worker        static const _LIBCPP_CONSTEXPR __policy __policy_ = {
1953*58b9f456SAndroid Build Coastguard Worker            nullptr, nullptr, false,
1954*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
1955*58b9f456SAndroid Build Coastguard Worker            &typeid(typename _Fun::_Target)
1956*58b9f456SAndroid Build Coastguard Worker#else
1957*58b9f456SAndroid Build Coastguard Worker            nullptr
1958*58b9f456SAndroid Build Coastguard Worker#endif
1959*58b9f456SAndroid Build Coastguard Worker        };
1960*58b9f456SAndroid Build Coastguard Worker        return &__policy_;
1961*58b9f456SAndroid Build Coastguard Worker    }
1962*58b9f456SAndroid Build Coastguard Worker};
1963*58b9f456SAndroid Build Coastguard Worker
1964*58b9f456SAndroid Build Coastguard Worker// Used to choose between perfect forwarding or pass-by-value. Pass-by-value is
1965*58b9f456SAndroid Build Coastguard Worker// faster for types that can be passed in registers.
1966*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
1967*58b9f456SAndroid Build Coastguard Workerusing __fast_forward =
1968*58b9f456SAndroid Build Coastguard Worker    typename _VSTD::conditional<_VSTD::is_scalar<_Tp>::value, _Tp, _Tp&&>::type;
1969*58b9f456SAndroid Build Coastguard Worker
1970*58b9f456SAndroid Build Coastguard Worker// __policy_invoker calls an instance of __alloc_func held in __policy_storage.
1971*58b9f456SAndroid Build Coastguard Worker
1972*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> struct __policy_invoker;
1973*58b9f456SAndroid Build Coastguard Worker
1974*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
1975*58b9f456SAndroid Build Coastguard Workerstruct __policy_invoker<_Rp(_ArgTypes...)>
1976*58b9f456SAndroid Build Coastguard Worker{
1977*58b9f456SAndroid Build Coastguard Worker    typedef _Rp (*__Call)(const __policy_storage*,
1978*58b9f456SAndroid Build Coastguard Worker                          __fast_forward<_ArgTypes>...);
1979*58b9f456SAndroid Build Coastguard Worker
1980*58b9f456SAndroid Build Coastguard Worker    __Call __call_;
1981*58b9f456SAndroid Build Coastguard Worker
1982*58b9f456SAndroid Build Coastguard Worker    // Creates an invoker that throws bad_function_call.
1983*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1984*58b9f456SAndroid Build Coastguard Worker    __policy_invoker() : __call_(&__call_empty) {}
1985*58b9f456SAndroid Build Coastguard Worker
1986*58b9f456SAndroid Build Coastguard Worker    // Creates an invoker that calls the given instance of __func.
1987*58b9f456SAndroid Build Coastguard Worker    template <typename _Fun>
1988*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY static __policy_invoker __create()
1989*58b9f456SAndroid Build Coastguard Worker    {
1990*58b9f456SAndroid Build Coastguard Worker        return __policy_invoker(&__call_impl<_Fun>);
1991*58b9f456SAndroid Build Coastguard Worker    }
1992*58b9f456SAndroid Build Coastguard Worker
1993*58b9f456SAndroid Build Coastguard Worker  private:
1994*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1995*58b9f456SAndroid Build Coastguard Worker    explicit __policy_invoker(__Call __c) : __call_(__c) {}
1996*58b9f456SAndroid Build Coastguard Worker
1997*58b9f456SAndroid Build Coastguard Worker    static _Rp __call_empty(const __policy_storage*,
1998*58b9f456SAndroid Build Coastguard Worker                            __fast_forward<_ArgTypes>...)
1999*58b9f456SAndroid Build Coastguard Worker    {
2000*58b9f456SAndroid Build Coastguard Worker        __throw_bad_function_call();
2001*58b9f456SAndroid Build Coastguard Worker    }
2002*58b9f456SAndroid Build Coastguard Worker
2003*58b9f456SAndroid Build Coastguard Worker    template <typename _Fun>
2004*58b9f456SAndroid Build Coastguard Worker    static _Rp __call_impl(const __policy_storage* __buf,
2005*58b9f456SAndroid Build Coastguard Worker                           __fast_forward<_ArgTypes>... __args)
2006*58b9f456SAndroid Build Coastguard Worker    {
2007*58b9f456SAndroid Build Coastguard Worker        _Fun* __f = reinterpret_cast<_Fun*>(__use_small_storage<_Fun>::value
2008*58b9f456SAndroid Build Coastguard Worker                                                ? &__buf->__small
2009*58b9f456SAndroid Build Coastguard Worker                                                : __buf->__large);
2010*58b9f456SAndroid Build Coastguard Worker        return (*__f)(_VSTD::forward<_ArgTypes>(__args)...);
2011*58b9f456SAndroid Build Coastguard Worker    }
2012*58b9f456SAndroid Build Coastguard Worker};
2013*58b9f456SAndroid Build Coastguard Worker
2014*58b9f456SAndroid Build Coastguard Worker// __policy_func uses a __policy and __policy_invoker to create a type-erased,
2015*58b9f456SAndroid Build Coastguard Worker// copyable functor.
2016*58b9f456SAndroid Build Coastguard Worker
2017*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> class __policy_func;
2018*58b9f456SAndroid Build Coastguard Worker
2019*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> class __policy_func<_Rp(_ArgTypes...)>
2020*58b9f456SAndroid Build Coastguard Worker{
2021*58b9f456SAndroid Build Coastguard Worker    // Inline storage for small objects.
2022*58b9f456SAndroid Build Coastguard Worker    __policy_storage __buf_;
2023*58b9f456SAndroid Build Coastguard Worker
2024*58b9f456SAndroid Build Coastguard Worker    // Calls the value stored in __buf_. This could technically be part of
2025*58b9f456SAndroid Build Coastguard Worker    // policy, but storing it here eliminates a level of indirection inside
2026*58b9f456SAndroid Build Coastguard Worker    // operator().
2027*58b9f456SAndroid Build Coastguard Worker    typedef __function::__policy_invoker<_Rp(_ArgTypes...)> __invoker;
2028*58b9f456SAndroid Build Coastguard Worker    __invoker __invoker_;
2029*58b9f456SAndroid Build Coastguard Worker
2030*58b9f456SAndroid Build Coastguard Worker    // The policy that describes how to move / copy / destroy __buf_. Never
2031*58b9f456SAndroid Build Coastguard Worker    // null, even if the function is empty.
2032*58b9f456SAndroid Build Coastguard Worker    const __policy* __policy_;
2033*58b9f456SAndroid Build Coastguard Worker
2034*58b9f456SAndroid Build Coastguard Worker  public:
2035*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2036*58b9f456SAndroid Build Coastguard Worker    __policy_func() : __policy_(__policy::__create_empty()) {}
2037*58b9f456SAndroid Build Coastguard Worker
2038*58b9f456SAndroid Build Coastguard Worker    template <class _Fp, class _Alloc>
2039*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY __policy_func(_Fp&& __f, const _Alloc& __a)
2040*58b9f456SAndroid Build Coastguard Worker        : __policy_(__policy::__create_empty())
2041*58b9f456SAndroid Build Coastguard Worker    {
2042*58b9f456SAndroid Build Coastguard Worker        typedef __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
2043*58b9f456SAndroid Build Coastguard Worker        typedef allocator_traits<_Alloc> __alloc_traits;
2044*58b9f456SAndroid Build Coastguard Worker        typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
2045*58b9f456SAndroid Build Coastguard Worker            _FunAlloc;
2046*58b9f456SAndroid Build Coastguard Worker
2047*58b9f456SAndroid Build Coastguard Worker        if (__function::__not_null(__f))
2048*58b9f456SAndroid Build Coastguard Worker        {
2049*58b9f456SAndroid Build Coastguard Worker            __invoker_ = __invoker::template __create<_Fun>();
2050*58b9f456SAndroid Build Coastguard Worker            __policy_ = __policy::__create<_Fun>();
2051*58b9f456SAndroid Build Coastguard Worker
2052*58b9f456SAndroid Build Coastguard Worker            _FunAlloc __af(__a);
2053*58b9f456SAndroid Build Coastguard Worker            if (__use_small_storage<_Fun>())
2054*58b9f456SAndroid Build Coastguard Worker            {
2055*58b9f456SAndroid Build Coastguard Worker                ::new ((void*)&__buf_.__small)
2056*58b9f456SAndroid Build Coastguard Worker                    _Fun(_VSTD::move(__f), _Alloc(__af));
2057*58b9f456SAndroid Build Coastguard Worker            }
2058*58b9f456SAndroid Build Coastguard Worker            else
2059*58b9f456SAndroid Build Coastguard Worker            {
2060*58b9f456SAndroid Build Coastguard Worker                typedef __allocator_destructor<_FunAlloc> _Dp;
2061*58b9f456SAndroid Build Coastguard Worker                unique_ptr<_Fun, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
2062*58b9f456SAndroid Build Coastguard Worker                ::new ((void*)__hold.get())
2063*58b9f456SAndroid Build Coastguard Worker                    _Fun(_VSTD::move(__f), _Alloc(__af));
2064*58b9f456SAndroid Build Coastguard Worker                __buf_.__large = __hold.release();
2065*58b9f456SAndroid Build Coastguard Worker            }
2066*58b9f456SAndroid Build Coastguard Worker        }
2067*58b9f456SAndroid Build Coastguard Worker    }
2068*58b9f456SAndroid Build Coastguard Worker
2069*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2070*58b9f456SAndroid Build Coastguard Worker    __policy_func(const __policy_func& __f)
2071*58b9f456SAndroid Build Coastguard Worker        : __buf_(__f.__buf_), __invoker_(__f.__invoker_),
2072*58b9f456SAndroid Build Coastguard Worker          __policy_(__f.__policy_)
2073*58b9f456SAndroid Build Coastguard Worker    {
2074*58b9f456SAndroid Build Coastguard Worker        if (__policy_->__clone)
2075*58b9f456SAndroid Build Coastguard Worker            __buf_.__large = __policy_->__clone(__f.__buf_.__large);
2076*58b9f456SAndroid Build Coastguard Worker    }
2077*58b9f456SAndroid Build Coastguard Worker
2078*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2079*58b9f456SAndroid Build Coastguard Worker    __policy_func(__policy_func&& __f)
2080*58b9f456SAndroid Build Coastguard Worker        : __buf_(__f.__buf_), __invoker_(__f.__invoker_),
2081*58b9f456SAndroid Build Coastguard Worker          __policy_(__f.__policy_)
2082*58b9f456SAndroid Build Coastguard Worker    {
2083*58b9f456SAndroid Build Coastguard Worker        if (__policy_->__destroy)
2084*58b9f456SAndroid Build Coastguard Worker        {
2085*58b9f456SAndroid Build Coastguard Worker            __f.__policy_ = __policy::__create_empty();
2086*58b9f456SAndroid Build Coastguard Worker            __f.__invoker_ = __invoker();
2087*58b9f456SAndroid Build Coastguard Worker        }
2088*58b9f456SAndroid Build Coastguard Worker    }
2089*58b9f456SAndroid Build Coastguard Worker
2090*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2091*58b9f456SAndroid Build Coastguard Worker    ~__policy_func()
2092*58b9f456SAndroid Build Coastguard Worker    {
2093*58b9f456SAndroid Build Coastguard Worker        if (__policy_->__destroy)
2094*58b9f456SAndroid Build Coastguard Worker            __policy_->__destroy(__buf_.__large);
2095*58b9f456SAndroid Build Coastguard Worker    }
2096*58b9f456SAndroid Build Coastguard Worker
2097*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2098*58b9f456SAndroid Build Coastguard Worker    __policy_func& operator=(__policy_func&& __f)
2099*58b9f456SAndroid Build Coastguard Worker    {
2100*58b9f456SAndroid Build Coastguard Worker        *this = nullptr;
2101*58b9f456SAndroid Build Coastguard Worker        __buf_ = __f.__buf_;
2102*58b9f456SAndroid Build Coastguard Worker        __invoker_ = __f.__invoker_;
2103*58b9f456SAndroid Build Coastguard Worker        __policy_ = __f.__policy_;
2104*58b9f456SAndroid Build Coastguard Worker        __f.__policy_ = __policy::__create_empty();
2105*58b9f456SAndroid Build Coastguard Worker        __f.__invoker_ = __invoker();
2106*58b9f456SAndroid Build Coastguard Worker        return *this;
2107*58b9f456SAndroid Build Coastguard Worker    }
2108*58b9f456SAndroid Build Coastguard Worker
2109*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2110*58b9f456SAndroid Build Coastguard Worker    __policy_func& operator=(nullptr_t)
2111*58b9f456SAndroid Build Coastguard Worker    {
2112*58b9f456SAndroid Build Coastguard Worker        const __policy* __p = __policy_;
2113*58b9f456SAndroid Build Coastguard Worker        __policy_ = __policy::__create_empty();
2114*58b9f456SAndroid Build Coastguard Worker        __invoker_ = __invoker();
2115*58b9f456SAndroid Build Coastguard Worker        if (__p->__destroy)
2116*58b9f456SAndroid Build Coastguard Worker            __p->__destroy(__buf_.__large);
2117*58b9f456SAndroid Build Coastguard Worker        return *this;
2118*58b9f456SAndroid Build Coastguard Worker    }
2119*58b9f456SAndroid Build Coastguard Worker
2120*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2121*58b9f456SAndroid Build Coastguard Worker    _Rp operator()(_ArgTypes&&... __args) const
2122*58b9f456SAndroid Build Coastguard Worker    {
2123*58b9f456SAndroid Build Coastguard Worker        return __invoker_.__call_(_VSTD::addressof(__buf_),
2124*58b9f456SAndroid Build Coastguard Worker                                  _VSTD::forward<_ArgTypes>(__args)...);
2125*58b9f456SAndroid Build Coastguard Worker    }
2126*58b9f456SAndroid Build Coastguard Worker
2127*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2128*58b9f456SAndroid Build Coastguard Worker    void swap(__policy_func& __f)
2129*58b9f456SAndroid Build Coastguard Worker    {
2130*58b9f456SAndroid Build Coastguard Worker        _VSTD::swap(__invoker_, __f.__invoker_);
2131*58b9f456SAndroid Build Coastguard Worker        _VSTD::swap(__policy_, __f.__policy_);
2132*58b9f456SAndroid Build Coastguard Worker        _VSTD::swap(__buf_, __f.__buf_);
2133*58b9f456SAndroid Build Coastguard Worker    }
2134*58b9f456SAndroid Build Coastguard Worker
2135*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2136*58b9f456SAndroid Build Coastguard Worker    explicit operator bool() const _NOEXCEPT
2137*58b9f456SAndroid Build Coastguard Worker    {
2138*58b9f456SAndroid Build Coastguard Worker        return !__policy_->__is_null;
2139*58b9f456SAndroid Build Coastguard Worker    }
2140*58b9f456SAndroid Build Coastguard Worker
2141*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
2142*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2143*58b9f456SAndroid Build Coastguard Worker    const std::type_info& target_type() const _NOEXCEPT
2144*58b9f456SAndroid Build Coastguard Worker    {
2145*58b9f456SAndroid Build Coastguard Worker        return *__policy_->__type_info;
2146*58b9f456SAndroid Build Coastguard Worker    }
2147*58b9f456SAndroid Build Coastguard Worker
2148*58b9f456SAndroid Build Coastguard Worker    template <typename _Tp>
2149*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
2150*58b9f456SAndroid Build Coastguard Worker    {
2151*58b9f456SAndroid Build Coastguard Worker        if (__policy_->__is_null || typeid(_Tp) != *__policy_->__type_info)
2152*58b9f456SAndroid Build Coastguard Worker            return nullptr;
2153*58b9f456SAndroid Build Coastguard Worker        if (__policy_->__clone) // Out of line storage.
2154*58b9f456SAndroid Build Coastguard Worker            return reinterpret_cast<const _Tp*>(__buf_.__large);
2155*58b9f456SAndroid Build Coastguard Worker        else
2156*58b9f456SAndroid Build Coastguard Worker            return reinterpret_cast<const _Tp*>(&__buf_.__small);
2157*58b9f456SAndroid Build Coastguard Worker    }
2158*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI
2159*58b9f456SAndroid Build Coastguard Worker};
2160*58b9f456SAndroid Build Coastguard Worker
2161*58b9f456SAndroid Build Coastguard Worker}  // __function
2162*58b9f456SAndroid Build Coastguard Worker
2163*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2164*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>
2165*58b9f456SAndroid Build Coastguard Worker    : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,
2166*58b9f456SAndroid Build Coastguard Worker      public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>
2167*58b9f456SAndroid Build Coastguard Worker{
2168*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_ABI_OPTIMIZED_FUNCTION
2169*58b9f456SAndroid Build Coastguard Worker    typedef __function::__value_func<_Rp(_ArgTypes...)> __func;
2170*58b9f456SAndroid Build Coastguard Worker#else
2171*58b9f456SAndroid Build Coastguard Worker    typedef __function::__policy_func<_Rp(_ArgTypes...)> __func;
2172*58b9f456SAndroid Build Coastguard Worker#endif
2173*58b9f456SAndroid Build Coastguard Worker
2174*58b9f456SAndroid Build Coastguard Worker    __func __f_;
2175*58b9f456SAndroid Build Coastguard Worker
2176*58b9f456SAndroid Build Coastguard Worker    template <class _Fp, bool = __lazy_and<
2177*58b9f456SAndroid Build Coastguard Worker        integral_constant<bool, !is_same<__uncvref_t<_Fp>, function>::value>,
2178*58b9f456SAndroid Build Coastguard Worker        __invokable<_Fp&, _ArgTypes...>
2179*58b9f456SAndroid Build Coastguard Worker    >::value>
2180*58b9f456SAndroid Build Coastguard Worker    struct __callable;
2181*58b9f456SAndroid Build Coastguard Worker    template <class _Fp>
2182*58b9f456SAndroid Build Coastguard Worker        struct __callable<_Fp, true>
2183*58b9f456SAndroid Build Coastguard Worker        {
2184*58b9f456SAndroid Build Coastguard Worker            static const bool value = is_same<void, _Rp>::value ||
2185*58b9f456SAndroid Build Coastguard Worker                is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type,
2186*58b9f456SAndroid Build Coastguard Worker                               _Rp>::value;
2187*58b9f456SAndroid Build Coastguard Worker        };
2188*58b9f456SAndroid Build Coastguard Worker    template <class _Fp>
2189*58b9f456SAndroid Build Coastguard Worker        struct __callable<_Fp, false>
2190*58b9f456SAndroid Build Coastguard Worker        {
2191*58b9f456SAndroid Build Coastguard Worker            static const bool value = false;
2192*58b9f456SAndroid Build Coastguard Worker        };
2193*58b9f456SAndroid Build Coastguard Worker
2194*58b9f456SAndroid Build Coastguard Worker  template <class _Fp>
2195*58b9f456SAndroid Build Coastguard Worker  using _EnableIfCallable = typename enable_if<__callable<_Fp>::value>::type;
2196*58b9f456SAndroid Build Coastguard Workerpublic:
2197*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
2198*58b9f456SAndroid Build Coastguard Worker
2199*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy:
2200*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2201*58b9f456SAndroid Build Coastguard Worker    function() _NOEXCEPT { }
2202*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2203*58b9f456SAndroid Build Coastguard Worker    function(nullptr_t) _NOEXCEPT {}
2204*58b9f456SAndroid Build Coastguard Worker    function(const function&);
2205*58b9f456SAndroid Build Coastguard Worker    function(function&&) _NOEXCEPT;
2206*58b9f456SAndroid Build Coastguard Worker    template<class _Fp, class = _EnableIfCallable<_Fp>>
2207*58b9f456SAndroid Build Coastguard Worker    function(_Fp);
2208*58b9f456SAndroid Build Coastguard Worker
2209*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14
2210*58b9f456SAndroid Build Coastguard Worker    template<class _Alloc>
2211*58b9f456SAndroid Build Coastguard Worker      _LIBCPP_INLINE_VISIBILITY
2212*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
2213*58b9f456SAndroid Build Coastguard Worker    template<class _Alloc>
2214*58b9f456SAndroid Build Coastguard Worker      _LIBCPP_INLINE_VISIBILITY
2215*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT {}
2216*58b9f456SAndroid Build Coastguard Worker    template<class _Alloc>
2217*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const _Alloc&, const function&);
2218*58b9f456SAndroid Build Coastguard Worker    template<class _Alloc>
2219*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const _Alloc&, function&&);
2220*58b9f456SAndroid Build Coastguard Worker    template<class _Fp, class _Alloc, class = _EnableIfCallable<_Fp>>
2221*58b9f456SAndroid Build Coastguard Worker      function(allocator_arg_t, const _Alloc& __a, _Fp __f);
2222*58b9f456SAndroid Build Coastguard Worker#endif
2223*58b9f456SAndroid Build Coastguard Worker
2224*58b9f456SAndroid Build Coastguard Worker    function& operator=(const function&);
2225*58b9f456SAndroid Build Coastguard Worker    function& operator=(function&&) _NOEXCEPT;
2226*58b9f456SAndroid Build Coastguard Worker    function& operator=(nullptr_t) _NOEXCEPT;
2227*58b9f456SAndroid Build Coastguard Worker    template<class _Fp, class = _EnableIfCallable<_Fp>>
2228*58b9f456SAndroid Build Coastguard Worker    function& operator=(_Fp&&);
2229*58b9f456SAndroid Build Coastguard Worker
2230*58b9f456SAndroid Build Coastguard Worker    ~function();
2231*58b9f456SAndroid Build Coastguard Worker
2232*58b9f456SAndroid Build Coastguard Worker    // function modifiers:
2233*58b9f456SAndroid Build Coastguard Worker    void swap(function&) _NOEXCEPT;
2234*58b9f456SAndroid Build Coastguard Worker
2235*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14
2236*58b9f456SAndroid Build Coastguard Worker    template<class _Fp, class _Alloc>
2237*58b9f456SAndroid Build Coastguard Worker      _LIBCPP_INLINE_VISIBILITY
2238*58b9f456SAndroid Build Coastguard Worker      void assign(_Fp&& __f, const _Alloc& __a)
2239*58b9f456SAndroid Build Coastguard Worker        {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
2240*58b9f456SAndroid Build Coastguard Worker#endif
2241*58b9f456SAndroid Build Coastguard Worker
2242*58b9f456SAndroid Build Coastguard Worker    // function capacity:
2243*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2244*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
2245*58b9f456SAndroid Build Coastguard Worker      return static_cast<bool>(__f_);
2246*58b9f456SAndroid Build Coastguard Worker    }
2247*58b9f456SAndroid Build Coastguard Worker
2248*58b9f456SAndroid Build Coastguard Worker    // deleted overloads close possible hole in the type system
2249*58b9f456SAndroid Build Coastguard Worker    template<class _R2, class... _ArgTypes2>
2250*58b9f456SAndroid Build Coastguard Worker      bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;
2251*58b9f456SAndroid Build Coastguard Worker    template<class _R2, class... _ArgTypes2>
2252*58b9f456SAndroid Build Coastguard Worker      bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;
2253*58b9f456SAndroid Build Coastguard Workerpublic:
2254*58b9f456SAndroid Build Coastguard Worker    // function invocation:
2255*58b9f456SAndroid Build Coastguard Worker    _Rp operator()(_ArgTypes...) const;
2256*58b9f456SAndroid Build Coastguard Worker
2257*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
2258*58b9f456SAndroid Build Coastguard Worker    // function target access:
2259*58b9f456SAndroid Build Coastguard Worker    const std::type_info& target_type() const _NOEXCEPT;
2260*58b9f456SAndroid Build Coastguard Worker    template <typename _Tp> _Tp* target() _NOEXCEPT;
2261*58b9f456SAndroid Build Coastguard Worker    template <typename _Tp> const _Tp* target() const _NOEXCEPT;
2262*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_NO_RTTI
2263*58b9f456SAndroid Build Coastguard Worker};
2264*58b9f456SAndroid Build Coastguard Worker
2265*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2266*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(const function& __f) : __f_(__f.__f_) {}
2267*58b9f456SAndroid Build Coastguard Worker
2268*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14
2269*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2270*58b9f456SAndroid Build Coastguard Workertemplate <class _Alloc>
2271*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
2272*58b9f456SAndroid Build Coastguard Worker                                     const function& __f) : __f_(__f.__f_) {}
2273*58b9f456SAndroid Build Coastguard Worker#endif
2274*58b9f456SAndroid Build Coastguard Worker
2275*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2276*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
2277*58b9f456SAndroid Build Coastguard Worker    : __f_(_VSTD::move(__f.__f_)) {}
2278*58b9f456SAndroid Build Coastguard Worker
2279*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14
2280*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2281*58b9f456SAndroid Build Coastguard Workertemplate <class _Alloc>
2282*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
2283*58b9f456SAndroid Build Coastguard Worker                                      function&& __f)
2284*58b9f456SAndroid Build Coastguard Worker    : __f_(_VSTD::move(__f.__f_)) {}
2285*58b9f456SAndroid Build Coastguard Worker#endif
2286*58b9f456SAndroid Build Coastguard Worker
2287*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2288*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class>
2289*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(_Fp __f)
2290*58b9f456SAndroid Build Coastguard Worker    : __f_(_VSTD::move(__f), allocator<_Fp>()) {}
2291*58b9f456SAndroid Build Coastguard Worker
2292*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14
2293*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2294*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _Alloc, class>
2295*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a,
2296*58b9f456SAndroid Build Coastguard Worker                                      _Fp __f)
2297*58b9f456SAndroid Build Coastguard Worker    : __f_(_VSTD::move(__f), __a) {}
2298*58b9f456SAndroid Build Coastguard Worker#endif
2299*58b9f456SAndroid Build Coastguard Worker
2300*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2301*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>&
2302*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(const function& __f)
2303*58b9f456SAndroid Build Coastguard Worker{
2304*58b9f456SAndroid Build Coastguard Worker    function(__f).swap(*this);
2305*58b9f456SAndroid Build Coastguard Worker    return *this;
2306*58b9f456SAndroid Build Coastguard Worker}
2307*58b9f456SAndroid Build Coastguard Worker
2308*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2309*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>&
2310*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
2311*58b9f456SAndroid Build Coastguard Worker{
2312*58b9f456SAndroid Build Coastguard Worker    __f_ = std::move(__f.__f_);
2313*58b9f456SAndroid Build Coastguard Worker    return *this;
2314*58b9f456SAndroid Build Coastguard Worker}
2315*58b9f456SAndroid Build Coastguard Worker
2316*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2317*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>&
2318*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
2319*58b9f456SAndroid Build Coastguard Worker{
2320*58b9f456SAndroid Build Coastguard Worker    __f_ = nullptr;
2321*58b9f456SAndroid Build Coastguard Worker    return *this;
2322*58b9f456SAndroid Build Coastguard Worker}
2323*58b9f456SAndroid Build Coastguard Worker
2324*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2325*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class>
2326*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>&
2327*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
2328*58b9f456SAndroid Build Coastguard Worker{
2329*58b9f456SAndroid Build Coastguard Worker    function(_VSTD::forward<_Fp>(__f)).swap(*this);
2330*58b9f456SAndroid Build Coastguard Worker    return *this;
2331*58b9f456SAndroid Build Coastguard Worker}
2332*58b9f456SAndroid Build Coastguard Worker
2333*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2334*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::~function() {}
2335*58b9f456SAndroid Build Coastguard Worker
2336*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2337*58b9f456SAndroid Build Coastguard Workervoid
2338*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
2339*58b9f456SAndroid Build Coastguard Worker{
2340*58b9f456SAndroid Build Coastguard Worker    __f_.swap(__f.__f_);
2341*58b9f456SAndroid Build Coastguard Worker}
2342*58b9f456SAndroid Build Coastguard Worker
2343*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2344*58b9f456SAndroid Build Coastguard Worker_Rp
2345*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
2346*58b9f456SAndroid Build Coastguard Worker{
2347*58b9f456SAndroid Build Coastguard Worker    return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
2348*58b9f456SAndroid Build Coastguard Worker}
2349*58b9f456SAndroid Build Coastguard Worker
2350*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI
2351*58b9f456SAndroid Build Coastguard Worker
2352*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2353*58b9f456SAndroid Build Coastguard Workerconst std::type_info&
2354*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
2355*58b9f456SAndroid Build Coastguard Worker{
2356*58b9f456SAndroid Build Coastguard Worker    return __f_.target_type();
2357*58b9f456SAndroid Build Coastguard Worker}
2358*58b9f456SAndroid Build Coastguard Worker
2359*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2360*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
2361*58b9f456SAndroid Build Coastguard Worker_Tp*
2362*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::target() _NOEXCEPT
2363*58b9f456SAndroid Build Coastguard Worker{
2364*58b9f456SAndroid Build Coastguard Worker    return (_Tp*)(__f_.template target<_Tp>());
2365*58b9f456SAndroid Build Coastguard Worker}
2366*58b9f456SAndroid Build Coastguard Worker
2367*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes>
2368*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
2369*58b9f456SAndroid Build Coastguard Workerconst _Tp*
2370*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
2371*58b9f456SAndroid Build Coastguard Worker{
2372*58b9f456SAndroid Build Coastguard Worker    return __f_.template target<_Tp>();
2373*58b9f456SAndroid Build Coastguard Worker}
2374*58b9f456SAndroid Build Coastguard Worker
2375*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_NO_RTTI
2376*58b9f456SAndroid Build Coastguard Worker
2377*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2378*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2379*58b9f456SAndroid Build Coastguard Workerbool
2380*58b9f456SAndroid Build Coastguard Workeroperator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
2381*58b9f456SAndroid Build Coastguard Worker
2382*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2383*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2384*58b9f456SAndroid Build Coastguard Workerbool
2385*58b9f456SAndroid Build Coastguard Workeroperator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
2386*58b9f456SAndroid Build Coastguard Worker
2387*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2388*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2389*58b9f456SAndroid Build Coastguard Workerbool
2390*58b9f456SAndroid Build Coastguard Workeroperator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
2391*58b9f456SAndroid Build Coastguard Worker
2392*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2393*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2394*58b9f456SAndroid Build Coastguard Workerbool
2395*58b9f456SAndroid Build Coastguard Workeroperator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
2396*58b9f456SAndroid Build Coastguard Worker
2397*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes>
2398*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2399*58b9f456SAndroid Build Coastguard Workervoid
2400*58b9f456SAndroid Build Coastguard Workerswap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
2401*58b9f456SAndroid Build Coastguard Worker{return __x.swap(__y);}
2402*58b9f456SAndroid Build Coastguard Worker
2403*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_CXX03_LANG
2404*58b9f456SAndroid Build Coastguard Worker
2405*58b9f456SAndroid Build Coastguard Worker#include <__functional_03>
2406*58b9f456SAndroid Build Coastguard Worker
2407*58b9f456SAndroid Build Coastguard Worker#endif
2408*58b9f456SAndroid Build Coastguard Worker
2409*58b9f456SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
2410*58b9f456SAndroid Build Coastguard Worker//                                  BIND
2411*58b9f456SAndroid Build Coastguard Worker//==============================================================================
2412*58b9f456SAndroid Build Coastguard Worker
2413*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct __is_bind_expression : public false_type {};
2414*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_bind_expression
2415*58b9f456SAndroid Build Coastguard Worker    : public __is_bind_expression<typename remove_cv<_Tp>::type> {};
2416*58b9f456SAndroid Build Coastguard Worker
2417*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14
2418*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
2419*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value;
2420*58b9f456SAndroid Build Coastguard Worker#endif
2421*58b9f456SAndroid Build Coastguard Worker
2422*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
2423*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_placeholder
2424*58b9f456SAndroid Build Coastguard Worker    : public __is_placeholder<typename remove_cv<_Tp>::type> {};
2425*58b9f456SAndroid Build Coastguard Worker
2426*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14
2427*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
2428*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value;
2429*58b9f456SAndroid Build Coastguard Worker#endif
2430*58b9f456SAndroid Build Coastguard Worker
2431*58b9f456SAndroid Build Coastguard Workernamespace placeholders
2432*58b9f456SAndroid Build Coastguard Worker{
2433*58b9f456SAndroid Build Coastguard Worker
2434*58b9f456SAndroid Build Coastguard Workertemplate <int _Np> struct __ph {};
2435*58b9f456SAndroid Build Coastguard Worker
2436*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
2437*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<1>   _1;
2438*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<2>   _2;
2439*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<3>   _3;
2440*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<4>   _4;
2441*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<5>   _5;
2442*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<6>   _6;
2443*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<7>   _7;
2444*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<8>   _8;
2445*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<9>   _9;
2446*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<10> _10;
2447*58b9f456SAndroid Build Coastguard Worker#else
2448*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<1>   _1{};
2449*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<2>   _2{};
2450*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<3>   _3{};
2451*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<4>   _4{};
2452*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<5>   _5{};
2453*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<6>   _6{};
2454*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<7>   _7{};
2455*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<8>   _8{};
2456*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<9>   _9{};
2457*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<10> _10{};
2458*58b9f456SAndroid Build Coastguard Worker#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
2459*58b9f456SAndroid Build Coastguard Worker
2460*58b9f456SAndroid Build Coastguard Worker}  // placeholders
2461*58b9f456SAndroid Build Coastguard Worker
2462*58b9f456SAndroid Build Coastguard Workertemplate<int _Np>
2463*58b9f456SAndroid Build Coastguard Workerstruct __is_placeholder<placeholders::__ph<_Np> >
2464*58b9f456SAndroid Build Coastguard Worker    : public integral_constant<int, _Np> {};
2465*58b9f456SAndroid Build Coastguard Worker
2466*58b9f456SAndroid Build Coastguard Worker
2467*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
2468*58b9f456SAndroid Build Coastguard Worker
2469*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Uj>
2470*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2471*58b9f456SAndroid Build Coastguard Worker_Tp&
2472*58b9f456SAndroid Build Coastguard Worker__mu(reference_wrapper<_Tp> __t, _Uj&)
2473*58b9f456SAndroid Build Coastguard Worker{
2474*58b9f456SAndroid Build Coastguard Worker    return __t.get();
2475*58b9f456SAndroid Build Coastguard Worker}
2476*58b9f456SAndroid Build Coastguard Worker
2477*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj, size_t ..._Indx>
2478*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2479*58b9f456SAndroid Build Coastguard Workertypename __invoke_of<_Ti&, _Uj...>::type
2480*58b9f456SAndroid Build Coastguard Worker__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>)
2481*58b9f456SAndroid Build Coastguard Worker{
2482*58b9f456SAndroid Build Coastguard Worker    return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...);
2483*58b9f456SAndroid Build Coastguard Worker}
2484*58b9f456SAndroid Build Coastguard Worker
2485*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj>
2486*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2487*58b9f456SAndroid Build Coastguard Workertypename __lazy_enable_if
2488*58b9f456SAndroid Build Coastguard Worker<
2489*58b9f456SAndroid Build Coastguard Worker    is_bind_expression<_Ti>::value,
2490*58b9f456SAndroid Build Coastguard Worker    __invoke_of<_Ti&, _Uj...>
2491*58b9f456SAndroid Build Coastguard Worker>::type
2492*58b9f456SAndroid Build Coastguard Worker__mu(_Ti& __ti, tuple<_Uj...>& __uj)
2493*58b9f456SAndroid Build Coastguard Worker{
2494*58b9f456SAndroid Build Coastguard Worker    typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
2495*58b9f456SAndroid Build Coastguard Worker    return  __mu_expand(__ti, __uj, __indices());
2496*58b9f456SAndroid Build Coastguard Worker}
2497*58b9f456SAndroid Build Coastguard Worker
2498*58b9f456SAndroid Build Coastguard Workertemplate <bool IsPh, class _Ti, class _Uj>
2499*58b9f456SAndroid Build Coastguard Workerstruct __mu_return2 {};
2500*58b9f456SAndroid Build Coastguard Worker
2501*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _Uj>
2502*58b9f456SAndroid Build Coastguard Workerstruct __mu_return2<true, _Ti, _Uj>
2503*58b9f456SAndroid Build Coastguard Worker{
2504*58b9f456SAndroid Build Coastguard Worker    typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type;
2505*58b9f456SAndroid Build Coastguard Worker};
2506*58b9f456SAndroid Build Coastguard Worker
2507*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _Uj>
2508*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2509*58b9f456SAndroid Build Coastguard Workertypename enable_if
2510*58b9f456SAndroid Build Coastguard Worker<
2511*58b9f456SAndroid Build Coastguard Worker    0 < is_placeholder<_Ti>::value,
2512*58b9f456SAndroid Build Coastguard Worker    typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type
2513*58b9f456SAndroid Build Coastguard Worker>::type
2514*58b9f456SAndroid Build Coastguard Worker__mu(_Ti&, _Uj& __uj)
2515*58b9f456SAndroid Build Coastguard Worker{
2516*58b9f456SAndroid Build Coastguard Worker    const size_t _Indx = is_placeholder<_Ti>::value - 1;
2517*58b9f456SAndroid Build Coastguard Worker    return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj));
2518*58b9f456SAndroid Build Coastguard Worker}
2519*58b9f456SAndroid Build Coastguard Worker
2520*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _Uj>
2521*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2522*58b9f456SAndroid Build Coastguard Workertypename enable_if
2523*58b9f456SAndroid Build Coastguard Worker<
2524*58b9f456SAndroid Build Coastguard Worker    !is_bind_expression<_Ti>::value &&
2525*58b9f456SAndroid Build Coastguard Worker    is_placeholder<_Ti>::value == 0 &&
2526*58b9f456SAndroid Build Coastguard Worker    !__is_reference_wrapper<_Ti>::value,
2527*58b9f456SAndroid Build Coastguard Worker    _Ti&
2528*58b9f456SAndroid Build Coastguard Worker>::type
2529*58b9f456SAndroid Build Coastguard Worker__mu(_Ti& __ti, _Uj&)
2530*58b9f456SAndroid Build Coastguard Worker{
2531*58b9f456SAndroid Build Coastguard Worker    return __ti;
2532*58b9f456SAndroid Build Coastguard Worker}
2533*58b9f456SAndroid Build Coastguard Worker
2534*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
2535*58b9f456SAndroid Build Coastguard Worker          class _TupleUj>
2536*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl;
2537*58b9f456SAndroid Build Coastguard Worker
2538*58b9f456SAndroid Build Coastguard Workertemplate <bool _Invokable, class _Ti, class ..._Uj>
2539*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_invokable  // false
2540*58b9f456SAndroid Build Coastguard Worker{
2541*58b9f456SAndroid Build Coastguard Worker    typedef __nat type;
2542*58b9f456SAndroid Build Coastguard Worker};
2543*58b9f456SAndroid Build Coastguard Worker
2544*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj>
2545*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_invokable<true, _Ti, _Uj...>
2546*58b9f456SAndroid Build Coastguard Worker{
2547*58b9f456SAndroid Build Coastguard Worker    typedef typename __invoke_of<_Ti&, _Uj...>::type type;
2548*58b9f456SAndroid Build Coastguard Worker};
2549*58b9f456SAndroid Build Coastguard Worker
2550*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj>
2551*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, false, true, false, tuple<_Uj...> >
2552*58b9f456SAndroid Build Coastguard Worker    : public __mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
2553*58b9f456SAndroid Build Coastguard Worker{
2554*58b9f456SAndroid Build Coastguard Worker};
2555*58b9f456SAndroid Build Coastguard Worker
2556*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj>
2557*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, false, false, true, _TupleUj>
2558*58b9f456SAndroid Build Coastguard Worker{
2559*58b9f456SAndroid Build Coastguard Worker    typedef typename tuple_element<is_placeholder<_Ti>::value - 1,
2560*58b9f456SAndroid Build Coastguard Worker                                   _TupleUj>::type&& type;
2561*58b9f456SAndroid Build Coastguard Worker};
2562*58b9f456SAndroid Build Coastguard Worker
2563*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj>
2564*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, true, false, false, _TupleUj>
2565*58b9f456SAndroid Build Coastguard Worker{
2566*58b9f456SAndroid Build Coastguard Worker    typedef typename _Ti::type& type;
2567*58b9f456SAndroid Build Coastguard Worker};
2568*58b9f456SAndroid Build Coastguard Worker
2569*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj>
2570*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, false, false, false, _TupleUj>
2571*58b9f456SAndroid Build Coastguard Worker{
2572*58b9f456SAndroid Build Coastguard Worker    typedef _Ti& type;
2573*58b9f456SAndroid Build Coastguard Worker};
2574*58b9f456SAndroid Build Coastguard Worker
2575*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj>
2576*58b9f456SAndroid Build Coastguard Workerstruct __mu_return
2577*58b9f456SAndroid Build Coastguard Worker    : public __mu_return_impl<_Ti,
2578*58b9f456SAndroid Build Coastguard Worker                              __is_reference_wrapper<_Ti>::value,
2579*58b9f456SAndroid Build Coastguard Worker                              is_bind_expression<_Ti>::value,
2580*58b9f456SAndroid Build Coastguard Worker                              0 < is_placeholder<_Ti>::value &&
2581*58b9f456SAndroid Build Coastguard Worker                              is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value,
2582*58b9f456SAndroid Build Coastguard Worker                              _TupleUj>
2583*58b9f456SAndroid Build Coastguard Worker{
2584*58b9f456SAndroid Build Coastguard Worker};
2585*58b9f456SAndroid Build Coastguard Worker
2586*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _BoundArgs, class _TupleUj>
2587*58b9f456SAndroid Build Coastguard Workerstruct __is_valid_bind_return
2588*58b9f456SAndroid Build Coastguard Worker{
2589*58b9f456SAndroid Build Coastguard Worker    static const bool value = false;
2590*58b9f456SAndroid Build Coastguard Worker};
2591*58b9f456SAndroid Build Coastguard Worker
2592*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
2593*58b9f456SAndroid Build Coastguard Workerstruct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj>
2594*58b9f456SAndroid Build Coastguard Worker{
2595*58b9f456SAndroid Build Coastguard Worker    static const bool value = __invokable<_Fp,
2596*58b9f456SAndroid Build Coastguard Worker                    typename __mu_return<_BoundArgs, _TupleUj>::type...>::value;
2597*58b9f456SAndroid Build Coastguard Worker};
2598*58b9f456SAndroid Build Coastguard Worker
2599*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
2600*58b9f456SAndroid Build Coastguard Workerstruct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj>
2601*58b9f456SAndroid Build Coastguard Worker{
2602*58b9f456SAndroid Build Coastguard Worker    static const bool value = __invokable<_Fp,
2603*58b9f456SAndroid Build Coastguard Worker                    typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value;
2604*58b9f456SAndroid Build Coastguard Worker};
2605*58b9f456SAndroid Build Coastguard Worker
2606*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _BoundArgs, class _TupleUj,
2607*58b9f456SAndroid Build Coastguard Worker          bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
2608*58b9f456SAndroid Build Coastguard Workerstruct __bind_return;
2609*58b9f456SAndroid Build Coastguard Worker
2610*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
2611*58b9f456SAndroid Build Coastguard Workerstruct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true>
2612*58b9f456SAndroid Build Coastguard Worker{
2613*58b9f456SAndroid Build Coastguard Worker    typedef typename __invoke_of
2614*58b9f456SAndroid Build Coastguard Worker    <
2615*58b9f456SAndroid Build Coastguard Worker        _Fp&,
2616*58b9f456SAndroid Build Coastguard Worker        typename __mu_return
2617*58b9f456SAndroid Build Coastguard Worker        <
2618*58b9f456SAndroid Build Coastguard Worker            _BoundArgs,
2619*58b9f456SAndroid Build Coastguard Worker            _TupleUj
2620*58b9f456SAndroid Build Coastguard Worker        >::type...
2621*58b9f456SAndroid Build Coastguard Worker    >::type type;
2622*58b9f456SAndroid Build Coastguard Worker};
2623*58b9f456SAndroid Build Coastguard Worker
2624*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
2625*58b9f456SAndroid Build Coastguard Workerstruct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true>
2626*58b9f456SAndroid Build Coastguard Worker{
2627*58b9f456SAndroid Build Coastguard Worker    typedef typename __invoke_of
2628*58b9f456SAndroid Build Coastguard Worker    <
2629*58b9f456SAndroid Build Coastguard Worker        _Fp&,
2630*58b9f456SAndroid Build Coastguard Worker        typename __mu_return
2631*58b9f456SAndroid Build Coastguard Worker        <
2632*58b9f456SAndroid Build Coastguard Worker            const _BoundArgs,
2633*58b9f456SAndroid Build Coastguard Worker            _TupleUj
2634*58b9f456SAndroid Build Coastguard Worker        >::type...
2635*58b9f456SAndroid Build Coastguard Worker    >::type type;
2636*58b9f456SAndroid Build Coastguard Worker};
2637*58b9f456SAndroid Build Coastguard Worker
2638*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args>
2639*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2640*58b9f456SAndroid Build Coastguard Workertypename __bind_return<_Fp, _BoundArgs, _Args>::type
2641*58b9f456SAndroid Build Coastguard Worker__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
2642*58b9f456SAndroid Build Coastguard Worker                _Args&& __args)
2643*58b9f456SAndroid Build Coastguard Worker{
2644*58b9f456SAndroid Build Coastguard Worker    return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...);
2645*58b9f456SAndroid Build Coastguard Worker}
2646*58b9f456SAndroid Build Coastguard Worker
2647*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class ..._BoundArgs>
2648*58b9f456SAndroid Build Coastguard Workerclass __bind
2649*58b9f456SAndroid Build Coastguard Worker    : public __weak_result_type<typename decay<_Fp>::type>
2650*58b9f456SAndroid Build Coastguard Worker{
2651*58b9f456SAndroid Build Coastguard Workerprotected:
2652*58b9f456SAndroid Build Coastguard Worker    typedef typename decay<_Fp>::type _Fd;
2653*58b9f456SAndroid Build Coastguard Worker    typedef tuple<typename decay<_BoundArgs>::type...> _Td;
2654*58b9f456SAndroid Build Coastguard Workerprivate:
2655*58b9f456SAndroid Build Coastguard Worker    _Fd __f_;
2656*58b9f456SAndroid Build Coastguard Worker    _Td __bound_args_;
2657*58b9f456SAndroid Build Coastguard Worker
2658*58b9f456SAndroid Build Coastguard Worker    typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
2659*58b9f456SAndroid Build Coastguard Workerpublic:
2660*58b9f456SAndroid Build Coastguard Worker    template <class _Gp, class ..._BA,
2661*58b9f456SAndroid Build Coastguard Worker              class = typename enable_if
2662*58b9f456SAndroid Build Coastguard Worker                               <
2663*58b9f456SAndroid Build Coastguard Worker                                  is_constructible<_Fd, _Gp>::value &&
2664*58b9f456SAndroid Build Coastguard Worker                                  !is_same<typename remove_reference<_Gp>::type,
2665*58b9f456SAndroid Build Coastguard Worker                                           __bind>::value
2666*58b9f456SAndroid Build Coastguard Worker                               >::type>
2667*58b9f456SAndroid Build Coastguard Worker      _LIBCPP_INLINE_VISIBILITY
2668*58b9f456SAndroid Build Coastguard Worker      explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
2669*58b9f456SAndroid Build Coastguard Worker        : __f_(_VSTD::forward<_Gp>(__f)),
2670*58b9f456SAndroid Build Coastguard Worker          __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
2671*58b9f456SAndroid Build Coastguard Worker
2672*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2673*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2674*58b9f456SAndroid Build Coastguard Worker        typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
2675*58b9f456SAndroid Build Coastguard Worker        operator()(_Args&& ...__args)
2676*58b9f456SAndroid Build Coastguard Worker        {
2677*58b9f456SAndroid Build Coastguard Worker            return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
2678*58b9f456SAndroid Build Coastguard Worker                                  tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
2679*58b9f456SAndroid Build Coastguard Worker        }
2680*58b9f456SAndroid Build Coastguard Worker
2681*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2682*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2683*58b9f456SAndroid Build Coastguard Worker        typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
2684*58b9f456SAndroid Build Coastguard Worker        operator()(_Args&& ...__args) const
2685*58b9f456SAndroid Build Coastguard Worker        {
2686*58b9f456SAndroid Build Coastguard Worker            return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
2687*58b9f456SAndroid Build Coastguard Worker                                   tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
2688*58b9f456SAndroid Build Coastguard Worker        }
2689*58b9f456SAndroid Build Coastguard Worker};
2690*58b9f456SAndroid Build Coastguard Worker
2691*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class ..._BoundArgs>
2692*58b9f456SAndroid Build Coastguard Workerstruct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {};
2693*58b9f456SAndroid Build Coastguard Worker
2694*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Fp, class ..._BoundArgs>
2695*58b9f456SAndroid Build Coastguard Workerclass __bind_r
2696*58b9f456SAndroid Build Coastguard Worker    : public __bind<_Fp, _BoundArgs...>
2697*58b9f456SAndroid Build Coastguard Worker{
2698*58b9f456SAndroid Build Coastguard Worker    typedef __bind<_Fp, _BoundArgs...> base;
2699*58b9f456SAndroid Build Coastguard Worker    typedef typename base::_Fd _Fd;
2700*58b9f456SAndroid Build Coastguard Worker    typedef typename base::_Td _Td;
2701*58b9f456SAndroid Build Coastguard Workerpublic:
2702*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
2703*58b9f456SAndroid Build Coastguard Worker
2704*58b9f456SAndroid Build Coastguard Worker
2705*58b9f456SAndroid Build Coastguard Worker    template <class _Gp, class ..._BA,
2706*58b9f456SAndroid Build Coastguard Worker              class = typename enable_if
2707*58b9f456SAndroid Build Coastguard Worker                               <
2708*58b9f456SAndroid Build Coastguard Worker                                  is_constructible<_Fd, _Gp>::value &&
2709*58b9f456SAndroid Build Coastguard Worker                                  !is_same<typename remove_reference<_Gp>::type,
2710*58b9f456SAndroid Build Coastguard Worker                                           __bind_r>::value
2711*58b9f456SAndroid Build Coastguard Worker                               >::type>
2712*58b9f456SAndroid Build Coastguard Worker      _LIBCPP_INLINE_VISIBILITY
2713*58b9f456SAndroid Build Coastguard Worker      explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
2714*58b9f456SAndroid Build Coastguard Worker        : base(_VSTD::forward<_Gp>(__f),
2715*58b9f456SAndroid Build Coastguard Worker               _VSTD::forward<_BA>(__bound_args)...) {}
2716*58b9f456SAndroid Build Coastguard Worker
2717*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2718*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2719*58b9f456SAndroid Build Coastguard Worker        typename enable_if
2720*58b9f456SAndroid Build Coastguard Worker        <
2721*58b9f456SAndroid Build Coastguard Worker            is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
2722*58b9f456SAndroid Build Coastguard Worker                           result_type>::value || is_void<_Rp>::value,
2723*58b9f456SAndroid Build Coastguard Worker            result_type
2724*58b9f456SAndroid Build Coastguard Worker        >::type
2725*58b9f456SAndroid Build Coastguard Worker        operator()(_Args&& ...__args)
2726*58b9f456SAndroid Build Coastguard Worker        {
2727*58b9f456SAndroid Build Coastguard Worker            typedef __invoke_void_return_wrapper<_Rp> _Invoker;
2728*58b9f456SAndroid Build Coastguard Worker            return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);
2729*58b9f456SAndroid Build Coastguard Worker        }
2730*58b9f456SAndroid Build Coastguard Worker
2731*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2732*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2733*58b9f456SAndroid Build Coastguard Worker        typename enable_if
2734*58b9f456SAndroid Build Coastguard Worker        <
2735*58b9f456SAndroid Build Coastguard Worker            is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
2736*58b9f456SAndroid Build Coastguard Worker                           result_type>::value || is_void<_Rp>::value,
2737*58b9f456SAndroid Build Coastguard Worker            result_type
2738*58b9f456SAndroid Build Coastguard Worker        >::type
2739*58b9f456SAndroid Build Coastguard Worker        operator()(_Args&& ...__args) const
2740*58b9f456SAndroid Build Coastguard Worker        {
2741*58b9f456SAndroid Build Coastguard Worker            typedef __invoke_void_return_wrapper<_Rp> _Invoker;
2742*58b9f456SAndroid Build Coastguard Worker            return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);
2743*58b9f456SAndroid Build Coastguard Worker        }
2744*58b9f456SAndroid Build Coastguard Worker};
2745*58b9f456SAndroid Build Coastguard Worker
2746*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Fp, class ..._BoundArgs>
2747*58b9f456SAndroid Build Coastguard Workerstruct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
2748*58b9f456SAndroid Build Coastguard Worker
2749*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class ..._BoundArgs>
2750*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2751*58b9f456SAndroid Build Coastguard Worker__bind<_Fp, _BoundArgs...>
2752*58b9f456SAndroid Build Coastguard Workerbind(_Fp&& __f, _BoundArgs&&... __bound_args)
2753*58b9f456SAndroid Build Coastguard Worker{
2754*58b9f456SAndroid Build Coastguard Worker    typedef __bind<_Fp, _BoundArgs...> type;
2755*58b9f456SAndroid Build Coastguard Worker    return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
2756*58b9f456SAndroid Build Coastguard Worker}
2757*58b9f456SAndroid Build Coastguard Worker
2758*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Fp, class ..._BoundArgs>
2759*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2760*58b9f456SAndroid Build Coastguard Worker__bind_r<_Rp, _Fp, _BoundArgs...>
2761*58b9f456SAndroid Build Coastguard Workerbind(_Fp&& __f, _BoundArgs&&... __bound_args)
2762*58b9f456SAndroid Build Coastguard Worker{
2763*58b9f456SAndroid Build Coastguard Worker    typedef __bind_r<_Rp, _Fp, _BoundArgs...> type;
2764*58b9f456SAndroid Build Coastguard Worker    return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
2765*58b9f456SAndroid Build Coastguard Worker}
2766*58b9f456SAndroid Build Coastguard Worker
2767*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CXX03_LANG
2768*58b9f456SAndroid Build Coastguard Worker
2769*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14
2770*58b9f456SAndroid Build Coastguard Worker
2771*58b9f456SAndroid Build Coastguard Workertemplate <class _Fn, class ..._Args>
2772*58b9f456SAndroid Build Coastguard Workerresult_of_t<_Fn&&(_Args&&...)>
2773*58b9f456SAndroid Build Coastguard Workerinvoke(_Fn&& __f, _Args&&... __args)
2774*58b9f456SAndroid Build Coastguard Worker    noexcept(noexcept(_VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...)))
2775*58b9f456SAndroid Build Coastguard Worker{
2776*58b9f456SAndroid Build Coastguard Worker    return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
2777*58b9f456SAndroid Build Coastguard Worker}
2778*58b9f456SAndroid Build Coastguard Worker
2779*58b9f456SAndroid Build Coastguard Workertemplate <class _DecayFunc>
2780*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS __not_fn_imp {
2781*58b9f456SAndroid Build Coastguard Worker  _DecayFunc __fd;
2782*58b9f456SAndroid Build Coastguard Worker
2783*58b9f456SAndroid Build Coastguard Workerpublic:
2784*58b9f456SAndroid Build Coastguard Worker    __not_fn_imp() = delete;
2785*58b9f456SAndroid Build Coastguard Worker
2786*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2787*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2788*58b9f456SAndroid Build Coastguard Worker    auto operator()(_Args&& ...__args) &
2789*58b9f456SAndroid Build Coastguard Worker            noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
2790*58b9f456SAndroid Build Coastguard Worker        -> decltype(          !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
2791*58b9f456SAndroid Build Coastguard Worker        { return              !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
2792*58b9f456SAndroid Build Coastguard Worker
2793*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2794*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2795*58b9f456SAndroid Build Coastguard Worker    auto operator()(_Args&& ...__args) &&
2796*58b9f456SAndroid Build Coastguard Worker            noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
2797*58b9f456SAndroid Build Coastguard Worker        -> decltype(          !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
2798*58b9f456SAndroid Build Coastguard Worker        { return              !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
2799*58b9f456SAndroid Build Coastguard Worker
2800*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2801*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2802*58b9f456SAndroid Build Coastguard Worker    auto operator()(_Args&& ...__args) const&
2803*58b9f456SAndroid Build Coastguard Worker            noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
2804*58b9f456SAndroid Build Coastguard Worker        -> decltype(          !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
2805*58b9f456SAndroid Build Coastguard Worker        { return              !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
2806*58b9f456SAndroid Build Coastguard Worker
2807*58b9f456SAndroid Build Coastguard Worker
2808*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
2809*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2810*58b9f456SAndroid Build Coastguard Worker    auto operator()(_Args&& ...__args) const&&
2811*58b9f456SAndroid Build Coastguard Worker            noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
2812*58b9f456SAndroid Build Coastguard Worker        -> decltype(          !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
2813*58b9f456SAndroid Build Coastguard Worker        { return              !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
2814*58b9f456SAndroid Build Coastguard Worker
2815*58b9f456SAndroid Build Coastguard Workerprivate:
2816*58b9f456SAndroid Build Coastguard Worker    template <class _RawFunc,
2817*58b9f456SAndroid Build Coastguard Worker              class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>>
2818*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2819*58b9f456SAndroid Build Coastguard Worker    explicit __not_fn_imp(_RawFunc&& __rf)
2820*58b9f456SAndroid Build Coastguard Worker        : __fd(_VSTD::forward<_RawFunc>(__rf)) {}
2821*58b9f456SAndroid Build Coastguard Worker
2822*58b9f456SAndroid Build Coastguard Worker    template <class _RawFunc>
2823*58b9f456SAndroid Build Coastguard Worker    friend inline _LIBCPP_INLINE_VISIBILITY
2824*58b9f456SAndroid Build Coastguard Worker    __not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&);
2825*58b9f456SAndroid Build Coastguard Worker};
2826*58b9f456SAndroid Build Coastguard Worker
2827*58b9f456SAndroid Build Coastguard Workertemplate <class _RawFunc>
2828*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2829*58b9f456SAndroid Build Coastguard Worker__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) {
2830*58b9f456SAndroid Build Coastguard Worker    return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn));
2831*58b9f456SAndroid Build Coastguard Worker}
2832*58b9f456SAndroid Build Coastguard Worker
2833*58b9f456SAndroid Build Coastguard Worker#endif
2834*58b9f456SAndroid Build Coastguard Worker
2835*58b9f456SAndroid Build Coastguard Worker// struct hash<T*> in <memory>
2836*58b9f456SAndroid Build Coastguard Worker
2837*58b9f456SAndroid Build Coastguard Workertemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
2838*58b9f456SAndroid Build Coastguard Workerpair<_ForwardIterator1, _ForwardIterator1> _LIBCPP_CONSTEXPR_AFTER_CXX11
2839*58b9f456SAndroid Build Coastguard Worker__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
2840*58b9f456SAndroid Build Coastguard Worker         _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
2841*58b9f456SAndroid Build Coastguard Worker         forward_iterator_tag, forward_iterator_tag)
2842*58b9f456SAndroid Build Coastguard Worker{
2843*58b9f456SAndroid Build Coastguard Worker    if (__first2 == __last2)
2844*58b9f456SAndroid Build Coastguard Worker        return make_pair(__first1, __first1);  // Everything matches an empty sequence
2845*58b9f456SAndroid Build Coastguard Worker    while (true)
2846*58b9f456SAndroid Build Coastguard Worker    {
2847*58b9f456SAndroid Build Coastguard Worker        // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
2848*58b9f456SAndroid Build Coastguard Worker        while (true)
2849*58b9f456SAndroid Build Coastguard Worker        {
2850*58b9f456SAndroid Build Coastguard Worker            if (__first1 == __last1)  // return __last1 if no element matches *__first2
2851*58b9f456SAndroid Build Coastguard Worker                return make_pair(__last1, __last1);
2852*58b9f456SAndroid Build Coastguard Worker            if (__pred(*__first1, *__first2))
2853*58b9f456SAndroid Build Coastguard Worker                break;
2854*58b9f456SAndroid Build Coastguard Worker            ++__first1;
2855*58b9f456SAndroid Build Coastguard Worker        }
2856*58b9f456SAndroid Build Coastguard Worker        // *__first1 matches *__first2, now match elements after here
2857*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator1 __m1 = __first1;
2858*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator2 __m2 = __first2;
2859*58b9f456SAndroid Build Coastguard Worker        while (true)
2860*58b9f456SAndroid Build Coastguard Worker        {
2861*58b9f456SAndroid Build Coastguard Worker            if (++__m2 == __last2)  // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
2862*58b9f456SAndroid Build Coastguard Worker                return make_pair(__first1, __m1);
2863*58b9f456SAndroid Build Coastguard Worker            if (++__m1 == __last1)  // Otherwise if source exhaused, pattern not found
2864*58b9f456SAndroid Build Coastguard Worker                return make_pair(__last1, __last1);
2865*58b9f456SAndroid Build Coastguard Worker            if (!__pred(*__m1, *__m2))  // if there is a mismatch, restart with a new __first1
2866*58b9f456SAndroid Build Coastguard Worker            {
2867*58b9f456SAndroid Build Coastguard Worker                ++__first1;
2868*58b9f456SAndroid Build Coastguard Worker                break;
2869*58b9f456SAndroid Build Coastguard Worker            }  // else there is a match, check next elements
2870*58b9f456SAndroid Build Coastguard Worker        }
2871*58b9f456SAndroid Build Coastguard Worker    }
2872*58b9f456SAndroid Build Coastguard Worker}
2873*58b9f456SAndroid Build Coastguard Worker
2874*58b9f456SAndroid Build Coastguard Workertemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
2875*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR_AFTER_CXX11
2876*58b9f456SAndroid Build Coastguard Workerpair<_RandomAccessIterator1, _RandomAccessIterator1>
2877*58b9f456SAndroid Build Coastguard Worker__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
2878*58b9f456SAndroid Build Coastguard Worker         _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
2879*58b9f456SAndroid Build Coastguard Worker           random_access_iterator_tag, random_access_iterator_tag)
2880*58b9f456SAndroid Build Coastguard Worker{
2881*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<_RandomAccessIterator1>::difference_type _D1;
2882*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<_RandomAccessIterator2>::difference_type _D2;
2883*58b9f456SAndroid Build Coastguard Worker    // Take advantage of knowing source and pattern lengths.  Stop short when source is smaller than pattern
2884*58b9f456SAndroid Build Coastguard Worker    const _D2 __len2 = __last2 - __first2;
2885*58b9f456SAndroid Build Coastguard Worker    if (__len2 == 0)
2886*58b9f456SAndroid Build Coastguard Worker        return make_pair(__first1, __first1);
2887*58b9f456SAndroid Build Coastguard Worker    const _D1 __len1 = __last1 - __first1;
2888*58b9f456SAndroid Build Coastguard Worker    if (__len1 < __len2)
2889*58b9f456SAndroid Build Coastguard Worker        return make_pair(__last1, __last1);
2890*58b9f456SAndroid Build Coastguard Worker    const _RandomAccessIterator1 __s = __last1 - (__len2 - 1);  // Start of pattern match can't go beyond here
2891*58b9f456SAndroid Build Coastguard Worker
2892*58b9f456SAndroid Build Coastguard Worker    while (true)
2893*58b9f456SAndroid Build Coastguard Worker    {
2894*58b9f456SAndroid Build Coastguard Worker        while (true)
2895*58b9f456SAndroid Build Coastguard Worker        {
2896*58b9f456SAndroid Build Coastguard Worker            if (__first1 == __s)
2897*58b9f456SAndroid Build Coastguard Worker                return make_pair(__last1, __last1);
2898*58b9f456SAndroid Build Coastguard Worker            if (__pred(*__first1, *__first2))
2899*58b9f456SAndroid Build Coastguard Worker                break;
2900*58b9f456SAndroid Build Coastguard Worker            ++__first1;
2901*58b9f456SAndroid Build Coastguard Worker        }
2902*58b9f456SAndroid Build Coastguard Worker
2903*58b9f456SAndroid Build Coastguard Worker        _RandomAccessIterator1 __m1 = __first1;
2904*58b9f456SAndroid Build Coastguard Worker        _RandomAccessIterator2 __m2 = __first2;
2905*58b9f456SAndroid Build Coastguard Worker         while (true)
2906*58b9f456SAndroid Build Coastguard Worker         {
2907*58b9f456SAndroid Build Coastguard Worker             if (++__m2 == __last2)
2908*58b9f456SAndroid Build Coastguard Worker                 return make_pair(__first1, __first1 + __len2);
2909*58b9f456SAndroid Build Coastguard Worker             ++__m1;          // no need to check range on __m1 because __s guarantees we have enough source
2910*58b9f456SAndroid Build Coastguard Worker             if (!__pred(*__m1, *__m2))
2911*58b9f456SAndroid Build Coastguard Worker             {
2912*58b9f456SAndroid Build Coastguard Worker                 ++__first1;
2913*58b9f456SAndroid Build Coastguard Worker                 break;
2914*58b9f456SAndroid Build Coastguard Worker             }
2915*58b9f456SAndroid Build Coastguard Worker         }
2916*58b9f456SAndroid Build Coastguard Worker    }
2917*58b9f456SAndroid Build Coastguard Worker}
2918*58b9f456SAndroid Build Coastguard Worker
2919*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14
2920*58b9f456SAndroid Build Coastguard Worker
2921*58b9f456SAndroid Build Coastguard Worker// default searcher
2922*58b9f456SAndroid Build Coastguard Workertemplate<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
2923*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TYPE_VIS default_searcher {
2924*58b9f456SAndroid Build Coastguard Workerpublic:
2925*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2926*58b9f456SAndroid Build Coastguard Worker    default_searcher(_ForwardIterator __f, _ForwardIterator __l,
2927*58b9f456SAndroid Build Coastguard Worker                       _BinaryPredicate __p = _BinaryPredicate())
2928*58b9f456SAndroid Build Coastguard Worker        : __first_(__f), __last_(__l), __pred_(__p) {}
2929*58b9f456SAndroid Build Coastguard Worker
2930*58b9f456SAndroid Build Coastguard Worker    template <typename _ForwardIterator2>
2931*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2932*58b9f456SAndroid Build Coastguard Worker    pair<_ForwardIterator2, _ForwardIterator2>
2933*58b9f456SAndroid Build Coastguard Worker    operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
2934*58b9f456SAndroid Build Coastguard Worker    {
2935*58b9f456SAndroid Build Coastguard Worker        return _VSTD::__search(__f, __l, __first_, __last_, __pred_,
2936*58b9f456SAndroid Build Coastguard Worker            typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category(),
2937*58b9f456SAndroid Build Coastguard Worker            typename _VSTD::iterator_traits<_ForwardIterator2>::iterator_category());
2938*58b9f456SAndroid Build Coastguard Worker    }
2939*58b9f456SAndroid Build Coastguard Worker
2940*58b9f456SAndroid Build Coastguard Workerprivate:
2941*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __first_;
2942*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __last_;
2943*58b9f456SAndroid Build Coastguard Worker    _BinaryPredicate __pred_;
2944*58b9f456SAndroid Build Coastguard Worker    };
2945*58b9f456SAndroid Build Coastguard Worker
2946*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_STD_VER > 14
2947*58b9f456SAndroid Build Coastguard Worker
2948*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 17
2949*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
2950*58b9f456SAndroid Build Coastguard Workerusing unwrap_reference_t = typename unwrap_reference<_Tp>::type;
2951*58b9f456SAndroid Build Coastguard Worker
2952*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
2953*58b9f456SAndroid Build Coastguard Workerusing unwrap_ref_decay_t = typename unwrap_ref_decay<_Tp>::type;
2954*58b9f456SAndroid Build Coastguard Worker#endif // > C++17
2955*58b9f456SAndroid Build Coastguard Worker
2956*58b9f456SAndroid Build Coastguard Workertemplate <class _Container, class _Predicate>
2957*58b9f456SAndroid Build Coastguard Workerinline void __libcpp_erase_if_container( _Container& __c, _Predicate __pred)
2958*58b9f456SAndroid Build Coastguard Worker{
2959*58b9f456SAndroid Build Coastguard Worker	for (typename _Container::iterator __iter = __c.begin(), __last = __c.end(); __iter != __last;)
2960*58b9f456SAndroid Build Coastguard Worker	{
2961*58b9f456SAndroid Build Coastguard Worker		if (__pred(*__iter))
2962*58b9f456SAndroid Build Coastguard Worker			__iter = __c.erase(__iter);
2963*58b9f456SAndroid Build Coastguard Worker		else
2964*58b9f456SAndroid Build Coastguard Worker			++__iter;
2965*58b9f456SAndroid Build Coastguard Worker	}
2966*58b9f456SAndroid Build Coastguard Worker}
2967*58b9f456SAndroid Build Coastguard Worker
2968*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD
2969*58b9f456SAndroid Build Coastguard Worker
2970*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_FUNCTIONAL
2971