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