blob: f73c3ca56a8e3e64bb303d02ea71db38a33f3ab9 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===------------------------ functional ----------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_FUNCTIONAL
12#define _LIBCPP_FUNCTIONAL
13
14/*
15 functional synopsis
16
17namespace std
18{
19
20template <class Arg, class Result>
21struct unary_function
22{
23 typedef Arg argument_type;
24 typedef Result result_type;
25};
26
27template <class Arg1, class Arg2, class Result>
28struct binary_function
29{
30 typedef Arg1 first_argument_type;
31 typedef Arg2 second_argument_type;
32 typedef Result result_type;
33};
34
Howard Hinnantf06d9262010-08-20 19:36:46 +000035template <class T>
Howard Hinnantc51e1022010-05-11 19:42:16 +000036class reference_wrapper
37 : public unary_function<T1, R> // if wrapping a unary functor
38 : public binary_function<T1, T2, R> // if wraping a binary functor
39{
40public:
41 // types
42 typedef T type;
43 typedef see below result_type; // Not always defined
44
45 // construct/copy/destroy
Howard Hinnantf7724cd2011-05-28 17:59:48 +000046 reference_wrapper(T&) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000047 reference_wrapper(T&&) = delete; // do not bind to temps
Howard Hinnantf7724cd2011-05-28 17:59:48 +000048 reference_wrapper(const reference_wrapper<T>& x) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000049
50 // assignment
Howard Hinnantf7724cd2011-05-28 17:59:48 +000051 reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000052
53 // access
Howard Hinnantf7724cd2011-05-28 17:59:48 +000054 operator T& () const noexcept;
55 T& get() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000056
57 // invoke
58 template <class... ArgTypes>
Howard Hinnantc9c775b2013-09-21 17:58:58 +000059 typename result_of<T&(ArgTypes&&...)>::type
Howard Hinnantc51e1022010-05-11 19:42:16 +000060 operator() (ArgTypes&&...) const;
61};
62
Howard Hinnantf7724cd2011-05-28 17:59:48 +000063template <class T> reference_wrapper<T> ref(T& t) noexcept;
Howard Hinnantf06d9262010-08-20 19:36:46 +000064template <class T> void ref(const T&& t) = delete;
Howard Hinnantf7724cd2011-05-28 17:59:48 +000065template <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000066
Howard Hinnantf7724cd2011-05-28 17:59:48 +000067template <class T> reference_wrapper<const T> cref(const T& t) noexcept;
Howard Hinnantf06d9262010-08-20 19:36:46 +000068template <class T> void cref(const T&& t) = delete;
Howard Hinnantf7724cd2011-05-28 17:59:48 +000069template <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000070
Marshall Clow974bae22013-07-29 14:21:53 +000071template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000072struct plus : binary_function<T, T, T>
73{
74 T operator()(const T& x, const T& y) const;
75};
76
Marshall Clow974bae22013-07-29 14:21:53 +000077template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000078struct minus : binary_function<T, T, T>
79{
80 T operator()(const T& x, const T& y) const;
81};
82
Marshall Clow974bae22013-07-29 14:21:53 +000083template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000084struct multiplies : binary_function<T, T, T>
85{
86 T operator()(const T& x, const T& y) const;
87};
88
Marshall Clow974bae22013-07-29 14:21:53 +000089template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000090struct divides : binary_function<T, T, T>
91{
92 T operator()(const T& x, const T& y) const;
93};
94
Marshall Clow974bae22013-07-29 14:21:53 +000095template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000096struct modulus : binary_function<T, T, T>
97{
98 T operator()(const T& x, const T& y) const;
99};
100
Marshall Clow974bae22013-07-29 14:21:53 +0000101template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000102struct negate : unary_function<T, T>
103{
104 T operator()(const T& x) const;
105};
106
Marshall Clow974bae22013-07-29 14:21:53 +0000107template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000108struct equal_to : binary_function<T, T, bool>
109{
110 bool operator()(const T& x, const T& y) const;
111};
112
Marshall Clow974bae22013-07-29 14:21:53 +0000113template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000114struct not_equal_to : binary_function<T, T, bool>
115{
116 bool operator()(const T& x, const T& y) const;
117};
118
Marshall Clow974bae22013-07-29 14:21:53 +0000119template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000120struct greater : binary_function<T, T, bool>
121{
122 bool operator()(const T& x, const T& y) const;
123};
124
Marshall Clow974bae22013-07-29 14:21:53 +0000125template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000126struct less : binary_function<T, T, bool>
127{
128 bool operator()(const T& x, const T& y) const;
129};
130
Marshall Clow974bae22013-07-29 14:21:53 +0000131template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132struct greater_equal : binary_function<T, T, bool>
133{
134 bool operator()(const T& x, const T& y) const;
135};
136
Marshall Clow974bae22013-07-29 14:21:53 +0000137template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000138struct less_equal : binary_function<T, T, bool>
139{
140 bool operator()(const T& x, const T& y) const;
141};
142
Marshall Clow974bae22013-07-29 14:21:53 +0000143template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000144struct logical_and : binary_function<T, T, bool>
145{
146 bool operator()(const T& x, const T& y) const;
147};
148
Marshall Clow974bae22013-07-29 14:21:53 +0000149template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000150struct logical_or : binary_function<T, T, bool>
151{
152 bool operator()(const T& x, const T& y) const;
153};
154
Marshall Clow974bae22013-07-29 14:21:53 +0000155template <class T> // <class T=void> in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000156struct logical_not : unary_function<T, bool>
157{
158 bool operator()(const T& x) const;
159};
160
Marshall Clow974bae22013-07-29 14:21:53 +0000161template <class T> // <class T=void> in C++14
162struct bit_and : unary_function<T, bool>
163{
164 bool operator()(const T& x, const T& y) const;
165};
166
167template <class T> // <class T=void> in C++14
168struct bit_or : unary_function<T, bool>
169{
170 bool operator()(const T& x, const T& y) const;
171};
172
173template <class T> // <class T=void> in C++14
174struct bit_xor : unary_function<T, bool>
175{
176 bool operator()(const T& x, const T& y) const;
177};
178
179template <class T=void> // C++14
180struct bit_xor : unary_function<T, bool>
181{
182 bool operator()(const T& x) const;
183};
184
Howard Hinnantc51e1022010-05-11 19:42:16 +0000185template <class Predicate>
186class unary_negate
187 : public unary_function<typename Predicate::argument_type, bool>
188{
189public:
190 explicit unary_negate(const Predicate& pred);
191 bool operator()(const typename Predicate::argument_type& x) const;
192};
193
194template <class Predicate> unary_negate<Predicate> not1(const Predicate& pred);
195
196template <class Predicate>
197class binary_negate
198 : public binary_function<typename Predicate::first_argument_type,
199 typename Predicate::second_argument_type,
200 bool>
201{
202public:
203 explicit binary_negate(const Predicate& pred);
204 bool operator()(const typename Predicate::first_argument_type& x,
205 const typename Predicate::second_argument_type& y) const;
206};
207
208template <class Predicate> binary_negate<Predicate> not2(const Predicate& pred);
209
Eric Fiselier934f63b2016-06-02 01:25:41 +0000210template <class F> unspecified not_fn(F&& f); // C++17
211
Howard Hinnantc51e1022010-05-11 19:42:16 +0000212template<class T> struct is_bind_expression;
213template<class T> struct is_placeholder;
214
Marshall Clow2d2d7f12016-09-22 00:23:15 +0000215 // See C++14 20.9.9, Function object binders
216template <class T> constexpr bool is_bind_expression_v
217 = is_bind_expression<T>::value; // C++17
218template <class T> constexpr int is_placeholder_v
219 = is_placeholder<T>::value; // C++17
220
221
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000222template<class Fn, class... BoundArgs>
Howard Hinnantf06d9262010-08-20 19:36:46 +0000223 unspecified bind(Fn&&, BoundArgs&&...);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000224template<class R, class Fn, class... BoundArgs>
Howard Hinnantf06d9262010-08-20 19:36:46 +0000225 unspecified bind(Fn&&, BoundArgs&&...);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000226
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000227namespace placeholders {
228 // M is the implementation-defined number of placeholders
Howard Hinnantc51e1022010-05-11 19:42:16 +0000229 extern unspecified _1;
230 extern unspecified _2;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000231 .
232 .
233 .
Howard Hinnantc834c512011-11-29 18:15:50 +0000234 extern unspecified _Mp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235}
236
237template <class Operation>
Marshall Clow26a027c2017-04-13 18:25:32 +0000238class binder1st // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239 : public unary_function<typename Operation::second_argument_type,
240 typename Operation::result_type>
241{
242protected:
243 Operation op;
244 typename Operation::first_argument_type value;
245public:
246 binder1st(const Operation& x, const typename Operation::first_argument_type y);
247 typename Operation::result_type operator()( typename Operation::second_argument_type& x) const;
248 typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const;
249};
250
251template <class Operation, class T>
Marshall Clow26a027c2017-04-13 18:25:32 +0000252binder1st<Operation> bind1st(const Operation& op, const T& x); // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000253
254template <class Operation>
Marshall Clow26a027c2017-04-13 18:25:32 +0000255class binder2nd // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000256 : public unary_function<typename Operation::first_argument_type,
257 typename Operation::result_type>
258{
259protected:
260 Operation op;
261 typename Operation::second_argument_type value;
262public:
263 binder2nd(const Operation& x, const typename Operation::second_argument_type y);
264 typename Operation::result_type operator()( typename Operation::first_argument_type& x) const;
265 typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const;
266};
267
268template <class Operation, class T>
Marshall Clow26a027c2017-04-13 18:25:32 +0000269binder2nd<Operation> bind2nd(const Operation& op, const T& x); // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270
Marshall Clow26a027c2017-04-13 18:25:32 +0000271template <class Arg, class Result> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000272class pointer_to_unary_function : public unary_function<Arg, Result>
273{
274public:
275 explicit pointer_to_unary_function(Result (*f)(Arg));
276 Result operator()(Arg x) const;
277};
278
279template <class Arg, class Result>
Marshall Clow26a027c2017-04-13 18:25:32 +0000280pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg)); // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000281
Marshall Clow26a027c2017-04-13 18:25:32 +0000282template <class Arg1, class Arg2, class Result> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000283class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result>
284{
285public:
286 explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
287 Result operator()(Arg1 x, Arg2 y) const;
288};
289
290template <class Arg1, class Arg2, class Result>
Marshall Clow26a027c2017-04-13 18:25:32 +0000291pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2)); // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292
Marshall Clow26a027c2017-04-13 18:25:32 +0000293template<class S, class T> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294class mem_fun_t : public unary_function<T*, S>
295{
296public:
297 explicit mem_fun_t(S (T::*p)());
298 S operator()(T* p) const;
299};
300
301template<class S, class T, class A>
Marshall Clow26a027c2017-04-13 18:25:32 +0000302class mem_fun1_t : public binary_function<T*, A, S> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303{
304public:
305 explicit mem_fun1_t(S (T::*p)(A));
306 S operator()(T* p, A x) const;
307};
308
Marshall Clow26a027c2017-04-13 18:25:32 +0000309template<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)()); // deprecated in C++11, removed in C++17
310template<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
Howard Hinnantc51e1022010-05-11 19:42:16 +0000311
312template<class S, class T>
Marshall Clow26a027c2017-04-13 18:25:32 +0000313class mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000314{
315public:
316 explicit mem_fun_ref_t(S (T::*p)());
317 S operator()(T& p) const;
318};
319
320template<class S, class T, class A>
Marshall Clow26a027c2017-04-13 18:25:32 +0000321class mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000322{
323public:
324 explicit mem_fun1_ref_t(S (T::*p)(A));
325 S operator()(T& p, A x) const;
326};
327
Marshall Clow26a027c2017-04-13 18:25:32 +0000328template<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()); // deprecated in C++11, removed in C++17
329template<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
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330
331template <class S, class T>
Marshall Clow26a027c2017-04-13 18:25:32 +0000332class const_mem_fun_t : public unary_function<const T*, S> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000333{
334public:
335 explicit const_mem_fun_t(S (T::*p)() const);
336 S operator()(const T* p) const;
337};
338
339template <class S, class T, class A>
Marshall Clow26a027c2017-04-13 18:25:32 +0000340class const_mem_fun1_t : public binary_function<const T*, A, S> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341{
342public:
343 explicit const_mem_fun1_t(S (T::*p)(A) const);
344 S operator()(const T* p, A x) const;
345};
346
Marshall Clow26a027c2017-04-13 18:25:32 +0000347template <class S, class T> const_mem_fun_t<S,T> mem_fun(S (T::*f)() const); // deprecated in C++11, removed in C++17
348template <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
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349
350template <class S, class T>
Marshall Clow26a027c2017-04-13 18:25:32 +0000351class const_mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352{
353public:
354 explicit const_mem_fun_ref_t(S (T::*p)() const);
355 S operator()(const T& p) const;
356};
357
358template <class S, class T, class A>
Marshall Clow26a027c2017-04-13 18:25:32 +0000359class const_mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360{
361public:
362 explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
363 S operator()(const T& p, A x) const;
364};
365
Marshall Clow26a027c2017-04-13 18:25:32 +0000366template <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
367template <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
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368
Howard Hinnantf06d9262010-08-20 19:36:46 +0000369template<class R, class T> unspecified mem_fn(R T::*);
Howard Hinnantf06d9262010-08-20 19:36:46 +0000370
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371class bad_function_call
372 : public exception
373{
374};
375
Howard Hinnantf06d9262010-08-20 19:36:46 +0000376template<class> class function; // undefined
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377
Howard Hinnantf06d9262010-08-20 19:36:46 +0000378template<class R, class... ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000379class function<R(ArgTypes...)>
380 : public unary_function<T1, R> // iff sizeof...(ArgTypes) == 1 and
381 // ArgTypes contains T1
382 : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and
383 // ArgTypes contains T1 and T2
384{
385public:
386 typedef R result_type;
387
Howard Hinnantf06d9262010-08-20 19:36:46 +0000388 // construct/copy/destroy:
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000389 function() noexcept;
390 function(nullptr_t) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391 function(const function&);
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000392 function(function&&) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393 template<class F>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000394 function(F);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000395 template<Allocator Alloc>
Marshall Clow3148f422016-10-13 21:06:03 +0000396 function(allocator_arg_t, const Alloc&) noexcept; // removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000397 template<Allocator Alloc>
Marshall Clow3148f422016-10-13 21:06:03 +0000398 function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399 template<Allocator Alloc>
Marshall Clow3148f422016-10-13 21:06:03 +0000400 function(allocator_arg_t, const Alloc&, const function&); // removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401 template<Allocator Alloc>
Marshall Clow3148f422016-10-13 21:06:03 +0000402 function(allocator_arg_t, const Alloc&, function&&); // removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000403 template<class F, Allocator Alloc>
Marshall Clow3148f422016-10-13 21:06:03 +0000404 function(allocator_arg_t, const Alloc&, F); // removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405
406 function& operator=(const function&);
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000407 function& operator=(function&&) noexcept;
Howard Hinnant7b85be02011-05-29 13:53:56 +0000408 function& operator=(nullptr_t) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409 template<class F>
Howard Hinnantf06d9262010-08-20 19:36:46 +0000410 function& operator=(F&&);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 template<class F>
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000412 function& operator=(reference_wrapper<F>) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000413
414 ~function();
415
Howard Hinnantf06d9262010-08-20 19:36:46 +0000416 // function modifiers:
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000417 void swap(function&) noexcept;
Howard Hinnantf06d9262010-08-20 19:36:46 +0000418 template<class F, class Alloc>
Marshall Clowfc8fd832016-01-25 17:29:55 +0000419 void assign(F&&, const Alloc&); // Removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420
Howard Hinnantf06d9262010-08-20 19:36:46 +0000421 // function capacity:
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000422 explicit operator bool() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423
Howard Hinnantf06d9262010-08-20 19:36:46 +0000424 // function invocation:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000425 R operator()(ArgTypes...) const;
426
Howard Hinnantf06d9262010-08-20 19:36:46 +0000427 // function target access:
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000428 const std::type_info& target_type() const noexcept;
429 template <typename T> T* target() noexcept;
430 template <typename T> const T* target() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000431};
432
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000433// Null pointer comparisons:
434template <class R, class ... ArgTypes>
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000435 bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000436
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000437template <class R, class ... ArgTypes>
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000438 bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000439
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000440template <class R, class ... ArgTypes>
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000441 bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000443template <class R, class ... ArgTypes>
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000444 bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000445
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000446// specialized algorithms:
447template <class R, class ... ArgTypes>
Howard Hinnantf7724cd2011-05-28 17:59:48 +0000448 void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449
450template <class T> struct hash;
451
452template <> struct hash<bool>;
453template <> struct hash<char>;
454template <> struct hash<signed char>;
455template <> struct hash<unsigned char>;
456template <> struct hash<char16_t>;
457template <> struct hash<char32_t>;
458template <> struct hash<wchar_t>;
459template <> struct hash<short>;
460template <> struct hash<unsigned short>;
461template <> struct hash<int>;
462template <> struct hash<unsigned int>;
463template <> struct hash<long>;
464template <> struct hash<long long>;
465template <> struct hash<unsigned long>;
466template <> struct hash<unsigned long long>;
467
468template <> struct hash<float>;
469template <> struct hash<double>;
470template <> struct hash<long double>;
471
472template<class T> struct hash<T*>;
Marshall Clowcc252222017-03-23 06:20:18 +0000473template <> struct hash<nullptr_t>; // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000474
475} // std
476
477POLICY: For non-variadic implementations, the number of arguments is limited
478 to 3. It is hoped that the need for non-variadic implementations
479 will be minimal.
480
481*/
482
483#include <__config>
484#include <type_traits>
485#include <typeinfo>
486#include <exception>
487#include <memory>
488#include <tuple>
Eric Fiselier698a97b2017-01-21 00:02:12 +0000489#include <utility>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490
491#include <__functional_base>
492
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000493#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000495#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000496
497_LIBCPP_BEGIN_NAMESPACE_STD
498
Marshall Clow974bae22013-07-29 14:21:53 +0000499#if _LIBCPP_STD_VER > 11
500template <class _Tp = void>
501#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000503#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000504struct _LIBCPP_TEMPLATE_VIS plus : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000505{
Marshall Clowd18ee652013-09-28 19:06:12 +0000506 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
507 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000508 {return __x + __y;}
509};
510
Marshall Clow974bae22013-07-29 14:21:53 +0000511#if _LIBCPP_STD_VER > 11
512template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000513struct _LIBCPP_TEMPLATE_VIS plus<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000514{
515 template <class _T1, class _T2>
Marshall Clowd18ee652013-09-28 19:06:12 +0000516 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
517 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000518 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
519 -> decltype (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
520 { return _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000521 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000522};
523#endif
524
525
526#if _LIBCPP_STD_VER > 11
527template <class _Tp = void>
528#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000530#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000531struct _LIBCPP_TEMPLATE_VIS minus : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532{
Marshall Clowd18ee652013-09-28 19:06:12 +0000533 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
534 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 {return __x - __y;}
536};
537
Marshall Clow974bae22013-07-29 14:21:53 +0000538#if _LIBCPP_STD_VER > 11
539template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000540struct _LIBCPP_TEMPLATE_VIS minus<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000541{
542 template <class _T1, class _T2>
Marshall Clowd18ee652013-09-28 19:06:12 +0000543 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
544 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000545 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)))
546 -> decltype (_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))
547 { return _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000548 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000549};
550#endif
551
552
553#if _LIBCPP_STD_VER > 11
554template <class _Tp = void>
555#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000556template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000557#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000558struct _LIBCPP_TEMPLATE_VIS multiplies : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000559{
Marshall Clowd18ee652013-09-28 19:06:12 +0000560 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
561 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000562 {return __x * __y;}
563};
564
Marshall Clow974bae22013-07-29 14:21:53 +0000565#if _LIBCPP_STD_VER > 11
566template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000567struct _LIBCPP_TEMPLATE_VIS multiplies<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000568{
569 template <class _T1, class _T2>
Marshall Clowd18ee652013-09-28 19:06:12 +0000570 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
571 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000572 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)))
573 -> decltype (_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))
574 { return _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000575 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000576};
577#endif
578
579
580#if _LIBCPP_STD_VER > 11
581template <class _Tp = void>
582#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000583template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000584#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000585struct _LIBCPP_TEMPLATE_VIS divides : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000586{
Marshall Clowd18ee652013-09-28 19:06:12 +0000587 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
588 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000589 {return __x / __y;}
590};
591
Marshall Clow974bae22013-07-29 14:21:53 +0000592#if _LIBCPP_STD_VER > 11
593template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000594struct _LIBCPP_TEMPLATE_VIS divides<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000595{
596 template <class _T1, class _T2>
Marshall Clowd18ee652013-09-28 19:06:12 +0000597 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
598 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000599 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)))
600 -> decltype (_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))
601 { return _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000602 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000603};
604#endif
605
606
607#if _LIBCPP_STD_VER > 11
608template <class _Tp = void>
609#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000611#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000612struct _LIBCPP_TEMPLATE_VIS modulus : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000613{
Marshall Clowd18ee652013-09-28 19:06:12 +0000614 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
615 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 {return __x % __y;}
617};
618
Marshall Clow974bae22013-07-29 14:21:53 +0000619#if _LIBCPP_STD_VER > 11
620template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000621struct _LIBCPP_TEMPLATE_VIS modulus<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000622{
623 template <class _T1, class _T2>
Marshall Clowd18ee652013-09-28 19:06:12 +0000624 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
625 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000626 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)))
627 -> decltype (_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))
628 { return _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000629 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000630};
631#endif
632
633
634#if _LIBCPP_STD_VER > 11
635template <class _Tp = void>
636#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000637template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000638#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000639struct _LIBCPP_TEMPLATE_VIS negate : unary_function<_Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000640{
Marshall Clowd18ee652013-09-28 19:06:12 +0000641 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
642 _Tp operator()(const _Tp& __x) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643 {return -__x;}
644};
645
Marshall Clow974bae22013-07-29 14:21:53 +0000646#if _LIBCPP_STD_VER > 11
647template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000648struct _LIBCPP_TEMPLATE_VIS negate<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000649{
650 template <class _Tp>
Marshall Clowd18ee652013-09-28 19:06:12 +0000651 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
652 auto operator()(_Tp&& __x) const
Marshall Clow012ca342015-02-25 12:20:52 +0000653 _NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x)))
654 -> decltype (- _VSTD::forward<_Tp>(__x))
655 { return - _VSTD::forward<_Tp>(__x); }
Marshall Clowc0152142013-08-13 01:11:06 +0000656 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000657};
658#endif
659
660
661#if _LIBCPP_STD_VER > 11
662template <class _Tp = void>
663#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000664template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000665#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000666struct _LIBCPP_TEMPLATE_VIS equal_to : binary_function<_Tp, _Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000667{
Marshall Clowd18ee652013-09-28 19:06:12 +0000668 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
669 bool operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000670 {return __x == __y;}
671};
672
Marshall Clow974bae22013-07-29 14:21:53 +0000673#if _LIBCPP_STD_VER > 11
674template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000675struct _LIBCPP_TEMPLATE_VIS equal_to<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000676{
Marshall Clowd18ee652013-09-28 19:06:12 +0000677 template <class _T1, class _T2>
678 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000679 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000680 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)))
681 -> decltype (_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))
682 { return _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000683 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000684};
685#endif
686
687
688#if _LIBCPP_STD_VER > 11
689template <class _Tp = void>
690#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000691template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000692#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000693struct _LIBCPP_TEMPLATE_VIS not_equal_to : binary_function<_Tp, _Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000694{
Marshall Clowd18ee652013-09-28 19:06:12 +0000695 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
696 bool operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000697 {return __x != __y;}
698};
699
Marshall Clow974bae22013-07-29 14:21:53 +0000700#if _LIBCPP_STD_VER > 11
701template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000702struct _LIBCPP_TEMPLATE_VIS not_equal_to<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000703{
Marshall Clowd18ee652013-09-28 19:06:12 +0000704 template <class _T1, class _T2>
705 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000706 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000707 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)))
708 -> decltype (_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))
709 { return _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000710 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000711};
712#endif
713
714
715#if _LIBCPP_STD_VER > 11
716template <class _Tp = void>
717#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000718template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000719#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000720struct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000721{
Marshall Clowd18ee652013-09-28 19:06:12 +0000722 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
723 bool operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000724 {return __x > __y;}
725};
726
Marshall Clow974bae22013-07-29 14:21:53 +0000727#if _LIBCPP_STD_VER > 11
728template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000729struct _LIBCPP_TEMPLATE_VIS greater<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000730{
Marshall Clowd18ee652013-09-28 19:06:12 +0000731 template <class _T1, class _T2>
732 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000733 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000734 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)))
735 -> decltype (_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))
736 { return _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000737 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000738};
739#endif
740
741
Howard Hinnantb17caf92012-02-21 21:02:58 +0000742// less in <__functional_base>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000743
Marshall Clow974bae22013-07-29 14:21:53 +0000744#if _LIBCPP_STD_VER > 11
745template <class _Tp = void>
746#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000747template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000748#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000749struct _LIBCPP_TEMPLATE_VIS greater_equal : binary_function<_Tp, _Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000750{
Marshall Clowd18ee652013-09-28 19:06:12 +0000751 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
752 bool operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000753 {return __x >= __y;}
754};
755
Marshall Clow974bae22013-07-29 14:21:53 +0000756#if _LIBCPP_STD_VER > 11
757template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000758struct _LIBCPP_TEMPLATE_VIS greater_equal<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000759{
Marshall Clowd18ee652013-09-28 19:06:12 +0000760 template <class _T1, class _T2>
761 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000762 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000763 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)))
764 -> decltype (_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))
765 { return _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000766 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000767};
768#endif
769
770
771#if _LIBCPP_STD_VER > 11
772template <class _Tp = void>
773#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000774template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000775#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000776struct _LIBCPP_TEMPLATE_VIS less_equal : binary_function<_Tp, _Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000777{
Marshall Clowd18ee652013-09-28 19:06:12 +0000778 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
779 bool operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000780 {return __x <= __y;}
781};
782
Marshall Clow974bae22013-07-29 14:21:53 +0000783#if _LIBCPP_STD_VER > 11
784template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000785struct _LIBCPP_TEMPLATE_VIS less_equal<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000786{
Marshall Clowd18ee652013-09-28 19:06:12 +0000787 template <class _T1, class _T2>
788 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000789 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000790 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)))
791 -> decltype (_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))
792 { return _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000793 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000794};
795#endif
796
797
798#if _LIBCPP_STD_VER > 11
799template <class _Tp = void>
800#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000801template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000802#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000803struct _LIBCPP_TEMPLATE_VIS logical_and : binary_function<_Tp, _Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000804{
Marshall Clowd18ee652013-09-28 19:06:12 +0000805 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
806 bool operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807 {return __x && __y;}
808};
809
Marshall Clow974bae22013-07-29 14:21:53 +0000810#if _LIBCPP_STD_VER > 11
811template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000812struct _LIBCPP_TEMPLATE_VIS logical_and<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000813{
Marshall Clowd18ee652013-09-28 19:06:12 +0000814 template <class _T1, class _T2>
815 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000816 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000817 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)))
818 -> decltype (_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))
819 { return _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000820 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000821};
822#endif
823
824
825#if _LIBCPP_STD_VER > 11
826template <class _Tp = void>
827#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000828template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000829#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000830struct _LIBCPP_TEMPLATE_VIS logical_or : binary_function<_Tp, _Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000831{
Marshall Clowd18ee652013-09-28 19:06:12 +0000832 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
833 bool operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000834 {return __x || __y;}
835};
836
Marshall Clow974bae22013-07-29 14:21:53 +0000837#if _LIBCPP_STD_VER > 11
838template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000839struct _LIBCPP_TEMPLATE_VIS logical_or<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000840{
Marshall Clowd18ee652013-09-28 19:06:12 +0000841 template <class _T1, class _T2>
842 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000843 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000844 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)))
845 -> decltype (_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))
846 { return _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000847 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000848};
849#endif
850
851
852#if _LIBCPP_STD_VER > 11
853template <class _Tp = void>
854#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000855template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000856#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000857struct _LIBCPP_TEMPLATE_VIS logical_not : unary_function<_Tp, bool>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000858{
Marshall Clowd18ee652013-09-28 19:06:12 +0000859 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
860 bool operator()(const _Tp& __x) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861 {return !__x;}
862};
863
Marshall Clow974bae22013-07-29 14:21:53 +0000864#if _LIBCPP_STD_VER > 11
865template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000866struct _LIBCPP_TEMPLATE_VIS logical_not<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000867{
868 template <class _Tp>
Marshall Clowd18ee652013-09-28 19:06:12 +0000869 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
870 auto operator()(_Tp&& __x) const
Marshall Clow012ca342015-02-25 12:20:52 +0000871 _NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x)))
872 -> decltype (!_VSTD::forward<_Tp>(__x))
873 { return !_VSTD::forward<_Tp>(__x); }
Marshall Clowc0152142013-08-13 01:11:06 +0000874 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000875};
876#endif
877
878
879#if _LIBCPP_STD_VER > 11
880template <class _Tp = void>
881#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000882template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000883#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000884struct _LIBCPP_TEMPLATE_VIS bit_and : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000885{
Marshall Clowd18ee652013-09-28 19:06:12 +0000886 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
887 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888 {return __x & __y;}
889};
890
Marshall Clow974bae22013-07-29 14:21:53 +0000891#if _LIBCPP_STD_VER > 11
892template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000893struct _LIBCPP_TEMPLATE_VIS bit_and<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000894{
Marshall Clowd18ee652013-09-28 19:06:12 +0000895 template <class _T1, class _T2>
896 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000897 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000898 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)))
899 -> decltype (_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))
900 { return _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000901 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000902};
903#endif
904
905
906#if _LIBCPP_STD_VER > 11
907template <class _Tp = void>
908#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000910#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000911struct _LIBCPP_TEMPLATE_VIS bit_or : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912{
Marshall Clowd18ee652013-09-28 19:06:12 +0000913 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
914 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915 {return __x | __y;}
916};
917
Marshall Clow974bae22013-07-29 14:21:53 +0000918#if _LIBCPP_STD_VER > 11
919template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000920struct _LIBCPP_TEMPLATE_VIS bit_or<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000921{
Marshall Clowd18ee652013-09-28 19:06:12 +0000922 template <class _T1, class _T2>
923 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000924 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000925 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)))
926 -> decltype (_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))
927 { return _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000928 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000929};
930#endif
931
932
933#if _LIBCPP_STD_VER > 11
934template <class _Tp = void>
935#else
Howard Hinnantc51e1022010-05-11 19:42:16 +0000936template <class _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000937#endif
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000938struct _LIBCPP_TEMPLATE_VIS bit_xor : binary_function<_Tp, _Tp, _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000939{
Marshall Clowd18ee652013-09-28 19:06:12 +0000940 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
941 _Tp operator()(const _Tp& __x, const _Tp& __y) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000942 {return __x ^ __y;}
943};
944
Marshall Clow974bae22013-07-29 14:21:53 +0000945#if _LIBCPP_STD_VER > 11
946template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000947struct _LIBCPP_TEMPLATE_VIS bit_xor<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000948{
Marshall Clowd18ee652013-09-28 19:06:12 +0000949 template <class _T1, class _T2>
950 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow974bae22013-07-29 14:21:53 +0000951 auto operator()(_T1&& __t, _T2&& __u) const
Marshall Clow012ca342015-02-25 12:20:52 +0000952 _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)))
953 -> decltype (_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))
954 { return _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); }
Marshall Clowc0152142013-08-13 01:11:06 +0000955 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000956};
957#endif
958
959
960#if _LIBCPP_STD_VER > 11
961template <class _Tp = void>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000962struct _LIBCPP_TEMPLATE_VIS bit_not : unary_function<_Tp, _Tp>
Marshall Clow974bae22013-07-29 14:21:53 +0000963{
Marshall Clowd18ee652013-09-28 19:06:12 +0000964 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
965 _Tp operator()(const _Tp& __x) const
Marshall Clow974bae22013-07-29 14:21:53 +0000966 {return ~__x;}
967};
968
969template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000970struct _LIBCPP_TEMPLATE_VIS bit_not<void>
Marshall Clow974bae22013-07-29 14:21:53 +0000971{
972 template <class _Tp>
Marshall Clowd18ee652013-09-28 19:06:12 +0000973 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
974 auto operator()(_Tp&& __x) const
Marshall Clow012ca342015-02-25 12:20:52 +0000975 _NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x)))
976 -> decltype (~_VSTD::forward<_Tp>(__x))
977 { return ~_VSTD::forward<_Tp>(__x); }
Marshall Clowc0152142013-08-13 01:11:06 +0000978 typedef void is_transparent;
Marshall Clow974bae22013-07-29 14:21:53 +0000979};
980#endif
981
Howard Hinnantc51e1022010-05-11 19:42:16 +0000982template <class _Predicate>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000983class _LIBCPP_TEMPLATE_VIS unary_negate
Howard Hinnantc51e1022010-05-11 19:42:16 +0000984 : public unary_function<typename _Predicate::argument_type, bool>
985{
986 _Predicate __pred_;
987public:
Marshall Clowd18ee652013-09-28 19:06:12 +0000988 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
989 explicit unary_negate(const _Predicate& __pred)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000990 : __pred_(__pred) {}
Marshall Clowd18ee652013-09-28 19:06:12 +0000991 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
992 bool operator()(const typename _Predicate::argument_type& __x) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000993 {return !__pred_(__x);}
994};
995
996template <class _Predicate>
Marshall Clowd18ee652013-09-28 19:06:12 +0000997inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000998unary_negate<_Predicate>
999not1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);}
1000
1001template <class _Predicate>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001002class _LIBCPP_TEMPLATE_VIS binary_negate
Howard Hinnantc51e1022010-05-11 19:42:16 +00001003 : public binary_function<typename _Predicate::first_argument_type,
1004 typename _Predicate::second_argument_type,
1005 bool>
1006{
1007 _Predicate __pred_;
1008public:
Marshall Clowd18ee652013-09-28 19:06:12 +00001009 _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11
1010 binary_negate(const _Predicate& __pred) : __pred_(__pred) {}
1011
1012 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1013 bool operator()(const typename _Predicate::first_argument_type& __x,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001014 const typename _Predicate::second_argument_type& __y) const
1015 {return !__pred_(__x, __y);}
1016};
1017
1018template <class _Predicate>
Marshall Clowd18ee652013-09-28 19:06:12 +00001019inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020binary_negate<_Predicate>
1021not2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);}
1022
Marshall Clow26a027c2017-04-13 18:25:32 +00001023#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001024template <class __Operation>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001025class _LIBCPP_TEMPLATE_VIS binder1st
Howard Hinnantc51e1022010-05-11 19:42:16 +00001026 : public unary_function<typename __Operation::second_argument_type,
1027 typename __Operation::result_type>
1028{
1029protected:
1030 __Operation op;
1031 typename __Operation::first_argument_type value;
1032public:
1033 _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x,
1034 const typename __Operation::first_argument_type __y)
1035 : op(__x), value(__y) {}
1036 _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1037 (typename __Operation::second_argument_type& __x) const
1038 {return op(value, __x);}
1039 _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1040 (const typename __Operation::second_argument_type& __x) const
1041 {return op(value, __x);}
1042};
1043
1044template <class __Operation, class _Tp>
1045inline _LIBCPP_INLINE_VISIBILITY
1046binder1st<__Operation>
1047bind1st(const __Operation& __op, const _Tp& __x)
1048 {return binder1st<__Operation>(__op, __x);}
1049
1050template <class __Operation>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001051class _LIBCPP_TEMPLATE_VIS binder2nd
Howard Hinnantc51e1022010-05-11 19:42:16 +00001052 : public unary_function<typename __Operation::first_argument_type,
1053 typename __Operation::result_type>
1054{
1055protected:
1056 __Operation op;
1057 typename __Operation::second_argument_type value;
1058public:
Howard Hinnant4ff57432010-09-21 22:55:27 +00001059 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060 binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y)
1061 : op(__x), value(__y) {}
1062 _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1063 ( typename __Operation::first_argument_type& __x) const
1064 {return op(__x, value);}
1065 _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
1066 (const typename __Operation::first_argument_type& __x) const
1067 {return op(__x, value);}
1068};
1069
1070template <class __Operation, class _Tp>
1071inline _LIBCPP_INLINE_VISIBILITY
1072binder2nd<__Operation>
1073bind2nd(const __Operation& __op, const _Tp& __x)
1074 {return binder2nd<__Operation>(__op, __x);}
1075
1076template <class _Arg, class _Result>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001077class _LIBCPP_TEMPLATE_VIS pointer_to_unary_function
Howard Hinnant4ff57432010-09-21 22:55:27 +00001078 : public unary_function<_Arg, _Result>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079{
1080 _Result (*__f_)(_Arg);
1081public:
1082 _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg))
1083 : __f_(__f) {}
1084 _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const
1085 {return __f_(__x);}
1086};
1087
1088template <class _Arg, class _Result>
1089inline _LIBCPP_INLINE_VISIBILITY
1090pointer_to_unary_function<_Arg,_Result>
1091ptr_fun(_Result (*__f)(_Arg))
1092 {return pointer_to_unary_function<_Arg,_Result>(__f);}
1093
1094template <class _Arg1, class _Arg2, class _Result>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001095class _LIBCPP_TEMPLATE_VIS pointer_to_binary_function
Howard Hinnant4ff57432010-09-21 22:55:27 +00001096 : public binary_function<_Arg1, _Arg2, _Result>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001097{
1098 _Result (*__f_)(_Arg1, _Arg2);
1099public:
1100 _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2))
1101 : __f_(__f) {}
1102 _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const
1103 {return __f_(__x, __y);}
1104};
1105
1106template <class _Arg1, class _Arg2, class _Result>
1107inline _LIBCPP_INLINE_VISIBILITY
1108pointer_to_binary_function<_Arg1,_Arg2,_Result>
1109ptr_fun(_Result (*__f)(_Arg1,_Arg2))
1110 {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);}
1111
1112template<class _Sp, class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001113class _LIBCPP_TEMPLATE_VIS mem_fun_t : public unary_function<_Tp*, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001114{
1115 _Sp (_Tp::*__p_)();
1116public:
1117 _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)())
1118 : __p_(__p) {}
1119 _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const
1120 {return (__p->*__p_)();}
1121};
1122
1123template<class _Sp, class _Tp, class _Ap>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001124class _LIBCPP_TEMPLATE_VIS mem_fun1_t : public binary_function<_Tp*, _Ap, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001125{
1126 _Sp (_Tp::*__p_)(_Ap);
1127public:
1128 _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap))
1129 : __p_(__p) {}
1130 _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const
1131 {return (__p->*__p_)(__x);}
1132};
1133
1134template<class _Sp, class _Tp>
1135inline _LIBCPP_INLINE_VISIBILITY
1136mem_fun_t<_Sp,_Tp>
1137mem_fun(_Sp (_Tp::*__f)())
1138 {return mem_fun_t<_Sp,_Tp>(__f);}
1139
1140template<class _Sp, class _Tp, class _Ap>
1141inline _LIBCPP_INLINE_VISIBILITY
1142mem_fun1_t<_Sp,_Tp,_Ap>
1143mem_fun(_Sp (_Tp::*__f)(_Ap))
1144 {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
1145
1146template<class _Sp, class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001147class _LIBCPP_TEMPLATE_VIS mem_fun_ref_t : public unary_function<_Tp, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001148{
1149 _Sp (_Tp::*__p_)();
1150public:
1151 _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)())
1152 : __p_(__p) {}
1153 _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const
1154 {return (__p.*__p_)();}
1155};
1156
1157template<class _Sp, class _Tp, class _Ap>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001158class _LIBCPP_TEMPLATE_VIS mem_fun1_ref_t : public binary_function<_Tp, _Ap, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001159{
1160 _Sp (_Tp::*__p_)(_Ap);
1161public:
1162 _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap))
1163 : __p_(__p) {}
1164 _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const
1165 {return (__p.*__p_)(__x);}
1166};
1167
1168template<class _Sp, class _Tp>
1169inline _LIBCPP_INLINE_VISIBILITY
1170mem_fun_ref_t<_Sp,_Tp>
1171mem_fun_ref(_Sp (_Tp::*__f)())
1172 {return mem_fun_ref_t<_Sp,_Tp>(__f);}
1173
1174template<class _Sp, class _Tp, class _Ap>
1175inline _LIBCPP_INLINE_VISIBILITY
1176mem_fun1_ref_t<_Sp,_Tp,_Ap>
1177mem_fun_ref(_Sp (_Tp::*__f)(_Ap))
1178 {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
1179
1180template <class _Sp, class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001181class _LIBCPP_TEMPLATE_VIS const_mem_fun_t : public unary_function<const _Tp*, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001182{
1183 _Sp (_Tp::*__p_)() const;
1184public:
1185 _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const)
1186 : __p_(__p) {}
1187 _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const
1188 {return (__p->*__p_)();}
1189};
1190
1191template <class _Sp, class _Tp, class _Ap>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001192class _LIBCPP_TEMPLATE_VIS const_mem_fun1_t : public binary_function<const _Tp*, _Ap, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001193{
1194 _Sp (_Tp::*__p_)(_Ap) const;
1195public:
1196 _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const)
1197 : __p_(__p) {}
1198 _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const
1199 {return (__p->*__p_)(__x);}
1200};
1201
1202template <class _Sp, class _Tp>
1203inline _LIBCPP_INLINE_VISIBILITY
1204const_mem_fun_t<_Sp,_Tp>
1205mem_fun(_Sp (_Tp::*__f)() const)
1206 {return const_mem_fun_t<_Sp,_Tp>(__f);}
1207
1208template <class _Sp, class _Tp, class _Ap>
1209inline _LIBCPP_INLINE_VISIBILITY
1210const_mem_fun1_t<_Sp,_Tp,_Ap>
1211mem_fun(_Sp (_Tp::*__f)(_Ap) const)
1212 {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
1213
1214template <class _Sp, class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001215class _LIBCPP_TEMPLATE_VIS const_mem_fun_ref_t : public unary_function<_Tp, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001216{
1217 _Sp (_Tp::*__p_)() const;
1218public:
1219 _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const)
1220 : __p_(__p) {}
1221 _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const
1222 {return (__p.*__p_)();}
1223};
1224
1225template <class _Sp, class _Tp, class _Ap>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001226class _LIBCPP_TEMPLATE_VIS const_mem_fun1_ref_t
Howard Hinnant4ff57432010-09-21 22:55:27 +00001227 : public binary_function<_Tp, _Ap, _Sp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001228{
1229 _Sp (_Tp::*__p_)(_Ap) const;
1230public:
1231 _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const)
1232 : __p_(__p) {}
1233 _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const
1234 {return (__p.*__p_)(__x);}
1235};
1236
1237template <class _Sp, class _Tp>
1238inline _LIBCPP_INLINE_VISIBILITY
1239const_mem_fun_ref_t<_Sp,_Tp>
1240mem_fun_ref(_Sp (_Tp::*__f)() const)
1241 {return const_mem_fun_ref_t<_Sp,_Tp>(__f);}
1242
1243template <class _Sp, class _Tp, class _Ap>
1244inline _LIBCPP_INLINE_VISIBILITY
1245const_mem_fun1_ref_t<_Sp,_Tp,_Ap>
1246mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const)
1247 {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
Marshall Clow26a027c2017-04-13 18:25:32 +00001248#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001249
Eric Fiseliera6f61c62015-07-22 04:14:38 +00001250////////////////////////////////////////////////////////////////////////////////
1251// MEMFUN
1252//==============================================================================
Howard Hinnantc51e1022010-05-11 19:42:16 +00001253
Howard Hinnantc51e1022010-05-11 19:42:16 +00001254template <class _Tp>
1255class __mem_fn
1256 : public __weak_result_type<_Tp>
1257{
1258public:
1259 // types
1260 typedef _Tp type;
1261private:
1262 type __f_;
1263
1264public:
Marshall Clowad8ff212015-10-25 20:12:16 +00001265 _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001266
Eric Fiseliera9ae7a62017-04-19 01:28:47 +00001267#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001268 // invoke
1269 template <class... _ArgTypes>
Eric Fiselier2cc48332015-07-22 22:43:27 +00001270 _LIBCPP_INLINE_VISIBILITY
1271 typename __invoke_return<type, _ArgTypes...>::type
1272 operator() (_ArgTypes&&... __args) const {
1273 return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
1274 }
1275#else
Eric Fiselier2cc48332015-07-22 22:43:27 +00001276
1277 template <class _A0>
Eric Fiselierce1813a2015-08-26 20:15:02 +00001278 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2cc48332015-07-22 22:43:27 +00001279 typename __invoke_return0<type, _A0>::type
1280 operator() (_A0& __a0) const {
1281 return __invoke(__f_, __a0);
1282 }
1283
Eric Fiselierce1813a2015-08-26 20:15:02 +00001284 template <class _A0>
1285 _LIBCPP_INLINE_VISIBILITY
1286 typename __invoke_return0<type, _A0 const>::type
1287 operator() (_A0 const& __a0) const {
1288 return __invoke(__f_, __a0);
1289 }
1290
Eric Fiselier2cc48332015-07-22 22:43:27 +00001291 template <class _A0, class _A1>
Eric Fiselierce1813a2015-08-26 20:15:02 +00001292 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2cc48332015-07-22 22:43:27 +00001293 typename __invoke_return1<type, _A0, _A1>::type
1294 operator() (_A0& __a0, _A1& __a1) const {
1295 return __invoke(__f_, __a0, __a1);
1296 }
1297
Eric Fiselierce1813a2015-08-26 20:15:02 +00001298 template <class _A0, class _A1>
1299 _LIBCPP_INLINE_VISIBILITY
1300 typename __invoke_return1<type, _A0 const, _A1>::type
1301 operator() (_A0 const& __a0, _A1& __a1) const {
1302 return __invoke(__f_, __a0, __a1);
1303 }
1304
1305 template <class _A0, class _A1>
1306 _LIBCPP_INLINE_VISIBILITY
1307 typename __invoke_return1<type, _A0, _A1 const>::type
1308 operator() (_A0& __a0, _A1 const& __a1) const {
1309 return __invoke(__f_, __a0, __a1);
1310 }
1311
1312 template <class _A0, class _A1>
1313 _LIBCPP_INLINE_VISIBILITY
1314 typename __invoke_return1<type, _A0 const, _A1 const>::type
1315 operator() (_A0 const& __a0, _A1 const& __a1) const {
1316 return __invoke(__f_, __a0, __a1);
1317 }
1318
Eric Fiselier2cc48332015-07-22 22:43:27 +00001319 template <class _A0, class _A1, class _A2>
Eric Fiselierce1813a2015-08-26 20:15:02 +00001320 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2cc48332015-07-22 22:43:27 +00001321 typename __invoke_return2<type, _A0, _A1, _A2>::type
1322 operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
1323 return __invoke(__f_, __a0, __a1, __a2);
1324 }
Eric Fiselierce1813a2015-08-26 20:15:02 +00001325
1326 template <class _A0, class _A1, class _A2>
1327 _LIBCPP_INLINE_VISIBILITY
1328 typename __invoke_return2<type, _A0 const, _A1, _A2>::type
1329 operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
1330 return __invoke(__f_, __a0, __a1, __a2);
1331 }
1332
1333 template <class _A0, class _A1, class _A2>
1334 _LIBCPP_INLINE_VISIBILITY
1335 typename __invoke_return2<type, _A0, _A1 const, _A2>::type
1336 operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
1337 return __invoke(__f_, __a0, __a1, __a2);
1338 }
1339
1340 template <class _A0, class _A1, class _A2>
1341 _LIBCPP_INLINE_VISIBILITY
1342 typename __invoke_return2<type, _A0, _A1, _A2 const>::type
1343 operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
1344 return __invoke(__f_, __a0, __a1, __a2);
1345 }
1346
1347 template <class _A0, class _A1, class _A2>
1348 _LIBCPP_INLINE_VISIBILITY
1349 typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
1350 operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
1351 return __invoke(__f_, __a0, __a1, __a2);
1352 }
1353
1354 template <class _A0, class _A1, class _A2>
1355 _LIBCPP_INLINE_VISIBILITY
1356 typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
1357 operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
1358 return __invoke(__f_, __a0, __a1, __a2);
1359 }
1360
1361 template <class _A0, class _A1, class _A2>
1362 _LIBCPP_INLINE_VISIBILITY
1363 typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
1364 operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
1365 return __invoke(__f_, __a0, __a1, __a2);
1366 }
1367
1368 template <class _A0, class _A1, class _A2>
1369 _LIBCPP_INLINE_VISIBILITY
1370 typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
1371 operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
1372 return __invoke(__f_, __a0, __a1, __a2);
1373 }
Eric Fiselier2cc48332015-07-22 22:43:27 +00001374#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001375};
1376
Howard Hinnantc834c512011-11-29 18:15:50 +00001377template<class _Rp, class _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001378inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001379__mem_fn<_Rp _Tp::*>
Marshall Clowad8ff212015-10-25 20:12:16 +00001380mem_fn(_Rp _Tp::* __pm) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001381{
Howard Hinnantc834c512011-11-29 18:15:50 +00001382 return __mem_fn<_Rp _Tp::*>(__pm);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001383}
1384
Eric Fiseliera6f61c62015-07-22 04:14:38 +00001385////////////////////////////////////////////////////////////////////////////////
1386// FUNCTION
1387//==============================================================================
1388
Howard Hinnantc51e1022010-05-11 19:42:16 +00001389// bad_function_call
1390
Howard Hinnant4ff57432010-09-21 22:55:27 +00001391class _LIBCPP_EXCEPTION_ABI bad_function_call
Howard Hinnantc51e1022010-05-11 19:42:16 +00001392 : public exception
1393{
Shoaib Meenaic130eaf2017-03-28 19:33:31 +00001394#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
1395public:
1396 virtual ~bad_function_call() _NOEXCEPT;
1397
1398 virtual const char* what() const _NOEXCEPT;
1399#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001400};
1401
Marshall Clow8fea1612016-08-25 15:09:01 +00001402_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
1403void __throw_bad_function_call()
1404{
1405#ifndef _LIBCPP_NO_EXCEPTIONS
1406 throw bad_function_call();
1407#else
1408 _VSTD::abort();
1409#endif
1410}
1411
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001412template<class _Fp> class _LIBCPP_TEMPLATE_VIS function; // undefined
Howard Hinnantc51e1022010-05-11 19:42:16 +00001413
1414namespace __function
1415{
1416
Eric Fiseliera6f61c62015-07-22 04:14:38 +00001417template<class _Rp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001418struct __maybe_derive_from_unary_function
1419{
1420};
1421
Howard Hinnantc834c512011-11-29 18:15:50 +00001422template<class _Rp, class _A1>
1423struct __maybe_derive_from_unary_function<_Rp(_A1)>
1424 : public unary_function<_A1, _Rp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001425{
1426};
1427
Eric Fiseliera6f61c62015-07-22 04:14:38 +00001428template<class _Rp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001429struct __maybe_derive_from_binary_function
1430{
1431};
1432
Howard Hinnantc834c512011-11-29 18:15:50 +00001433template<class _Rp, class _A1, class _A2>
1434struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
1435 : public binary_function<_A1, _A2, _Rp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001436{
1437};
1438
Eric Fiseliera584a1e2015-08-18 19:41:51 +00001439template <class _Fp>
1440_LIBCPP_INLINE_VISIBILITY
1441bool __not_null(_Fp const&) { return true; }
1442
1443template <class _Fp>
1444_LIBCPP_INLINE_VISIBILITY
1445bool __not_null(_Fp* __ptr) { return __ptr; }
1446
1447template <class _Ret, class _Class>
1448_LIBCPP_INLINE_VISIBILITY
1449bool __not_null(_Ret _Class::*__ptr) { return __ptr; }
1450
1451template <class _Fp>
1452_LIBCPP_INLINE_VISIBILITY
1453bool __not_null(function<_Fp> const& __f) { return !!__f; }
1454
Eric Fiseliera6f61c62015-07-22 04:14:38 +00001455} // namespace __function
1456
Eric Fiseliera9ae7a62017-04-19 01:28:47 +00001457#ifndef _LIBCPP_CXX03_LANG
Eric Fiseliera6f61c62015-07-22 04:14:38 +00001458
1459namespace __function {
1460
Howard Hinnantc51e1022010-05-11 19:42:16 +00001461template<class _Fp> class __base;
1462
Howard Hinnantc834c512011-11-29 18:15:50 +00001463template<class _Rp, class ..._ArgTypes>
1464class __base<_Rp(_ArgTypes...)>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001465{
1466 __base(const __base&);
1467 __base& operator=(const __base&);
1468public:
Howard Hinnant4ff57432010-09-21 22:55:27 +00001469 _LIBCPP_INLINE_VISIBILITY __base() {}
1470 _LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001471 virtual __base* __clone() const = 0;
1472 virtual void __clone(__base*) const = 0;
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001473 virtual void destroy() _NOEXCEPT = 0;
1474 virtual void destroy_deallocate() _NOEXCEPT = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00001475 virtual _Rp operator()(_ArgTypes&& ...) = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +00001476#ifndef _LIBCPP_NO_RTTI
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001477 virtual const void* target(const type_info&) const _NOEXCEPT = 0;
1478 virtual const std::type_info& target_type() const _NOEXCEPT = 0;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001479#endif // _LIBCPP_NO_RTTI
Howard Hinnantc51e1022010-05-11 19:42:16 +00001480};
1481
1482template<class _FD, class _Alloc, class _FB> class __func;
1483
Howard Hinnantc834c512011-11-29 18:15:50 +00001484template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1485class __func<_Fp, _Alloc, _Rp(_ArgTypes...)>
1486 : public __base<_Rp(_ArgTypes...)>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001487{
Howard Hinnantc834c512011-11-29 18:15:50 +00001488 __compressed_pair<_Fp, _Alloc> __f_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001489public:
Howard Hinnant4ff57432010-09-21 22:55:27 +00001490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant4828c4a2012-02-28 19:47:38 +00001491 explicit __func(_Fp&& __f)
1492 : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
1493 _VSTD::forward_as_tuple()) {}
Howard Hinnant4ff57432010-09-21 22:55:27 +00001494 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant4828c4a2012-02-28 19:47:38 +00001495 explicit __func(const _Fp& __f, const _Alloc& __a)
1496 : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
1497 _VSTD::forward_as_tuple(__a)) {}
1498
1499 _LIBCPP_INLINE_VISIBILITY
1500 explicit __func(const _Fp& __f, _Alloc&& __a)
1501 : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
1502 _VSTD::forward_as_tuple(_VSTD::move(__a))) {}
1503
1504 _LIBCPP_INLINE_VISIBILITY
1505 explicit __func(_Fp&& __f, _Alloc&& __a)
1506 : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
1507 _VSTD::forward_as_tuple(_VSTD::move(__a))) {}
Howard Hinnantc834c512011-11-29 18:15:50 +00001508 virtual __base<_Rp(_ArgTypes...)>* __clone() const;
1509 virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001510 virtual void destroy() _NOEXCEPT;
1511 virtual void destroy_deallocate() _NOEXCEPT;
Howard Hinnantc834c512011-11-29 18:15:50 +00001512 virtual _Rp operator()(_ArgTypes&& ... __arg);
Howard Hinnant72f73582010-08-11 17:04:31 +00001513#ifndef _LIBCPP_NO_RTTI
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001514 virtual const void* target(const type_info&) const _NOEXCEPT;
1515 virtual const std::type_info& target_type() const _NOEXCEPT;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001516#endif // _LIBCPP_NO_RTTI
Howard Hinnantc51e1022010-05-11 19:42:16 +00001517};
1518
Howard Hinnantc834c512011-11-29 18:15:50 +00001519template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1520__base<_Rp(_ArgTypes...)>*
1521__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00001522{
Eric Fiselierb5826ad2015-03-18 22:56:50 +00001523 typedef allocator_traits<_Alloc> __alloc_traits;
Marshall Clow940e01c2015-04-07 05:21:38 +00001524 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc834c512011-11-29 18:15:50 +00001525 _Ap __a(__f_.second());
1526 typedef __allocator_destructor<_Ap> _Dp;
1527 unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001528 ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
1529 return __hold.release();
1530}
1531
Howard Hinnantc834c512011-11-29 18:15:50 +00001532template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001533void
Howard Hinnantc834c512011-11-29 18:15:50 +00001534__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00001535{
1536 ::new (__p) __func(__f_.first(), __f_.second());
1537}
1538
Howard Hinnantc834c512011-11-29 18:15:50 +00001539template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540void
Howard Hinnantc834c512011-11-29 18:15:50 +00001541__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001542{
Howard Hinnantc834c512011-11-29 18:15:50 +00001543 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001544}
1545
Howard Hinnantc834c512011-11-29 18:15:50 +00001546template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547void
Howard Hinnantc834c512011-11-29 18:15:50 +00001548__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001549{
Eric Fiselierb5826ad2015-03-18 22:56:50 +00001550 typedef allocator_traits<_Alloc> __alloc_traits;
Marshall Clow940e01c2015-04-07 05:21:38 +00001551 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc834c512011-11-29 18:15:50 +00001552 _Ap __a(__f_.second());
1553 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554 __a.deallocate(this, 1);
1555}
1556
Howard Hinnantc834c512011-11-29 18:15:50 +00001557template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1558_Rp
1559__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560{
Eric Fiselierea080702015-02-10 16:48:45 +00001561 typedef __invoke_void_return_wrapper<_Rp> _Invoker;
1562 return _Invoker::__call(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001563}
1564
Howard Hinnant72f73582010-08-11 17:04:31 +00001565#ifndef _LIBCPP_NO_RTTI
1566
Howard Hinnantc834c512011-11-29 18:15:50 +00001567template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001568const void*
Howard Hinnantc834c512011-11-29 18:15:50 +00001569__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001570{
Howard Hinnantc834c512011-11-29 18:15:50 +00001571 if (__ti == typeid(_Fp))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001572 return &__f_.first();
1573 return (const void*)0;
1574}
1575
Howard Hinnantc834c512011-11-29 18:15:50 +00001576template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001577const std::type_info&
Howard Hinnantc834c512011-11-29 18:15:50 +00001578__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001579{
Howard Hinnantc834c512011-11-29 18:15:50 +00001580 return typeid(_Fp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001581}
1582
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001583#endif // _LIBCPP_NO_RTTI
Howard Hinnant72f73582010-08-11 17:04:31 +00001584
Howard Hinnantc51e1022010-05-11 19:42:16 +00001585} // __function
1586
Howard Hinnantc834c512011-11-29 18:15:50 +00001587template<class _Rp, class ..._ArgTypes>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001588class _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>
Howard Hinnantc834c512011-11-29 18:15:50 +00001589 : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,
1590 public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001591{
Howard Hinnantc834c512011-11-29 18:15:50 +00001592 typedef __function::__base<_Rp(_ArgTypes...)> __base;
Howard Hinnant022c7482013-01-21 17:26:55 +00001593 typename aligned_storage<3*sizeof(void*)>::type __buf_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001594 __base* __f_;
1595
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001596 _LIBCPP_NO_CFI static __base *__as_base(void *p) {
1597 return reinterpret_cast<__base*>(p);
1598 }
1599
Eric Fiselier43c04f72017-09-10 23:41:20 +00001600 template <class _Fp, bool = __lazy_and<
1601 integral_constant<bool, !is_same<__uncvref_t<_Fp>, function>::value>,
1602 __invokable<_Fp&, _ArgTypes...>
1603 >::value>
1604 struct __callable;
Howard Hinnantc834c512011-11-29 18:15:50 +00001605 template <class _Fp>
1606 struct __callable<_Fp, true>
Howard Hinnant95755932011-05-31 21:45:26 +00001607 {
Eric Fiselierea080702015-02-10 16:48:45 +00001608 static const bool value = is_same<void, _Rp>::value ||
Howard Hinnantc834c512011-11-29 18:15:50 +00001609 is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type,
1610 _Rp>::value;
Howard Hinnant95755932011-05-31 21:45:26 +00001611 };
Howard Hinnantc834c512011-11-29 18:15:50 +00001612 template <class _Fp>
1613 struct __callable<_Fp, false>
Howard Hinnant95755932011-05-31 21:45:26 +00001614 {
1615 static const bool value = false;
1616 };
Eric Fiselier43c04f72017-09-10 23:41:20 +00001617
1618 template <class _Fp>
1619 using _EnableIfCallable = typename enable_if<__callable<_Fp>::value>::type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001620public:
Howard Hinnantc834c512011-11-29 18:15:50 +00001621 typedef _Rp result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001622
Howard Hinnantf06d9262010-08-20 19:36:46 +00001623 // construct/copy/destroy:
Howard Hinnant4ff57432010-09-21 22:55:27 +00001624 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001625 function() _NOEXCEPT : __f_(0) {}
Howard Hinnant4ff57432010-09-21 22:55:27 +00001626 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001627 function(nullptr_t) _NOEXCEPT : __f_(0) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001628 function(const function&);
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001629 function(function&&) _NOEXCEPT;
Eric Fiselier43c04f72017-09-10 23:41:20 +00001630 template<class _Fp, class = _EnableIfCallable<_Fp>>
Eric Fiselierf3e18cf2016-07-20 05:21:00 +00001631 function(_Fp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001632
Marshall Clow3148f422016-10-13 21:06:03 +00001633#if _LIBCPP_STD_VER <= 14
Howard Hinnantf06d9262010-08-20 19:36:46 +00001634 template<class _Alloc>
Howard Hinnant4ff57432010-09-21 22:55:27 +00001635 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001636 function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {}
Howard Hinnantf06d9262010-08-20 19:36:46 +00001637 template<class _Alloc>
Howard Hinnant4ff57432010-09-21 22:55:27 +00001638 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001639 function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : __f_(0) {}
Howard Hinnantf06d9262010-08-20 19:36:46 +00001640 template<class _Alloc>
1641 function(allocator_arg_t, const _Alloc&, const function&);
1642 template<class _Alloc>
1643 function(allocator_arg_t, const _Alloc&, function&&);
Eric Fiselier43c04f72017-09-10 23:41:20 +00001644 template<class _Fp, class _Alloc, class = _EnableIfCallable<_Fp>>
Eric Fiselierf3e18cf2016-07-20 05:21:00 +00001645 function(allocator_arg_t, const _Alloc& __a, _Fp __f);
Marshall Clow3148f422016-10-13 21:06:03 +00001646#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001647
1648 function& operator=(const function&);
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001649 function& operator=(function&&) _NOEXCEPT;
1650 function& operator=(nullptr_t) _NOEXCEPT;
Eric Fiselier43c04f72017-09-10 23:41:20 +00001651 template<class _Fp, class = _EnableIfCallable<_Fp>>
1652 function& operator=(_Fp&&);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001653
1654 ~function();
1655
Howard Hinnantf06d9262010-08-20 19:36:46 +00001656 // function modifiers:
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001657 void swap(function&) _NOEXCEPT;
Marshall Clowfc8fd832016-01-25 17:29:55 +00001658
1659#if _LIBCPP_STD_VER <= 14
Howard Hinnantc834c512011-11-29 18:15:50 +00001660 template<class _Fp, class _Alloc>
Howard Hinnant4ff57432010-09-21 22:55:27 +00001661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001662 void assign(_Fp&& __f, const _Alloc& __a)
1663 {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
Marshall Clowfc8fd832016-01-25 17:29:55 +00001664#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001665
Howard Hinnantf06d9262010-08-20 19:36:46 +00001666 // function capacity:
Howard Hinnant4ff57432010-09-21 22:55:27 +00001667 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant86a291f2012-02-21 21:46:43 +00001668 _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return __f_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001669
Howard Hinnantc51e1022010-05-11 19:42:16 +00001670 // deleted overloads close possible hole in the type system
1671 template<class _R2, class... _ArgTypes2>
Howard Hinnant5e9a1cf2010-09-11 15:33:21 +00001672 bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001673 template<class _R2, class... _ArgTypes2>
Howard Hinnant5e9a1cf2010-09-11 15:33:21 +00001674 bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001675public:
Howard Hinnantf06d9262010-08-20 19:36:46 +00001676 // function invocation:
Howard Hinnantc834c512011-11-29 18:15:50 +00001677 _Rp operator()(_ArgTypes...) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001678
Howard Hinnant72f73582010-08-11 17:04:31 +00001679#ifndef _LIBCPP_NO_RTTI
Howard Hinnantf06d9262010-08-20 19:36:46 +00001680 // function target access:
Howard Hinnantf7724cd2011-05-28 17:59:48 +00001681 const std::type_info& target_type() const _NOEXCEPT;
Howard Hinnantc834c512011-11-29 18:15:50 +00001682 template <typename _Tp> _Tp* target() _NOEXCEPT;
1683 template <typename _Tp> const _Tp* target() const _NOEXCEPT;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001684#endif // _LIBCPP_NO_RTTI
Howard Hinnantc51e1022010-05-11 19:42:16 +00001685};
1686
Howard Hinnantc834c512011-11-29 18:15:50 +00001687template<class _Rp, class ..._ArgTypes>
1688function<_Rp(_ArgTypes...)>::function(const function& __f)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689{
1690 if (__f.__f_ == 0)
1691 __f_ = 0;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001692 else if ((void *)__f.__f_ == &__f.__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001693 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001694 __f_ = __as_base(&__buf_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001695 __f.__f_->__clone(__f_);
1696 }
1697 else
1698 __f_ = __f.__f_->__clone();
1699}
1700
Marshall Clow3148f422016-10-13 21:06:03 +00001701#if _LIBCPP_STD_VER <= 14
Howard Hinnantc834c512011-11-29 18:15:50 +00001702template<class _Rp, class ..._ArgTypes>
Howard Hinnantf06d9262010-08-20 19:36:46 +00001703template <class _Alloc>
Howard Hinnantc834c512011-11-29 18:15:50 +00001704function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
Howard Hinnantf06d9262010-08-20 19:36:46 +00001705 const function& __f)
1706{
1707 if (__f.__f_ == 0)
1708 __f_ = 0;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001709 else if ((void *)__f.__f_ == &__f.__buf_)
Howard Hinnantf06d9262010-08-20 19:36:46 +00001710 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001711 __f_ = __as_base(&__buf_);
Howard Hinnantf06d9262010-08-20 19:36:46 +00001712 __f.__f_->__clone(__f_);
1713 }
1714 else
1715 __f_ = __f.__f_->__clone();
1716}
Marshall Clow3148f422016-10-13 21:06:03 +00001717#endif
Howard Hinnantf06d9262010-08-20 19:36:46 +00001718
Howard Hinnantc834c512011-11-29 18:15:50 +00001719template<class _Rp, class ..._ArgTypes>
1720function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001721{
1722 if (__f.__f_ == 0)
1723 __f_ = 0;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001724 else if ((void *)__f.__f_ == &__f.__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001725 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001726 __f_ = __as_base(&__buf_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001727 __f.__f_->__clone(__f_);
1728 }
1729 else
1730 {
1731 __f_ = __f.__f_;
1732 __f.__f_ = 0;
1733 }
1734}
1735
Marshall Clow3148f422016-10-13 21:06:03 +00001736#if _LIBCPP_STD_VER <= 14
Howard Hinnantc834c512011-11-29 18:15:50 +00001737template<class _Rp, class ..._ArgTypes>
Howard Hinnantf06d9262010-08-20 19:36:46 +00001738template <class _Alloc>
Howard Hinnantc834c512011-11-29 18:15:50 +00001739function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
Howard Hinnantf06d9262010-08-20 19:36:46 +00001740 function&& __f)
1741{
1742 if (__f.__f_ == 0)
1743 __f_ = 0;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001744 else if ((void *)__f.__f_ == &__f.__buf_)
Howard Hinnantf06d9262010-08-20 19:36:46 +00001745 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001746 __f_ = __as_base(&__buf_);
Howard Hinnantf06d9262010-08-20 19:36:46 +00001747 __f.__f_->__clone(__f_);
1748 }
1749 else
1750 {
1751 __f_ = __f.__f_;
1752 __f.__f_ = 0;
1753 }
1754}
Marshall Clow3148f422016-10-13 21:06:03 +00001755#endif
Howard Hinnantf06d9262010-08-20 19:36:46 +00001756
Howard Hinnantc834c512011-11-29 18:15:50 +00001757template<class _Rp, class ..._ArgTypes>
Eric Fiselierf3e18cf2016-07-20 05:21:00 +00001758template <class _Fp, class>
1759function<_Rp(_ArgTypes...)>::function(_Fp __f)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001760 : __f_(0)
1761{
Eric Fiseliera584a1e2015-08-18 19:41:51 +00001762 if (__function::__not_null(__f))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001763 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001764 typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF;
1765 if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001766 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001767 __f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001768 }
1769 else
1770 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001771 typedef allocator<_FF> _Ap;
1772 _Ap __a;
1773 typedef __allocator_destructor<_Ap> _Dp;
1774 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1775 ::new (__hold.get()) _FF(_VSTD::move(__f), allocator<_Fp>(__a));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001776 __f_ = __hold.release();
1777 }
1778 }
1779}
1780
Marshall Clow3148f422016-10-13 21:06:03 +00001781#if _LIBCPP_STD_VER <= 14
Howard Hinnantc834c512011-11-29 18:15:50 +00001782template<class _Rp, class ..._ArgTypes>
Eric Fiselierf3e18cf2016-07-20 05:21:00 +00001783template <class _Fp, class _Alloc, class>
1784function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f)
Howard Hinnantf06d9262010-08-20 19:36:46 +00001785 : __f_(0)
1786{
1787 typedef allocator_traits<_Alloc> __alloc_traits;
Eric Fiseliera584a1e2015-08-18 19:41:51 +00001788 if (__function::__not_null(__f))
Howard Hinnantf06d9262010-08-20 19:36:46 +00001789 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001790 typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _FF;
Marshall Clow940e01c2015-04-07 05:21:38 +00001791 typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
Marshall Clowe2631a22014-04-18 17:23:36 +00001792 _Ap __a(__a0);
1793 if (sizeof(_FF) <= sizeof(__buf_) &&
1794 is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value)
Howard Hinnantf06d9262010-08-20 19:36:46 +00001795 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001796 __f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f), _Alloc(__a));
Howard Hinnantf06d9262010-08-20 19:36:46 +00001797 }
1798 else
1799 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001800 typedef __allocator_destructor<_Ap> _Dp;
1801 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001802 ::new (__hold.get()) _FF(_VSTD::move(__f), _Alloc(__a));
Howard Hinnantf06d9262010-08-20 19:36:46 +00001803 __f_ = __hold.release();
1804 }
1805 }
1806}
Marshall Clow3148f422016-10-13 21:06:03 +00001807#endif
Howard Hinnantf06d9262010-08-20 19:36:46 +00001808
Howard Hinnantc834c512011-11-29 18:15:50 +00001809template<class _Rp, class ..._ArgTypes>
1810function<_Rp(_ArgTypes...)>&
1811function<_Rp(_ArgTypes...)>::operator=(const function& __f)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001812{
1813 function(__f).swap(*this);
1814 return *this;
1815}
1816
Howard Hinnantc834c512011-11-29 18:15:50 +00001817template<class _Rp, class ..._ArgTypes>
1818function<_Rp(_ArgTypes...)>&
1819function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001820{
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001821 if ((void *)__f_ == &__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001822 __f_->destroy();
1823 else if (__f_)
1824 __f_->destroy_deallocate();
1825 __f_ = 0;
1826 if (__f.__f_ == 0)
1827 __f_ = 0;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001828 else if ((void *)__f.__f_ == &__f.__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001829 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001830 __f_ = __as_base(&__buf_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001831 __f.__f_->__clone(__f_);
1832 }
1833 else
1834 {
1835 __f_ = __f.__f_;
1836 __f.__f_ = 0;
1837 }
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00001838 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001839}
1840
Howard Hinnantc834c512011-11-29 18:15:50 +00001841template<class _Rp, class ..._ArgTypes>
1842function<_Rp(_ArgTypes...)>&
1843function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001844{
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001845 if ((void *)__f_ == &__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001846 __f_->destroy();
1847 else if (__f_)
1848 __f_->destroy_deallocate();
1849 __f_ = 0;
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00001850 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001851}
1852
Howard Hinnantc834c512011-11-29 18:15:50 +00001853template<class _Rp, class ..._ArgTypes>
Eric Fiselier43c04f72017-09-10 23:41:20 +00001854template <class _Fp, class>
1855function<_Rp(_ArgTypes...)>&
Howard Hinnantc834c512011-11-29 18:15:50 +00001856function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001857{
Howard Hinnantc834c512011-11-29 18:15:50 +00001858 function(_VSTD::forward<_Fp>(__f)).swap(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001859 return *this;
1860}
1861
Howard Hinnantc834c512011-11-29 18:15:50 +00001862template<class _Rp, class ..._ArgTypes>
1863function<_Rp(_ArgTypes...)>::~function()
Howard Hinnantc51e1022010-05-11 19:42:16 +00001864{
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001865 if ((void *)__f_ == &__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001866 __f_->destroy();
1867 else if (__f_)
1868 __f_->destroy_deallocate();
1869}
1870
Howard Hinnantc834c512011-11-29 18:15:50 +00001871template<class _Rp, class ..._ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001872void
Howard Hinnantc834c512011-11-29 18:15:50 +00001873function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001874{
Eric Fiselierc84b3fd2016-12-29 20:03:55 +00001875 if (_VSTD::addressof(__f) == this)
1876 return;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001877 if ((void *)__f_ == &__buf_ && (void *)__f.__f_ == &__f.__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001878 {
1879 typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001880 __base* __t = __as_base(&__tempbuf);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001881 __f_->__clone(__t);
1882 __f_->destroy();
1883 __f_ = 0;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001884 __f.__f_->__clone(__as_base(&__buf_));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001885 __f.__f_->destroy();
1886 __f.__f_ = 0;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001887 __f_ = __as_base(&__buf_);
1888 __t->__clone(__as_base(&__f.__buf_));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001889 __t->destroy();
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001890 __f.__f_ = __as_base(&__f.__buf_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001891 }
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001892 else if ((void *)__f_ == &__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001893 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001894 __f_->__clone(__as_base(&__f.__buf_));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001895 __f_->destroy();
1896 __f_ = __f.__f_;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001897 __f.__f_ = __as_base(&__f.__buf_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001898 }
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001899 else if ((void *)__f.__f_ == &__f.__buf_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001900 {
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001901 __f.__f_->__clone(__as_base(&__buf_));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001902 __f.__f_->destroy();
1903 __f.__f_ = __f_;
Evgeniy Stepanov076b2372016-02-10 21:53:28 +00001904 __f_ = __as_base(&__buf_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001905 }
1906 else
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001907 _VSTD::swap(__f_, __f.__f_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001908}
1909
Howard Hinnantc834c512011-11-29 18:15:50 +00001910template<class _Rp, class ..._ArgTypes>
1911_Rp
1912function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00001913{
1914 if (__f_ == 0)
Marshall Clow8fea1612016-08-25 15:09:01 +00001915 __throw_bad_function_call();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001916 return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001917}
1918
Howard Hinnant72f73582010-08-11 17:04:31 +00001919#ifndef _LIBCPP_NO_RTTI
1920
Howard Hinnantc834c512011-11-29 18:15:50 +00001921template<class _Rp, class ..._ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001922const std::type_info&
Howard Hinnantc834c512011-11-29 18:15:50 +00001923function<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001924{
1925 if (__f_ == 0)
1926 return typeid(void);
1927 return __f_->target_type();
1928}
1929
Howard Hinnantc834c512011-11-29 18:15:50 +00001930template<class _Rp, class ..._ArgTypes>
1931template <typename _Tp>
1932_Tp*
1933function<_Rp(_ArgTypes...)>::target() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001934{
1935 if (__f_ == 0)
Marshall Clowbeda7142017-06-14 20:00:36 +00001936 return nullptr;
1937 return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001938}
1939
Howard Hinnantc834c512011-11-29 18:15:50 +00001940template<class _Rp, class ..._ArgTypes>
1941template <typename _Tp>
1942const _Tp*
1943function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001944{
1945 if (__f_ == 0)
Marshall Clowbeda7142017-06-14 20:00:36 +00001946 return nullptr;
Howard Hinnantc834c512011-11-29 18:15:50 +00001947 return (const _Tp*)__f_->target(typeid(_Tp));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001948}
1949
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001950#endif // _LIBCPP_NO_RTTI
Howard Hinnant72f73582010-08-11 17:04:31 +00001951
Howard Hinnantc834c512011-11-29 18:15:50 +00001952template <class _Rp, class... _ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001953inline _LIBCPP_INLINE_VISIBILITY
1954bool
Howard Hinnantc834c512011-11-29 18:15:50 +00001955operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001956
Howard Hinnantc834c512011-11-29 18:15:50 +00001957template <class _Rp, class... _ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001958inline _LIBCPP_INLINE_VISIBILITY
1959bool
Howard Hinnantc834c512011-11-29 18:15:50 +00001960operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001961
Howard Hinnantc834c512011-11-29 18:15:50 +00001962template <class _Rp, class... _ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001963inline _LIBCPP_INLINE_VISIBILITY
1964bool
Howard Hinnantc834c512011-11-29 18:15:50 +00001965operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001966
Howard Hinnantc834c512011-11-29 18:15:50 +00001967template <class _Rp, class... _ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001968inline _LIBCPP_INLINE_VISIBILITY
1969bool
Howard Hinnantc834c512011-11-29 18:15:50 +00001970operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001971
Howard Hinnantc834c512011-11-29 18:15:50 +00001972template <class _Rp, class... _ArgTypes>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001973inline _LIBCPP_INLINE_VISIBILITY
1974void
Howard Hinnantc834c512011-11-29 18:15:50 +00001975swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001976{return __x.swap(__y);}
1977
Eric Fiseliera9ae7a62017-04-19 01:28:47 +00001978#else // _LIBCPP_CXX03_LANG
Eric Fiselier2cc48332015-07-22 22:43:27 +00001979
1980#include <__functional_03>
1981
1982#endif
Eric Fiseliera6f61c62015-07-22 04:14:38 +00001983
1984////////////////////////////////////////////////////////////////////////////////
1985// BIND
1986//==============================================================================
1987
Howard Hinnantc51e1022010-05-11 19:42:16 +00001988template<class _Tp> struct __is_bind_expression : public false_type {};
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001989template<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_bind_expression
Howard Hinnantc51e1022010-05-11 19:42:16 +00001990 : public __is_bind_expression<typename remove_cv<_Tp>::type> {};
1991
Marshall Clow2d2d7f12016-09-22 00:23:15 +00001992#if _LIBCPP_STD_VER > 14
1993template <class _Tp>
1994constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value;
1995#endif
1996
Howard Hinnantc51e1022010-05-11 19:42:16 +00001997template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001998template<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_placeholder
Howard Hinnantc51e1022010-05-11 19:42:16 +00001999 : public __is_placeholder<typename remove_cv<_Tp>::type> {};
2000
Marshall Clow2d2d7f12016-09-22 00:23:15 +00002001#if _LIBCPP_STD_VER > 14
2002template <class _Tp>
2003constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value;
2004#endif
2005
Howard Hinnantc51e1022010-05-11 19:42:16 +00002006namespace placeholders
2007{
2008
Howard Hinnantc834c512011-11-29 18:15:50 +00002009template <int _Np> struct __ph {};
Howard Hinnantc51e1022010-05-11 19:42:16 +00002010
Eric Fiselierb7f51d62016-06-26 21:01:34 +00002011#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_BIND)
2012_LIBCPP_FUNC_VIS extern const __ph<1> _1;
2013_LIBCPP_FUNC_VIS extern const __ph<2> _2;
2014_LIBCPP_FUNC_VIS extern const __ph<3> _3;
2015_LIBCPP_FUNC_VIS extern const __ph<4> _4;
2016_LIBCPP_FUNC_VIS extern const __ph<5> _5;
2017_LIBCPP_FUNC_VIS extern const __ph<6> _6;
2018_LIBCPP_FUNC_VIS extern const __ph<7> _7;
2019_LIBCPP_FUNC_VIS extern const __ph<8> _8;
2020_LIBCPP_FUNC_VIS extern const __ph<9> _9;
2021_LIBCPP_FUNC_VIS extern const __ph<10> _10;
2022#else
2023constexpr __ph<1> _1{};
2024constexpr __ph<2> _2{};
2025constexpr __ph<3> _3{};
2026constexpr __ph<4> _4{};
2027constexpr __ph<5> _5{};
2028constexpr __ph<6> _6{};
2029constexpr __ph<7> _7{};
2030constexpr __ph<8> _8{};
2031constexpr __ph<9> _9{};
2032constexpr __ph<10> _10{};
2033#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_BIND)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002034
2035} // placeholders
2036
Howard Hinnantc834c512011-11-29 18:15:50 +00002037template<int _Np>
2038struct __is_placeholder<placeholders::__ph<_Np> >
2039 : public integral_constant<int, _Np> {};
Howard Hinnantc51e1022010-05-11 19:42:16 +00002040
Eric Fiseliera6f61c62015-07-22 04:14:38 +00002041
Eric Fiseliera9ae7a62017-04-19 01:28:47 +00002042#ifndef _LIBCPP_CXX03_LANG
Eric Fiseliera6f61c62015-07-22 04:14:38 +00002043
Howard Hinnantc51e1022010-05-11 19:42:16 +00002044template <class _Tp, class _Uj>
2045inline _LIBCPP_INLINE_VISIBILITY
2046_Tp&
2047__mu(reference_wrapper<_Tp> __t, _Uj&)
2048{
2049 return __t.get();
2050}
2051
Howard Hinnantc51e1022010-05-11 19:42:16 +00002052template <class _Ti, class ..._Uj, size_t ..._Indx>
2053inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc1132eb2011-05-19 19:41:47 +00002054typename __invoke_of<_Ti&, _Uj...>::type
2055__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002056{
Marshall Clow60e4aa72014-06-24 00:46:19 +00002057 return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002058}
2059
2060template <class _Ti, class ..._Uj>
2061inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselierf3a1cea2014-12-23 05:54:34 +00002062typename __lazy_enable_if
Howard Hinnantc51e1022010-05-11 19:42:16 +00002063<
2064 is_bind_expression<_Ti>::value,
Eric Fiselierf3a1cea2014-12-23 05:54:34 +00002065 __invoke_of<_Ti&, _Uj...>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002066>::type
2067__mu(_Ti& __ti, tuple<_Uj...>& __uj)
2068{
2069 typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
2070 return __mu_expand(__ti, __uj, __indices());
2071}
2072
2073template <bool IsPh, class _Ti, class _Uj>
2074struct __mu_return2 {};
2075
2076template <class _Ti, class _Uj>
2077struct __mu_return2<true, _Ti, _Uj>
2078{
2079 typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type;
2080};
2081
2082template <class _Ti, class _Uj>
2083inline _LIBCPP_INLINE_VISIBILITY
2084typename enable_if
2085<
2086 0 < is_placeholder<_Ti>::value,
2087 typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type
2088>::type
2089__mu(_Ti&, _Uj& __uj)
2090{
2091 const size_t _Indx = is_placeholder<_Ti>::value - 1;
Marshall Clow60e4aa72014-06-24 00:46:19 +00002092 return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002093}
2094
2095template <class _Ti, class _Uj>
2096inline _LIBCPP_INLINE_VISIBILITY
2097typename enable_if
2098<
2099 !is_bind_expression<_Ti>::value &&
2100 is_placeholder<_Ti>::value == 0 &&
2101 !__is_reference_wrapper<_Ti>::value,
2102 _Ti&
2103>::type
Howard Hinnant28b24882011-12-01 20:21:04 +00002104__mu(_Ti& __ti, _Uj&)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002105{
2106 return __ti;
2107}
2108
Howard Hinnant0415d792011-05-22 15:07:43 +00002109template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
2110 class _TupleUj>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002111struct ____mu_return;
2112
Howard Hinnant51dae7a2013-06-30 19:48:15 +00002113template <bool _Invokable, class _Ti, class ..._Uj>
2114struct ____mu_return_invokable // false
2115{
2116 typedef __nat type;
2117};
2118
Howard Hinnantc51e1022010-05-11 19:42:16 +00002119template <class _Ti, class ..._Uj>
Howard Hinnant51dae7a2013-06-30 19:48:15 +00002120struct ____mu_return_invokable<true, _Ti, _Uj...>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002121{
Howard Hinnantc1132eb2011-05-19 19:41:47 +00002122 typedef typename __invoke_of<_Ti&, _Uj...>::type type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002123};
2124
Howard Hinnant51dae7a2013-06-30 19:48:15 +00002125template <class _Ti, class ..._Uj>
2126struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> >
2127 : public ____mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
2128{
2129};
2130
Howard Hinnantc51e1022010-05-11 19:42:16 +00002131template <class _Ti, class _TupleUj>
Howard Hinnant0415d792011-05-22 15:07:43 +00002132struct ____mu_return<_Ti, false, false, true, _TupleUj>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002133{
2134 typedef typename tuple_element<is_placeholder<_Ti>::value - 1,
2135 _TupleUj>::type&& type;
2136};
2137
2138template <class _Ti, class _TupleUj>
Howard Hinnant0415d792011-05-22 15:07:43 +00002139struct ____mu_return<_Ti, true, false, false, _TupleUj>
2140{
2141 typedef typename _Ti::type& type;
2142};
2143
2144template <class _Ti, class _TupleUj>
2145struct ____mu_return<_Ti, false, false, false, _TupleUj>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002146{
2147 typedef _Ti& type;
2148};
2149
2150template <class _Ti, class _TupleUj>
2151struct __mu_return
2152 : public ____mu_return<_Ti,
Howard Hinnant0415d792011-05-22 15:07:43 +00002153 __is_reference_wrapper<_Ti>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002154 is_bind_expression<_Ti>::value,
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002155 0 < is_placeholder<_Ti>::value &&
2156 is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002157 _TupleUj>
2158{
2159};
2160
Howard Hinnantc834c512011-11-29 18:15:50 +00002161template <class _Fp, class _BoundArgs, class _TupleUj>
Eric Fiselier99fffba2015-05-19 22:27:18 +00002162struct __is_valid_bind_return
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002163{
2164 static const bool value = false;
2165};
2166
2167template <class _Fp, class ..._BoundArgs, class _TupleUj>
Eric Fiselier99fffba2015-05-19 22:27:18 +00002168struct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj>
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002169{
2170 static const bool value = __invokable<_Fp,
2171 typename __mu_return<_BoundArgs, _TupleUj>::type...>::value;
2172};
2173
2174template <class _Fp, class ..._BoundArgs, class _TupleUj>
Eric Fiselier99fffba2015-05-19 22:27:18 +00002175struct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj>
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002176{
2177 static const bool value = __invokable<_Fp,
2178 typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value;
2179};
2180
2181template <class _Fp, class _BoundArgs, class _TupleUj,
Eric Fiselier99fffba2015-05-19 22:27:18 +00002182 bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002183struct __bind_return;
2184
Howard Hinnantc834c512011-11-29 18:15:50 +00002185template <class _Fp, class ..._BoundArgs, class _TupleUj>
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002186struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002187{
Howard Hinnantc1132eb2011-05-19 19:41:47 +00002188 typedef typename __invoke_of
Howard Hinnantc51e1022010-05-11 19:42:16 +00002189 <
Howard Hinnantc834c512011-11-29 18:15:50 +00002190 _Fp&,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002191 typename __mu_return
2192 <
2193 _BoundArgs,
2194 _TupleUj
2195 >::type...
2196 >::type type;
2197};
2198
Howard Hinnantc834c512011-11-29 18:15:50 +00002199template <class _Fp, class ..._BoundArgs, class _TupleUj>
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002200struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002201{
Howard Hinnantc1132eb2011-05-19 19:41:47 +00002202 typedef typename __invoke_of
Howard Hinnantc51e1022010-05-11 19:42:16 +00002203 <
Howard Hinnantc834c512011-11-29 18:15:50 +00002204 _Fp&,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002205 typename __mu_return
2206 <
2207 const _BoundArgs,
2208 _TupleUj
2209 >::type...
2210 >::type type;
2211};
2212
Howard Hinnantc834c512011-11-29 18:15:50 +00002213template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002214inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00002215typename __bind_return<_Fp, _BoundArgs, _Args>::type
2216__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002217 _Args&& __args)
2218{
Eric Fiselier17264eb2017-05-03 21:02:19 +00002219 return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002220}
2221
Howard Hinnantc834c512011-11-29 18:15:50 +00002222template<class _Fp, class ..._BoundArgs>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002223class __bind
Howard Hinnantc834c512011-11-29 18:15:50 +00002224 : public __weak_result_type<typename decay<_Fp>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002225{
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002226protected:
Howard Hinnantc834c512011-11-29 18:15:50 +00002227 typedef typename decay<_Fp>::type _Fd;
Howard Hinnantc1132eb2011-05-19 19:41:47 +00002228 typedef tuple<typename decay<_BoundArgs>::type...> _Td;
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002229private:
Howard Hinnantc1132eb2011-05-19 19:41:47 +00002230 _Fd __f_;
2231 _Td __bound_args_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002232
2233 typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
2234public:
Howard Hinnant0337ade2012-05-04 17:21:02 +00002235 template <class _Gp, class ..._BA,
2236 class = typename enable_if
2237 <
Howard Hinnantf292a922013-07-01 00:01:51 +00002238 is_constructible<_Fd, _Gp>::value &&
2239 !is_same<typename remove_reference<_Gp>::type,
2240 __bind>::value
Howard Hinnant0337ade2012-05-04 17:21:02 +00002241 >::type>
Howard Hinnant4ff57432010-09-21 22:55:27 +00002242 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00002243 explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
2244 : __f_(_VSTD::forward<_Gp>(__f)),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002245 __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002246
2247 template <class ..._Args>
Howard Hinnant4ff57432010-09-21 22:55:27 +00002248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc1132eb2011-05-19 19:41:47 +00002249 typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
Howard Hinnantc51e1022010-05-11 19:42:16 +00002250 operator()(_Args&& ...__args)
2251 {
Eric Fiselier17264eb2017-05-03 21:02:19 +00002252 return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002253 tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002254 }
2255
2256 template <class ..._Args>
Howard Hinnant4ff57432010-09-21 22:55:27 +00002257 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002258 typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
Howard Hinnantc51e1022010-05-11 19:42:16 +00002259 operator()(_Args&& ...__args) const
2260 {
Eric Fiselier17264eb2017-05-03 21:02:19 +00002261 return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002262 tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002263 }
2264};
2265
Howard Hinnantc834c512011-11-29 18:15:50 +00002266template<class _Fp, class ..._BoundArgs>
2267struct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {};
Howard Hinnantc51e1022010-05-11 19:42:16 +00002268
Howard Hinnantc834c512011-11-29 18:15:50 +00002269template<class _Rp, class _Fp, class ..._BoundArgs>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002270class __bind_r
Howard Hinnantc834c512011-11-29 18:15:50 +00002271 : public __bind<_Fp, _BoundArgs...>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002272{
Howard Hinnantc834c512011-11-29 18:15:50 +00002273 typedef __bind<_Fp, _BoundArgs...> base;
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002274 typedef typename base::_Fd _Fd;
2275 typedef typename base::_Td _Td;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002276public:
Howard Hinnantc834c512011-11-29 18:15:50 +00002277 typedef _Rp result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002278
Howard Hinnant7091e652011-07-02 18:22:36 +00002279
Howard Hinnantf292a922013-07-01 00:01:51 +00002280 template <class _Gp, class ..._BA,
2281 class = typename enable_if
2282 <
2283 is_constructible<_Fd, _Gp>::value &&
2284 !is_same<typename remove_reference<_Gp>::type,
2285 __bind_r>::value
2286 >::type>
Howard Hinnant4ff57432010-09-21 22:55:27 +00002287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00002288 explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
2289 : base(_VSTD::forward<_Gp>(__f),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002290 _VSTD::forward<_BA>(__bound_args)...) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002291
2292 template <class ..._Args>
Howard Hinnant4ff57432010-09-21 22:55:27 +00002293 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002294 typename enable_if
2295 <
2296 is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
Eric Fiselier7a8710a2015-07-10 23:29:18 +00002297 result_type>::value || is_void<_Rp>::value,
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002298 result_type
2299 >::type
Howard Hinnantc51e1022010-05-11 19:42:16 +00002300 operator()(_Args&& ...__args)
2301 {
Eric Fiselier7a8710a2015-07-10 23:29:18 +00002302 typedef __invoke_void_return_wrapper<_Rp> _Invoker;
2303 return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002304 }
2305
2306 template <class ..._Args>
Howard Hinnant4ff57432010-09-21 22:55:27 +00002307 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002308 typename enable_if
2309 <
2310 is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
Eric Fiselier7a8710a2015-07-10 23:29:18 +00002311 result_type>::value || is_void<_Rp>::value,
Howard Hinnantde3a5f02013-02-21 18:16:55 +00002312 result_type
2313 >::type
Howard Hinnantc51e1022010-05-11 19:42:16 +00002314 operator()(_Args&& ...__args) const
2315 {
Eric Fiselier7a8710a2015-07-10 23:29:18 +00002316 typedef __invoke_void_return_wrapper<_Rp> _Invoker;
2317 return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002318 }
2319};
2320
Howard Hinnantc834c512011-11-29 18:15:50 +00002321template<class _Rp, class _Fp, class ..._BoundArgs>
2322struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
Howard Hinnantc51e1022010-05-11 19:42:16 +00002323
Howard Hinnantc834c512011-11-29 18:15:50 +00002324template<class _Fp, class ..._BoundArgs>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002325inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00002326__bind<_Fp, _BoundArgs...>
2327bind(_Fp&& __f, _BoundArgs&&... __bound_args)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002328{
Howard Hinnantc834c512011-11-29 18:15:50 +00002329 typedef __bind<_Fp, _BoundArgs...> type;
2330 return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002331}
2332
Howard Hinnantc834c512011-11-29 18:15:50 +00002333template<class _Rp, class _Fp, class ..._BoundArgs>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002334inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00002335__bind_r<_Rp, _Fp, _BoundArgs...>
2336bind(_Fp&& __f, _BoundArgs&&... __bound_args)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002337{
Howard Hinnantc834c512011-11-29 18:15:50 +00002338 typedef __bind_r<_Rp, _Fp, _BoundArgs...> type;
2339 return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002340}
2341
Eric Fiseliera9ae7a62017-04-19 01:28:47 +00002342#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002343
Eric Fiselier0d974f12015-07-14 20:16:15 +00002344#if _LIBCPP_STD_VER > 14
Eric Fiselier934f63b2016-06-02 01:25:41 +00002345
Eric Fiselier52d8f642016-10-14 07:19:52 +00002346#define __cpp_lib_invoke 201411
2347
Eric Fiselier0d974f12015-07-14 20:16:15 +00002348template <class _Fn, class ..._Args>
2349result_of_t<_Fn&&(_Args&&...)>
Eric Fiselier934f63b2016-06-02 01:25:41 +00002350invoke(_Fn&& __f, _Args&&... __args)
2351 noexcept(noexcept(_VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...)))
2352{
2353 return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
Eric Fiselier0d974f12015-07-14 20:16:15 +00002354}
Eric Fiselier934f63b2016-06-02 01:25:41 +00002355
2356template <class _DecayFunc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002357class _LIBCPP_TEMPLATE_VIS __not_fn_imp {
Eric Fiselier934f63b2016-06-02 01:25:41 +00002358 _DecayFunc __fd;
2359
2360public:
2361 __not_fn_imp() = delete;
2362
2363 template <class ..._Args>
2364 _LIBCPP_INLINE_VISIBILITY
Eric Fiseliere8303a32016-06-27 00:40:41 +00002365 auto operator()(_Args&& ...__args) &
Eric Fiselier934f63b2016-06-02 01:25:41 +00002366 noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
Marshall Clowdb7095c2016-10-10 14:37:18 +00002367 -> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
2368 { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
Eric Fiselier934f63b2016-06-02 01:25:41 +00002369
2370 template <class ..._Args>
2371 _LIBCPP_INLINE_VISIBILITY
Eric Fiseliere8303a32016-06-27 00:40:41 +00002372 auto operator()(_Args&& ...__args) &&
2373 noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
Marshall Clowdb7095c2016-10-10 14:37:18 +00002374 -> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
2375 { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
Eric Fiseliere8303a32016-06-27 00:40:41 +00002376
2377 template <class ..._Args>
2378 _LIBCPP_INLINE_VISIBILITY
2379 auto operator()(_Args&& ...__args) const&
Eric Fiselier934f63b2016-06-02 01:25:41 +00002380 noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
Marshall Clowdb7095c2016-10-10 14:37:18 +00002381 -> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
2382 { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
Eric Fiselier934f63b2016-06-02 01:25:41 +00002383
Eric Fiseliere8303a32016-06-27 00:40:41 +00002384
2385 template <class ..._Args>
2386 _LIBCPP_INLINE_VISIBILITY
2387 auto operator()(_Args&& ...__args) const&&
2388 noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
Marshall Clowdb7095c2016-10-10 14:37:18 +00002389 -> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
2390 { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
Eric Fiseliere8303a32016-06-27 00:40:41 +00002391
Eric Fiselier934f63b2016-06-02 01:25:41 +00002392private:
2393 template <class _RawFunc,
2394 class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>>
2395 _LIBCPP_INLINE_VISIBILITY
2396 explicit __not_fn_imp(_RawFunc&& __rf)
2397 : __fd(_VSTD::forward<_RawFunc>(__rf)) {}
2398
2399 template <class _RawFunc>
2400 friend inline _LIBCPP_INLINE_VISIBILITY
2401 __not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&);
2402};
2403
2404template <class _RawFunc>
2405inline _LIBCPP_INLINE_VISIBILITY
2406__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) {
2407 return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn));
2408}
2409
Eric Fiselier0d974f12015-07-14 20:16:15 +00002410#endif
2411
Howard Hinnant36b31ae2010-06-03 16:42:57 +00002412// struct hash<T*> in <memory>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002413
Howard Hinnantc51e1022010-05-11 19:42:16 +00002414_LIBCPP_END_NAMESPACE_STD
2415
2416#endif // _LIBCPP_FUNCTIONAL