xref: /llvm-project/libcxx/include/__cxx03/functional (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser// -*- C++ -*-
2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===//
3e78f53d1SNikolas Klauser//
4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information.
6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7e78f53d1SNikolas Klauser//
8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===//
9e78f53d1SNikolas Klauser
10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_FUNCTIONAL
11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_FUNCTIONAL
12e78f53d1SNikolas Klauser
13e78f53d1SNikolas Klauser/*
14e78f53d1SNikolas Klauser    functional synopsis
15e78f53d1SNikolas Klauser
16e78f53d1SNikolas Klausernamespace std
17e78f53d1SNikolas Klauser{
18e78f53d1SNikolas Klauser
19e78f53d1SNikolas Klausertemplate <class Arg, class Result>
20e78f53d1SNikolas Klauserstruct unary_function
21e78f53d1SNikolas Klauser{
22e78f53d1SNikolas Klauser    typedef Arg    argument_type;
23e78f53d1SNikolas Klauser    typedef Result result_type;
24e78f53d1SNikolas Klauser};
25e78f53d1SNikolas Klauser
26e78f53d1SNikolas Klausertemplate <class Arg1, class Arg2, class Result>
27e78f53d1SNikolas Klauserstruct binary_function
28e78f53d1SNikolas Klauser{
29e78f53d1SNikolas Klauser    typedef Arg1   first_argument_type;
30e78f53d1SNikolas Klauser    typedef Arg2   second_argument_type;
31e78f53d1SNikolas Klauser    typedef Result result_type;
32e78f53d1SNikolas Klauser};
33e78f53d1SNikolas Klauser
34e78f53d1SNikolas Klausertemplate <class T>
35e78f53d1SNikolas Klauserclass reference_wrapper
36e78f53d1SNikolas Klauser    : public unary_function<T1, R> // if wrapping a unary functor
37e78f53d1SNikolas Klauser    : public binary_function<T1, T2, R> // if wrapping a binary functor
38e78f53d1SNikolas Klauser{
39e78f53d1SNikolas Klauserpublic:
40e78f53d1SNikolas Klauser    // types
41e78f53d1SNikolas Klauser    typedef T type;
42e78f53d1SNikolas Klauser    typedef see below result_type; // Not always defined
43e78f53d1SNikolas Klauser
44e78f53d1SNikolas Klauser    // construct/copy/destroy
45e78f53d1SNikolas Klauser    template<class U>
46e78f53d1SNikolas Klauser      constexpr reference_wrapper(U&&);                                   // constexpr since C++20
47e78f53d1SNikolas Klauser    constexpr reference_wrapper(const reference_wrapper<T>& x) noexcept;  // constexpr since C++20
48e78f53d1SNikolas Klauser
49e78f53d1SNikolas Klauser    // assignment
50e78f53d1SNikolas Klauser    constexpr reference_wrapper&
51e78f53d1SNikolas Klauser    operator=(const reference_wrapper<T>& x) noexcept;                    // constexpr since C++20
52e78f53d1SNikolas Klauser
53e78f53d1SNikolas Klauser    // access
54e78f53d1SNikolas Klauser    constexpr operator T& () const noexcept;                              // constexpr since C++20
55e78f53d1SNikolas Klauser    constexpr T& get() const noexcept;                                    // constexpr since C++20
56e78f53d1SNikolas Klauser
57e78f53d1SNikolas Klauser    // invoke
58e78f53d1SNikolas Klauser    template <class... ArgTypes>
59e78f53d1SNikolas Klauser      constexpr typename result_of<T&(ArgTypes&&...)>::type               // constexpr since C++20
60e78f53d1SNikolas Klauser          operator() (ArgTypes&&...) const
61e78f53d1SNikolas Klauser              noexcept(is_nothrow_invocable_v<T&, ArgTypes...>);          // noexcept since C++17
62e78f53d1SNikolas Klauser};
63e78f53d1SNikolas Klauser
64e78f53d1SNikolas Klausertemplate <class T>
65e78f53d1SNikolas Klauser  reference_wrapper(T&) -> reference_wrapper<T>;
66e78f53d1SNikolas Klauser
67e78f53d1SNikolas Klausertemplate <class T> reference_wrapper<T> ref(T& t) noexcept;
68e78f53d1SNikolas Klausertemplate <class T> void ref(const T&& t) = delete;
69e78f53d1SNikolas Klausertemplate <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
70e78f53d1SNikolas Klauser
71e78f53d1SNikolas Klausertemplate <class T> reference_wrapper<const T> cref(const T& t) noexcept;
72e78f53d1SNikolas Klausertemplate <class T> void cref(const T&& t) = delete;
73e78f53d1SNikolas Klausertemplate <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
74e78f53d1SNikolas Klauser
75e78f53d1SNikolas Klausertemplate <class T> struct unwrap_reference;                                       // since C++20
76e78f53d1SNikolas Klausertemplate <class T> struct unwrap_ref_decay : unwrap_reference<decay_t<T>> { };    // since C++20
77e78f53d1SNikolas Klausertemplate <class T> using unwrap_reference_t = typename unwrap_reference<T>::type; // since C++20
78e78f53d1SNikolas Klausertemplate <class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; // since C++20
79e78f53d1SNikolas Klauser
80e78f53d1SNikolas Klauser// [refwrap.comparisons], comparisons
81e78f53d1SNikolas Klauserfriend constexpr bool operator==(reference_wrapper, reference_wrapper);           // Since C++26
82e78f53d1SNikolas Klauserfriend constexpr bool operator==(reference_wrapper, const T&);                    // Since C++26
83e78f53d1SNikolas Klauserfriend constexpr bool operator==(reference_wrapper, reference_wrapper<const T>);  // Since C++26
84e78f53d1SNikolas Klauser
85e78f53d1SNikolas Klauserfriend constexpr auto operator<=>(reference_wrapper, reference_wrapper);          // Since C++26
86e78f53d1SNikolas Klauserfriend constexpr auto operator<=>(reference_wrapper, const T&);                   // Since C++26
87e78f53d1SNikolas Klauserfriend constexpr auto operator<=>(reference_wrapper, reference_wrapper<const T>); // Since C++26
88e78f53d1SNikolas Klauser
89e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
90e78f53d1SNikolas Klauserstruct plus {
91e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
92e78f53d1SNikolas Klauser};
93e78f53d1SNikolas Klauser
94e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
95e78f53d1SNikolas Klauserstruct minus {
96e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
97e78f53d1SNikolas Klauser};
98e78f53d1SNikolas Klauser
99e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
100e78f53d1SNikolas Klauserstruct multiplies {
101e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
102e78f53d1SNikolas Klauser};
103e78f53d1SNikolas Klauser
104e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
105e78f53d1SNikolas Klauserstruct divides {
106e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
107e78f53d1SNikolas Klauser};
108e78f53d1SNikolas Klauser
109e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
110e78f53d1SNikolas Klauserstruct modulus {
111e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
112e78f53d1SNikolas Klauser};
113e78f53d1SNikolas Klauser
114e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
115e78f53d1SNikolas Klauserstruct negate {
116e78f53d1SNikolas Klauser    T operator()(const T& x) const;
117e78f53d1SNikolas Klauser};
118e78f53d1SNikolas Klauser
119e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
120e78f53d1SNikolas Klauserstruct equal_to {
121e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
122e78f53d1SNikolas Klauser};
123e78f53d1SNikolas Klauser
124e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
125e78f53d1SNikolas Klauserstruct not_equal_to {
126e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
127e78f53d1SNikolas Klauser};
128e78f53d1SNikolas Klauser
129e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
130e78f53d1SNikolas Klauserstruct greater {
131e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
132e78f53d1SNikolas Klauser};
133e78f53d1SNikolas Klauser
134e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
135e78f53d1SNikolas Klauserstruct less {
136e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
137e78f53d1SNikolas Klauser};
138e78f53d1SNikolas Klauser
139e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
140e78f53d1SNikolas Klauserstruct greater_equal {
141e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
142e78f53d1SNikolas Klauser};
143e78f53d1SNikolas Klauser
144e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
145e78f53d1SNikolas Klauserstruct less_equal {
146e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
147e78f53d1SNikolas Klauser};
148e78f53d1SNikolas Klauser
149e78f53d1SNikolas Klauser// [comparisons.three.way], class compare_three_way
150e78f53d1SNikolas Klauserstruct compare_three_way;
151e78f53d1SNikolas Klauser
152e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
153e78f53d1SNikolas Klauserstruct logical_and {
154e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
155e78f53d1SNikolas Klauser};
156e78f53d1SNikolas Klauser
157e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
158e78f53d1SNikolas Klauserstruct logical_or {
159e78f53d1SNikolas Klauser    bool operator()(const T& x, const T& y) const;
160e78f53d1SNikolas Klauser};
161e78f53d1SNikolas Klauser
162e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
163e78f53d1SNikolas Klauserstruct logical_not {
164e78f53d1SNikolas Klauser    bool operator()(const T& x) const;
165e78f53d1SNikolas Klauser};
166e78f53d1SNikolas Klauser
167e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
168e78f53d1SNikolas Klauserstruct bit_and {
169e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
170e78f53d1SNikolas Klauser};
171e78f53d1SNikolas Klauser
172e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
173e78f53d1SNikolas Klauserstruct bit_or {
174e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
175e78f53d1SNikolas Klauser};
176e78f53d1SNikolas Klauser
177e78f53d1SNikolas Klausertemplate <class T> // <class T=void> in C++14
178e78f53d1SNikolas Klauserstruct bit_xor {
179e78f53d1SNikolas Klauser    T operator()(const T& x, const T& y) const;
180e78f53d1SNikolas Klauser};
181e78f53d1SNikolas Klauser
182e78f53d1SNikolas Klausertemplate <class T=void> // C++14
183e78f53d1SNikolas Klauserstruct bit_not {
184e78f53d1SNikolas Klauser    T operator()(const T& x) const;
185e78f53d1SNikolas Klauser};
186e78f53d1SNikolas Klauser
187e78f53d1SNikolas Klauserstruct identity; // C++20
188e78f53d1SNikolas Klauser
189e78f53d1SNikolas Klausertemplate <class Predicate>
190e78f53d1SNikolas Klauserclass unary_negate // deprecated in C++17, removed in C++20
191e78f53d1SNikolas Klauser    : public unary_function<typename Predicate::argument_type, bool>
192e78f53d1SNikolas Klauser{
193e78f53d1SNikolas Klauserpublic:
194e78f53d1SNikolas Klauser    explicit unary_negate(const Predicate& pred);
195e78f53d1SNikolas Klauser    bool operator()(const typename Predicate::argument_type& x) const;
196e78f53d1SNikolas Klauser};
197e78f53d1SNikolas Klauser
198e78f53d1SNikolas Klausertemplate <class Predicate> // deprecated in C++17, removed in C++20
199e78f53d1SNikolas Klauserunary_negate<Predicate> not1(const Predicate& pred);
200e78f53d1SNikolas Klauser
201e78f53d1SNikolas Klausertemplate <class Predicate>
202e78f53d1SNikolas Klauserclass binary_negate // deprecated in C++17, removed in C++20
203e78f53d1SNikolas Klauser    : public binary_function<typename Predicate::first_argument_type,
204e78f53d1SNikolas Klauser                             typename Predicate::second_argument_type,
205e78f53d1SNikolas Klauser                             bool>
206e78f53d1SNikolas Klauser{
207e78f53d1SNikolas Klauserpublic:
208e78f53d1SNikolas Klauser    explicit binary_negate(const Predicate& pred);
209e78f53d1SNikolas Klauser    bool operator()(const typename Predicate::first_argument_type& x,
210e78f53d1SNikolas Klauser                    const typename Predicate::second_argument_type& y) const;
211e78f53d1SNikolas Klauser};
212e78f53d1SNikolas Klauser
213e78f53d1SNikolas Klausertemplate <class Predicate> // deprecated in C++17, removed in C++20
214e78f53d1SNikolas Klauserbinary_negate<Predicate> not2(const Predicate& pred);
215e78f53d1SNikolas Klauser
216e78f53d1SNikolas Klausertemplate <class F>
217e78f53d1SNikolas Klauserconstexpr unspecified not_fn(F&& f); // C++17, constexpr in C++20
218e78f53d1SNikolas Klauser
219e78f53d1SNikolas Klauser// [func.bind.partial], function templates bind_front and bind_back
220e78f53d1SNikolas Klausertemplate<class F, class... Args>
221e78f53d1SNikolas Klauser  constexpr unspecified bind_front(F&&, Args&&...); // C++20
222e78f53d1SNikolas Klausertemplate<class F, class... Args>
223e78f53d1SNikolas Klauser  constexpr unspecified bind_back(F&&, Args&&...);  // C++23
224e78f53d1SNikolas Klauser
225e78f53d1SNikolas Klausertemplate<class T> struct is_bind_expression;
226e78f53d1SNikolas Klausertemplate<class T> struct is_placeholder;
227e78f53d1SNikolas Klauser
228e78f53d1SNikolas Klauser    // See C++14 20.9.9, Function object binders
229e78f53d1SNikolas Klausertemplate <class T> inline constexpr bool is_bind_expression_v
230e78f53d1SNikolas Klauser  = is_bind_expression<T>::value; // C++17
231e78f53d1SNikolas Klausertemplate <class T> inline constexpr int is_placeholder_v
232e78f53d1SNikolas Klauser  = is_placeholder<T>::value; // C++17
233e78f53d1SNikolas Klauser
234e78f53d1SNikolas Klauser
235e78f53d1SNikolas Klausertemplate<class Fn, class... BoundArgs>
236e78f53d1SNikolas Klauser  constexpr unspecified bind(Fn&&, BoundArgs&&...);  // constexpr in C++20
237e78f53d1SNikolas Klausertemplate<class R, class Fn, class... BoundArgs>
238e78f53d1SNikolas Klauser  constexpr unspecified bind(Fn&&, BoundArgs&&...);  // constexpr in C++20
239e78f53d1SNikolas Klauser
240e78f53d1SNikolas Klauser// [func.invoke]
241e78f53d1SNikolas Klausertemplate<class F, class... Args>
242e78f53d1SNikolas Klauser constexpr // constexpr in C++20
243e78f53d1SNikolas Klauser invoke_result_t<F, Args...> invoke(F&& f, Args&&... args) // C++17
244e78f53d1SNikolas Klauser    noexcept(is_nothrow_invocable_v<F, Args...>);
245e78f53d1SNikolas Klauser
246e78f53d1SNikolas Klausertemplate<class R, class F, class... Args>
247e78f53d1SNikolas Klauser  constexpr R invoke_r(F&& f, Args&&... args)              // C++23
248e78f53d1SNikolas Klauser    noexcept(is_nothrow_invocable_r_v<R, F, Args...>);
249e78f53d1SNikolas Klauser
250e78f53d1SNikolas Klausernamespace placeholders {
251e78f53d1SNikolas Klauser  // M is the implementation-defined number of placeholders
252e78f53d1SNikolas Klauser  extern unspecified _1;
253e78f53d1SNikolas Klauser  extern unspecified _2;
254e78f53d1SNikolas Klauser  .
255e78f53d1SNikolas Klauser  .
256e78f53d1SNikolas Klauser  .
257e78f53d1SNikolas Klauser  extern unspecified _Mp;
258e78f53d1SNikolas Klauser}
259e78f53d1SNikolas Klauser
260e78f53d1SNikolas Klausertemplate <class Operation>
261e78f53d1SNikolas Klauserclass binder1st     // deprecated in C++11, removed in C++17
262e78f53d1SNikolas Klauser    : public unary_function<typename Operation::second_argument_type,
263e78f53d1SNikolas Klauser                            typename Operation::result_type>
264e78f53d1SNikolas Klauser{
265e78f53d1SNikolas Klauserprotected:
266e78f53d1SNikolas Klauser    Operation                               op;
267e78f53d1SNikolas Klauser    typename Operation::first_argument_type value;
268e78f53d1SNikolas Klauserpublic:
269e78f53d1SNikolas Klauser    binder1st(const Operation& x, const typename Operation::first_argument_type y);
270e78f53d1SNikolas Klauser    typename Operation::result_type operator()(      typename Operation::second_argument_type& x) const;
271e78f53d1SNikolas Klauser    typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const;
272e78f53d1SNikolas Klauser};
273e78f53d1SNikolas Klauser
274e78f53d1SNikolas Klausertemplate <class Operation, class T>
275e78f53d1SNikolas Klauserbinder1st<Operation> bind1st(const Operation& op, const T& x);                  // deprecated in C++11, removed in C++17
276e78f53d1SNikolas Klauser
277e78f53d1SNikolas Klausertemplate <class Operation>
278e78f53d1SNikolas Klauserclass binder2nd                                                                 // deprecated in C++11, removed in C++17
279e78f53d1SNikolas Klauser    : public unary_function<typename Operation::first_argument_type,
280e78f53d1SNikolas Klauser                            typename Operation::result_type>
281e78f53d1SNikolas Klauser{
282e78f53d1SNikolas Klauserprotected:
283e78f53d1SNikolas Klauser    Operation                                op;
284e78f53d1SNikolas Klauser    typename Operation::second_argument_type value;
285e78f53d1SNikolas Klauserpublic:
286e78f53d1SNikolas Klauser    binder2nd(const Operation& x, const typename Operation::second_argument_type y);
287e78f53d1SNikolas Klauser    typename Operation::result_type operator()(      typename Operation::first_argument_type& x) const;
288e78f53d1SNikolas Klauser    typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const;
289e78f53d1SNikolas Klauser};
290e78f53d1SNikolas Klauser
291e78f53d1SNikolas Klausertemplate <class Operation, class T>
292e78f53d1SNikolas Klauserbinder2nd<Operation> bind2nd(const Operation& op, const T& x);                  // deprecated in C++11, removed in C++17
293e78f53d1SNikolas Klauser
294e78f53d1SNikolas Klausertemplate <class Arg, class Result>                                              // deprecated in C++11, removed in C++17
295e78f53d1SNikolas Klauserclass pointer_to_unary_function : public unary_function<Arg, Result>
296e78f53d1SNikolas Klauser{
297e78f53d1SNikolas Klauserpublic:
298e78f53d1SNikolas Klauser    explicit pointer_to_unary_function(Result (*f)(Arg));
299e78f53d1SNikolas Klauser    Result operator()(Arg x) const;
300e78f53d1SNikolas Klauser};
301e78f53d1SNikolas Klauser
302e78f53d1SNikolas Klausertemplate <class Arg, class Result>
303e78f53d1SNikolas Klauserpointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg));                // deprecated in C++11, removed in C++17
304e78f53d1SNikolas Klauser
305e78f53d1SNikolas Klausertemplate <class Arg1, class Arg2, class Result>                                 // deprecated in C++11, removed in C++17
306e78f53d1SNikolas Klauserclass pointer_to_binary_function : public binary_function<Arg1, Arg2, Result>
307e78f53d1SNikolas Klauser{
308e78f53d1SNikolas Klauserpublic:
309e78f53d1SNikolas Klauser    explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
310e78f53d1SNikolas Klauser    Result operator()(Arg1 x, Arg2 y) const;
311e78f53d1SNikolas Klauser};
312e78f53d1SNikolas Klauser
313e78f53d1SNikolas Klausertemplate <class Arg1, class Arg2, class Result>
314e78f53d1SNikolas Klauserpointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2));   // deprecated in C++11, removed in C++17
315e78f53d1SNikolas Klauser
316e78f53d1SNikolas Klausertemplate<class S, class T>                                                      // deprecated in C++11, removed in C++17
317e78f53d1SNikolas Klauserclass mem_fun_t : public unary_function<T*, S>
318e78f53d1SNikolas Klauser{
319e78f53d1SNikolas Klauserpublic:
320e78f53d1SNikolas Klauser    explicit mem_fun_t(S (T::*p)());
321e78f53d1SNikolas Klauser    S operator()(T* p) const;
322e78f53d1SNikolas Klauser};
323e78f53d1SNikolas Klauser
324e78f53d1SNikolas Klausertemplate<class S, class T, class A>
325e78f53d1SNikolas Klauserclass mem_fun1_t : public binary_function<T*, A, S>                             // deprecated in C++11, removed in C++17
326e78f53d1SNikolas Klauser{
327e78f53d1SNikolas Klauserpublic:
328e78f53d1SNikolas Klauser    explicit mem_fun1_t(S (T::*p)(A));
329e78f53d1SNikolas Klauser    S operator()(T* p, A x) const;
330e78f53d1SNikolas Klauser};
331e78f53d1SNikolas Klauser
332e78f53d1SNikolas Klausertemplate<class S, class T>          mem_fun_t<S,T>    mem_fun(S (T::*f)());     // deprecated in C++11, removed in C++17
333e78f53d1SNikolas Klausertemplate<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
334e78f53d1SNikolas Klauser
335e78f53d1SNikolas Klausertemplate<class S, class T>
336e78f53d1SNikolas Klauserclass mem_fun_ref_t : public unary_function<T, S>                               // deprecated in C++11, removed in C++17
337e78f53d1SNikolas Klauser{
338e78f53d1SNikolas Klauserpublic:
339e78f53d1SNikolas Klauser    explicit mem_fun_ref_t(S (T::*p)());
340e78f53d1SNikolas Klauser    S operator()(T& p) const;
341e78f53d1SNikolas Klauser};
342e78f53d1SNikolas Klauser
343e78f53d1SNikolas Klausertemplate<class S, class T, class A>
344e78f53d1SNikolas Klauserclass mem_fun1_ref_t : public binary_function<T, A, S>                          // deprecated in C++11, removed in C++17
345e78f53d1SNikolas Klauser{
346e78f53d1SNikolas Klauserpublic:
347e78f53d1SNikolas Klauser    explicit mem_fun1_ref_t(S (T::*p)(A));
348e78f53d1SNikolas Klauser    S operator()(T& p, A x) const;
349e78f53d1SNikolas Klauser};
350e78f53d1SNikolas Klauser
351e78f53d1SNikolas Klausertemplate<class S, class T>
352e78f53d1SNikolas Klausermem_fun_ref_t<S,T>    mem_fun_ref(S (T::*f)());                                 // deprecated in C++11, removed in C++17
353e78f53d1SNikolas Klausertemplate<class S, class T, class A>
354e78f53d1SNikolas Klausermem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A));                                // deprecated in C++11, removed in C++17
355e78f53d1SNikolas Klauser
356e78f53d1SNikolas Klausertemplate <class S, class T>
357e78f53d1SNikolas Klauserclass const_mem_fun_t : public unary_function<const T*, S>                      // deprecated in C++11, removed in C++17
358e78f53d1SNikolas Klauser{
359e78f53d1SNikolas Klauserpublic:
360e78f53d1SNikolas Klauser    explicit const_mem_fun_t(S (T::*p)() const);
361e78f53d1SNikolas Klauser    S operator()(const T* p) const;
362e78f53d1SNikolas Klauser};
363e78f53d1SNikolas Klauser
364e78f53d1SNikolas Klausertemplate <class S, class T, class A>
365e78f53d1SNikolas Klauserclass const_mem_fun1_t : public binary_function<const T*, A, S>                 // deprecated in C++11, removed in C++17
366e78f53d1SNikolas Klauser{
367e78f53d1SNikolas Klauserpublic:
368e78f53d1SNikolas Klauser    explicit const_mem_fun1_t(S (T::*p)(A) const);
369e78f53d1SNikolas Klauser    S operator()(const T* p, A x) const;
370e78f53d1SNikolas Klauser};
371e78f53d1SNikolas Klauser
372e78f53d1SNikolas Klausertemplate <class S, class T>
373e78f53d1SNikolas Klauserconst_mem_fun_t<S,T>    mem_fun(S (T::*f)() const);                             // deprecated in C++11, removed in C++17
374e78f53d1SNikolas Klausertemplate <class S, class T, class A>
375e78f53d1SNikolas Klauserconst_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const);                            // deprecated in C++11, removed in C++17
376e78f53d1SNikolas Klauser
377e78f53d1SNikolas Klausertemplate <class S, class T>
378e78f53d1SNikolas Klauserclass const_mem_fun_ref_t : public unary_function<T, S>                         // deprecated in C++11, removed in C++17
379e78f53d1SNikolas Klauser{
380e78f53d1SNikolas Klauserpublic:
381e78f53d1SNikolas Klauser    explicit const_mem_fun_ref_t(S (T::*p)() const);
382e78f53d1SNikolas Klauser    S operator()(const T& p) const;
383e78f53d1SNikolas Klauser};
384e78f53d1SNikolas Klauser
385e78f53d1SNikolas Klausertemplate <class S, class T, class A>
386e78f53d1SNikolas Klauserclass const_mem_fun1_ref_t : public binary_function<T, A, S>                    // deprecated in C++11, removed in C++17
387e78f53d1SNikolas Klauser{
388e78f53d1SNikolas Klauserpublic:
389e78f53d1SNikolas Klauser    explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
390e78f53d1SNikolas Klauser    S operator()(const T& p, A x) const;
391e78f53d1SNikolas Klauser};
392e78f53d1SNikolas Klauser
393e78f53d1SNikolas Klausertemplate <class S, class T>
394e78f53d1SNikolas Klauserconst_mem_fun_ref_t<S,T>    mem_fun_ref(S (T::*f)() const);                     // deprecated in C++11, removed in C++17
395e78f53d1SNikolas Klausertemplate <class S, class T, class A>
396e78f53d1SNikolas Klauserconst_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const);                    // deprecated in C++11, removed in C++17
397e78f53d1SNikolas Klauser
398e78f53d1SNikolas Klausertemplate<class R, class T> constexpr unspecified mem_fn(R T::*);                // constexpr in C++20
399e78f53d1SNikolas Klauser
400e78f53d1SNikolas Klauserclass bad_function_call
401e78f53d1SNikolas Klauser    : public exception
402e78f53d1SNikolas Klauser{
403e78f53d1SNikolas Klauser};
404e78f53d1SNikolas Klauser
405e78f53d1SNikolas Klausertemplate<class> class function; // undefined
406e78f53d1SNikolas Klauser
407e78f53d1SNikolas Klausertemplate<class R, class... ArgTypes>
408e78f53d1SNikolas Klauserclass function<R(ArgTypes...)>
409e78f53d1SNikolas Klauser  : public unary_function<T1, R>      // iff sizeof...(ArgTypes) == 1 and
410e78f53d1SNikolas Klauser                                      // ArgTypes contains T1
411e78f53d1SNikolas Klauser  : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and
412e78f53d1SNikolas Klauser                                      // ArgTypes contains T1 and T2
413e78f53d1SNikolas Klauser{
414e78f53d1SNikolas Klauserpublic:
415e78f53d1SNikolas Klauser    typedef R result_type;
416e78f53d1SNikolas Klauser
417e78f53d1SNikolas Klauser    // construct/copy/destroy:
418e78f53d1SNikolas Klauser    function() noexcept;
419e78f53d1SNikolas Klauser    function(nullptr_t) noexcept;
420e78f53d1SNikolas Klauser    function(const function&);
421e78f53d1SNikolas Klauser    function(function&&) noexcept;
422e78f53d1SNikolas Klauser    template<class F>
423e78f53d1SNikolas Klauser      function(F);
424e78f53d1SNikolas Klauser    template<Allocator Alloc>
425e78f53d1SNikolas Klauser      function(allocator_arg_t, const Alloc&) noexcept;            // removed in C++17
426e78f53d1SNikolas Klauser    template<Allocator Alloc>
427e78f53d1SNikolas Klauser      function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17
428e78f53d1SNikolas Klauser    template<Allocator Alloc>
429e78f53d1SNikolas Klauser      function(allocator_arg_t, const Alloc&, const function&);    // removed in C++17
430e78f53d1SNikolas Klauser    template<Allocator Alloc>
431e78f53d1SNikolas Klauser      function(allocator_arg_t, const Alloc&, function&&);         // removed in C++17
432e78f53d1SNikolas Klauser    template<class F, Allocator Alloc>
433e78f53d1SNikolas Klauser      function(allocator_arg_t, const Alloc&, F);                  // removed in C++17
434e78f53d1SNikolas Klauser
435e78f53d1SNikolas Klauser    function& operator=(const function&);
436e78f53d1SNikolas Klauser    function& operator=(function&&) noexcept;
437e78f53d1SNikolas Klauser    function& operator=(nullptr_t) noexcept;
438e78f53d1SNikolas Klauser    template<class F>
439e78f53d1SNikolas Klauser      function& operator=(F&&);
440e78f53d1SNikolas Klauser    template<class F>
441e78f53d1SNikolas Klauser      function& operator=(reference_wrapper<F>) noexcept;
442e78f53d1SNikolas Klauser
443e78f53d1SNikolas Klauser    ~function();
444e78f53d1SNikolas Klauser
445e78f53d1SNikolas Klauser    // function modifiers:
446e78f53d1SNikolas Klauser    void swap(function&) noexcept;
447e78f53d1SNikolas Klauser    template<class F, class Alloc>
448e78f53d1SNikolas Klauser      void assign(F&&, const Alloc&);                 // Removed in C++17
449e78f53d1SNikolas Klauser
450e78f53d1SNikolas Klauser    // function capacity:
451e78f53d1SNikolas Klauser    explicit operator bool() const noexcept;
452e78f53d1SNikolas Klauser
453e78f53d1SNikolas Klauser    // function invocation:
454e78f53d1SNikolas Klauser    R operator()(ArgTypes...) const;
455e78f53d1SNikolas Klauser
456e78f53d1SNikolas Klauser    // function target access:
457e78f53d1SNikolas Klauser    const std::type_info& target_type() const noexcept;
458e78f53d1SNikolas Klauser    template <typename T>       T* target() noexcept;
459e78f53d1SNikolas Klauser    template <typename T> const T* target() const noexcept;
460e78f53d1SNikolas Klauser};
461e78f53d1SNikolas Klauser
462e78f53d1SNikolas Klauser// Deduction guides
463e78f53d1SNikolas Klausertemplate<class R, class ...Args>
464e78f53d1SNikolas Klauserfunction(R(*)(Args...)) -> function<R(Args...)>; // since C++17
465e78f53d1SNikolas Klauser
466e78f53d1SNikolas Klausertemplate<class F>
467e78f53d1SNikolas Klauserfunction(F) -> function<see-below>; // since C++17
468e78f53d1SNikolas Klauser
469e78f53d1SNikolas Klauser// Null pointer comparisons:
470e78f53d1SNikolas Klausertemplate <class R, class ... ArgTypes>
471e78f53d1SNikolas Klauser  bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
472e78f53d1SNikolas Klauser
473e78f53d1SNikolas Klausertemplate <class R, class ... ArgTypes>
474e78f53d1SNikolas Klauser  bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept; // removed in C++20
475e78f53d1SNikolas Klauser
476e78f53d1SNikolas Klausertemplate <class R, class ... ArgTypes>
477e78f53d1SNikolas Klauser  bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept; // removed in C++20
478e78f53d1SNikolas Klauser
479e78f53d1SNikolas Klausertemplate <class  R, class ... ArgTypes>
480e78f53d1SNikolas Klauser  bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept; // removed in C++20
481e78f53d1SNikolas Klauser
482e78f53d1SNikolas Klauser// specialized algorithms:
483e78f53d1SNikolas Klausertemplate <class  R, class ... ArgTypes>
484e78f53d1SNikolas Klauser  void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
485e78f53d1SNikolas Klauser
486e78f53d1SNikolas Klausertemplate <class T> struct hash;
487e78f53d1SNikolas Klauser
488e78f53d1SNikolas Klausertemplate <> struct hash<bool>;
489e78f53d1SNikolas Klausertemplate <> struct hash<char>;
490e78f53d1SNikolas Klausertemplate <> struct hash<signed char>;
491e78f53d1SNikolas Klausertemplate <> struct hash<unsigned char>;
492e78f53d1SNikolas Klausertemplate <> struct hash<char8_t>; // since C++20
493e78f53d1SNikolas Klausertemplate <> struct hash<char16_t>;
494e78f53d1SNikolas Klausertemplate <> struct hash<char32_t>;
495e78f53d1SNikolas Klausertemplate <> struct hash<wchar_t>;
496e78f53d1SNikolas Klausertemplate <> struct hash<short>;
497e78f53d1SNikolas Klausertemplate <> struct hash<unsigned short>;
498e78f53d1SNikolas Klausertemplate <> struct hash<int>;
499e78f53d1SNikolas Klausertemplate <> struct hash<unsigned int>;
500e78f53d1SNikolas Klausertemplate <> struct hash<long>;
501e78f53d1SNikolas Klausertemplate <> struct hash<long long>;
502e78f53d1SNikolas Klausertemplate <> struct hash<unsigned long>;
503e78f53d1SNikolas Klausertemplate <> struct hash<unsigned long long>;
504e78f53d1SNikolas Klauser
505e78f53d1SNikolas Klausertemplate <> struct hash<float>;
506e78f53d1SNikolas Klausertemplate <> struct hash<double>;
507e78f53d1SNikolas Klausertemplate <> struct hash<long double>;
508e78f53d1SNikolas Klauser
509e78f53d1SNikolas Klausertemplate<class T> struct hash<T*>;
510e78f53d1SNikolas Klausertemplate <> struct hash<nullptr_t>;  // C++17
511e78f53d1SNikolas Klauser
512e78f53d1SNikolas Klausernamespace ranges {
513e78f53d1SNikolas Klauser  // [range.cmp], concept-constrained comparisons
514e78f53d1SNikolas Klauser  struct equal_to;
515e78f53d1SNikolas Klauser  struct not_equal_to;
516e78f53d1SNikolas Klauser  struct greater;
517e78f53d1SNikolas Klauser  struct less;
518e78f53d1SNikolas Klauser  struct greater_equal;
519e78f53d1SNikolas Klauser  struct less_equal;
520e78f53d1SNikolas Klauser}
521e78f53d1SNikolas Klauser
522e78f53d1SNikolas Klauser}  // std
523e78f53d1SNikolas Klauser
524e78f53d1SNikolas KlauserPOLICY:  For non-variadic implementations, the number of arguments is limited
525e78f53d1SNikolas Klauser         to 3.  It is hoped that the need for non-variadic implementations
526e78f53d1SNikolas Klauser         will be minimal.
527e78f53d1SNikolas Klauser
528e78f53d1SNikolas Klauser*/
529e78f53d1SNikolas Klauser
53073fbae83SNikolas Klauser#include <__cxx03/__config>
531e78f53d1SNikolas Klauser
53273fbae83SNikolas Klauser#include <__cxx03/__functional/binary_function.h>
53373fbae83SNikolas Klauser#include <__cxx03/__functional/binary_negate.h>
53473fbae83SNikolas Klauser#include <__cxx03/__functional/bind.h>
53573fbae83SNikolas Klauser#include <__cxx03/__functional/binder1st.h>
53673fbae83SNikolas Klauser#include <__cxx03/__functional/binder2nd.h>
53773fbae83SNikolas Klauser#include <__cxx03/__functional/hash.h>
53873fbae83SNikolas Klauser#include <__cxx03/__functional/mem_fn.h> // TODO: deprecate
53973fbae83SNikolas Klauser#include <__cxx03/__functional/mem_fun_ref.h>
54073fbae83SNikolas Klauser#include <__cxx03/__functional/operations.h>
54173fbae83SNikolas Klauser#include <__cxx03/__functional/pointer_to_binary_function.h>
54273fbae83SNikolas Klauser#include <__cxx03/__functional/pointer_to_unary_function.h>
54373fbae83SNikolas Klauser#include <__cxx03/__functional/reference_wrapper.h>
54473fbae83SNikolas Klauser#include <__cxx03/__functional/unary_function.h>
54573fbae83SNikolas Klauser#include <__cxx03/__functional/unary_negate.h>
546e78f53d1SNikolas Klauser
547e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
54873fbae83SNikolas Klauser#  include <__cxx03/__functional/function.h>
549e78f53d1SNikolas Klauser#endif
550e78f53d1SNikolas Klauser
551e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17
55273fbae83SNikolas Klauser#  include <__cxx03/__functional/boyer_moore_searcher.h>
55373fbae83SNikolas Klauser#  include <__cxx03/__functional/default_searcher.h>
55473fbae83SNikolas Klauser#  include <__cxx03/__functional/invoke.h>
55573fbae83SNikolas Klauser#  include <__cxx03/__functional/not_fn.h>
556e78f53d1SNikolas Klauser#endif
557e78f53d1SNikolas Klauser
558e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20
55973fbae83SNikolas Klauser#  include <__cxx03/__functional/bind_back.h>
56073fbae83SNikolas Klauser#  include <__cxx03/__functional/bind_front.h>
56173fbae83SNikolas Klauser#  include <__cxx03/__functional/identity.h>
56273fbae83SNikolas Klauser#  include <__cxx03/__functional/ranges_operations.h>
56373fbae83SNikolas Klauser#  include <__cxx03/__type_traits/unwrap_ref.h>
564e78f53d1SNikolas Klauser#endif
565e78f53d1SNikolas Klauser
56673fbae83SNikolas Klauser#include <__cxx03/version>
567e78f53d1SNikolas Klauser
568e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
569e78f53d1SNikolas Klauser#  pragma GCC system_header
570e78f53d1SNikolas Klauser#endif
571e78f53d1SNikolas Klauser
572e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && defined(_LIBCPP_CXX03_LANG)
57373fbae83SNikolas Klauser#  include <__cxx03/limits>
57473fbae83SNikolas Klauser#  include <__cxx03/new>
575e78f53d1SNikolas Klauser#endif
576e78f53d1SNikolas Klauser
577e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 14
57873fbae83SNikolas Klauser#  include <__cxx03/array>
57973fbae83SNikolas Klauser#  include <__cxx03/initializer_list>
58073fbae83SNikolas Klauser#  include <__cxx03/unordered_map>
58173fbae83SNikolas Klauser#  include <__cxx03/vector>
582e78f53d1SNikolas Klauser#endif
583e78f53d1SNikolas Klauser
584e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
58573fbae83SNikolas Klauser#  include <__cxx03/atomic>
58673fbae83SNikolas Klauser#  include <__cxx03/concepts>
58773fbae83SNikolas Klauser#  include <__cxx03/cstdlib>
58873fbae83SNikolas Klauser#  include <__cxx03/exception>
58973fbae83SNikolas Klauser#  include <__cxx03/iosfwd>
59073fbae83SNikolas Klauser#  include <__cxx03/memory>
59173fbae83SNikolas Klauser#  include <__cxx03/stdexcept>
59273fbae83SNikolas Klauser#  include <__cxx03/tuple>
59373fbae83SNikolas Klauser#  include <__cxx03/type_traits>
59473fbae83SNikolas Klauser#  include <__cxx03/typeinfo>
59573fbae83SNikolas Klauser#  include <__cxx03/utility>
596e78f53d1SNikolas Klauser#endif
597e78f53d1SNikolas Klauser
598*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_FUNCTIONAL
599