13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===------------------------ functional ----------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_FUNCTIONAL
113e519524SHoward Hinnant#define _LIBCPP_FUNCTIONAL
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    functional synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnanttemplate <class Arg, class Result>
203e519524SHoward Hinnantstruct unary_function
213e519524SHoward Hinnant{
223e519524SHoward Hinnant    typedef Arg    argument_type;
233e519524SHoward Hinnant    typedef Result result_type;
243e519524SHoward Hinnant};
253e519524SHoward Hinnant
263e519524SHoward Hinnanttemplate <class Arg1, class Arg2, class Result>
273e519524SHoward Hinnantstruct binary_function
283e519524SHoward Hinnant{
293e519524SHoward Hinnant    typedef Arg1   first_argument_type;
303e519524SHoward Hinnant    typedef Arg2   second_argument_type;
313e519524SHoward Hinnant    typedef Result result_type;
323e519524SHoward Hinnant};
333e519524SHoward Hinnant
349b0b6d45SHoward Hinnanttemplate <class T>
353e519524SHoward Hinnantclass reference_wrapper
363e519524SHoward Hinnant    : public unary_function<T1, R> // if wrapping a unary functor
373e519524SHoward Hinnant    : public binary_function<T1, T2, R> // if wraping a binary functor
383e519524SHoward Hinnant{
393e519524SHoward Hinnantpublic:
403e519524SHoward Hinnant    // types
413e519524SHoward Hinnant    typedef T type;
423e519524SHoward Hinnant    typedef see below result_type; // Not always defined
433e519524SHoward Hinnant
443e519524SHoward Hinnant    // construct/copy/destroy
456a07d6f0SHoward Hinnant    reference_wrapper(T&) noexcept;
463e519524SHoward Hinnant    reference_wrapper(T&&) = delete; // do not bind to temps
476a07d6f0SHoward Hinnant    reference_wrapper(const reference_wrapper<T>& x) noexcept;
483e519524SHoward Hinnant
493e519524SHoward Hinnant    // assignment
506a07d6f0SHoward Hinnant    reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
513e519524SHoward Hinnant
523e519524SHoward Hinnant    // access
536a07d6f0SHoward Hinnant    operator T& () const noexcept;
546a07d6f0SHoward Hinnant    T& get() const noexcept;
553e519524SHoward Hinnant
563e519524SHoward Hinnant    // invoke
573e519524SHoward Hinnant    template <class... ArgTypes>
58b76e6a95SHoward Hinnant      typename result_of<T&(ArgTypes&&...)>::type
593e519524SHoward Hinnant          operator() (ArgTypes&&...) const;
603e519524SHoward Hinnant};
613e519524SHoward Hinnant
626a07d6f0SHoward Hinnanttemplate <class T> reference_wrapper<T> ref(T& t) noexcept;
639b0b6d45SHoward Hinnanttemplate <class T> void ref(const T&& t) = delete;
646a07d6f0SHoward Hinnanttemplate <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
653e519524SHoward Hinnant
666a07d6f0SHoward Hinnanttemplate <class T> reference_wrapper<const T> cref(const T& t) noexcept;
679b0b6d45SHoward Hinnanttemplate <class T> void cref(const T&& t) = delete;
686a07d6f0SHoward Hinnanttemplate <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
693e519524SHoward Hinnant
70bb9ca6d0SLouis Dionnetemplate <class T> struct unwrap_reference;                                       // since C++20
71bb9ca6d0SLouis Dionnetemplate <class T> struct unwrap_ref_decay : unwrap_reference<decay_t<T>> { };    // since C++20
72bb9ca6d0SLouis Dionnetemplate <class T> using unwrap_reference_t = typename unwrap_reference<T>::type; // since C++20
73bb9ca6d0SLouis Dionnetemplate <class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; // since C++20
74bb9ca6d0SLouis Dionne
7583c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
763e519524SHoward Hinnantstruct plus : binary_function<T, T, T>
773e519524SHoward Hinnant{
783e519524SHoward Hinnant    T operator()(const T& x, const T& y) const;
793e519524SHoward Hinnant};
803e519524SHoward Hinnant
8183c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
823e519524SHoward Hinnantstruct minus : binary_function<T, T, T>
833e519524SHoward Hinnant{
843e519524SHoward Hinnant    T operator()(const T& x, const T& y) const;
853e519524SHoward Hinnant};
863e519524SHoward Hinnant
8783c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
883e519524SHoward Hinnantstruct multiplies : binary_function<T, T, T>
893e519524SHoward Hinnant{
903e519524SHoward Hinnant    T operator()(const T& x, const T& y) const;
913e519524SHoward Hinnant};
923e519524SHoward Hinnant
9383c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
943e519524SHoward Hinnantstruct divides : binary_function<T, T, T>
953e519524SHoward Hinnant{
963e519524SHoward Hinnant    T operator()(const T& x, const T& y) const;
973e519524SHoward Hinnant};
983e519524SHoward Hinnant
9983c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1003e519524SHoward Hinnantstruct modulus : binary_function<T, T, T>
1013e519524SHoward Hinnant{
1023e519524SHoward Hinnant    T operator()(const T& x, const T& y) const;
1033e519524SHoward Hinnant};
1043e519524SHoward Hinnant
10583c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1063e519524SHoward Hinnantstruct negate : unary_function<T, T>
1073e519524SHoward Hinnant{
1083e519524SHoward Hinnant    T operator()(const T& x) const;
1093e519524SHoward Hinnant};
1103e519524SHoward Hinnant
11183c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1123e519524SHoward Hinnantstruct equal_to : binary_function<T, T, bool>
1133e519524SHoward Hinnant{
1143e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1153e519524SHoward Hinnant};
1163e519524SHoward Hinnant
11783c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1183e519524SHoward Hinnantstruct not_equal_to : binary_function<T, T, bool>
1193e519524SHoward Hinnant{
1203e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1213e519524SHoward Hinnant};
1223e519524SHoward Hinnant
12383c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1243e519524SHoward Hinnantstruct greater : binary_function<T, T, bool>
1253e519524SHoward Hinnant{
1263e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1273e519524SHoward Hinnant};
1283e519524SHoward Hinnant
12983c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1303e519524SHoward Hinnantstruct less : binary_function<T, T, bool>
1313e519524SHoward Hinnant{
1323e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1333e519524SHoward Hinnant};
1343e519524SHoward Hinnant
13583c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1363e519524SHoward Hinnantstruct greater_equal : binary_function<T, T, bool>
1373e519524SHoward Hinnant{
1383e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1393e519524SHoward Hinnant};
1403e519524SHoward Hinnant
14183c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1423e519524SHoward Hinnantstruct less_equal : binary_function<T, T, bool>
1433e519524SHoward Hinnant{
1443e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1453e519524SHoward Hinnant};
1463e519524SHoward Hinnant
14783c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1483e519524SHoward Hinnantstruct logical_and : binary_function<T, T, bool>
1493e519524SHoward Hinnant{
1503e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1513e519524SHoward Hinnant};
1523e519524SHoward Hinnant
15383c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1543e519524SHoward Hinnantstruct logical_or : binary_function<T, T, bool>
1553e519524SHoward Hinnant{
1563e519524SHoward Hinnant    bool operator()(const T& x, const T& y) const;
1573e519524SHoward Hinnant};
1583e519524SHoward Hinnant
15983c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
1603e519524SHoward Hinnantstruct logical_not : unary_function<T, bool>
1613e519524SHoward Hinnant{
1623e519524SHoward Hinnant    bool operator()(const T& x) const;
1633e519524SHoward Hinnant};
1643e519524SHoward Hinnant
16583c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
16683c08b44SMarshall Clowstruct bit_and : unary_function<T, bool>
16783c08b44SMarshall Clow{
16883c08b44SMarshall Clow    bool operator()(const T& x, const T& y) const;
16983c08b44SMarshall Clow};
17083c08b44SMarshall Clow
17183c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
17283c08b44SMarshall Clowstruct bit_or : unary_function<T, bool>
17383c08b44SMarshall Clow{
17483c08b44SMarshall Clow    bool operator()(const T& x, const T& y) const;
17583c08b44SMarshall Clow};
17683c08b44SMarshall Clow
17783c08b44SMarshall Clowtemplate <class T> // <class T=void> in C++14
17883c08b44SMarshall Clowstruct bit_xor : unary_function<T, bool>
17983c08b44SMarshall Clow{
18083c08b44SMarshall Clow    bool operator()(const T& x, const T& y) const;
18183c08b44SMarshall Clow};
18283c08b44SMarshall Clow
18383c08b44SMarshall Clowtemplate <class T=void> // C++14
18483c08b44SMarshall Clowstruct bit_xor : unary_function<T, bool>
18583c08b44SMarshall Clow{
18683c08b44SMarshall Clow    bool operator()(const T& x) const;
18783c08b44SMarshall Clow};
18883c08b44SMarshall Clow
1893e519524SHoward Hinnanttemplate <class Predicate>
190ea5cd3b4SLouis Dionneclass unary_negate // deprecated in C++17
1913e519524SHoward Hinnant    : public unary_function<typename Predicate::argument_type, bool>
1923e519524SHoward Hinnant{
1933e519524SHoward Hinnantpublic:
1943e519524SHoward Hinnant    explicit unary_negate(const Predicate& pred);
1953e519524SHoward Hinnant    bool operator()(const typename Predicate::argument_type& x) const;
1963e519524SHoward Hinnant};
1973e519524SHoward Hinnant
198ea5cd3b4SLouis Dionnetemplate <class Predicate> // deprecated in C++17
199ea5cd3b4SLouis Dionneunary_negate<Predicate> not1(const Predicate& pred);
2003e519524SHoward Hinnant
2013e519524SHoward Hinnanttemplate <class Predicate>
202ea5cd3b4SLouis Dionneclass binary_negate // deprecated in C++17
2033e519524SHoward Hinnant    : public binary_function<typename Predicate::first_argument_type,
2043e519524SHoward Hinnant                             typename Predicate::second_argument_type,
2053e519524SHoward Hinnant                             bool>
2063e519524SHoward Hinnant{
2073e519524SHoward Hinnantpublic:
2083e519524SHoward Hinnant    explicit binary_negate(const Predicate& pred);
2093e519524SHoward Hinnant    bool operator()(const typename Predicate::first_argument_type& x,
2103e519524SHoward Hinnant                    const typename Predicate::second_argument_type& y) const;
2113e519524SHoward Hinnant};
2123e519524SHoward Hinnant
213ea5cd3b4SLouis Dionnetemplate <class Predicate> // deprecated in C++17
214ea5cd3b4SLouis Dionnebinary_negate<Predicate> not2(const Predicate& pred);
2153e519524SHoward Hinnant
21657257567SEric Fiseliertemplate <class F> unspecified not_fn(F&& f); // C++17
21757257567SEric Fiselier
2183e519524SHoward Hinnanttemplate<class T> struct is_bind_expression;
2193e519524SHoward Hinnanttemplate<class T> struct is_placeholder;
2203e519524SHoward Hinnant
221a48055ceSMarshall Clow    // See C++14 20.9.9, Function object binders
22240a01d53SMarshall Clowtemplate <class T> inline constexpr bool is_bind_expression_v
223a48055ceSMarshall Clow  = is_bind_expression<T>::value; // C++17
22440a01d53SMarshall Clowtemplate <class T> inline constexpr int is_placeholder_v
225a48055ceSMarshall Clow  = is_placeholder<T>::value; // C++17
226a48055ceSMarshall Clow
227a48055ceSMarshall Clow
2289b0b6d45SHoward Hinnanttemplate<class Fn, class... BoundArgs>
2299b0b6d45SHoward Hinnant  unspecified bind(Fn&&, BoundArgs&&...);
2309b0b6d45SHoward Hinnanttemplate<class R, class Fn, class... BoundArgs>
2319b0b6d45SHoward Hinnant  unspecified bind(Fn&&, BoundArgs&&...);
2323e519524SHoward Hinnant
2336c49e1ceSLouis Dionnetemplate<class F, class... Args>
2346c49e1ceSLouis Dionne invoke_result_t<F, Args...> invoke(F&& f, Args&&... args) // C++17
2356c49e1ceSLouis Dionne    noexcept(is_nothrow_invocable_v<F, Args...>);
2366c49e1ceSLouis Dionne
2373e519524SHoward Hinnantnamespace placeholders {
2383e519524SHoward Hinnant  // M is the implementation-defined number of placeholders
2393e519524SHoward Hinnant  extern unspecified _1;
2403e519524SHoward Hinnant  extern unspecified _2;
2413e519524SHoward Hinnant  .
2423e519524SHoward Hinnant  .
2433e519524SHoward Hinnant  .
244c003db1fSHoward Hinnant  extern unspecified _Mp;
2453e519524SHoward Hinnant}
2463e519524SHoward Hinnant
2473e519524SHoward Hinnanttemplate <class Operation>
2487d210c78SMarshall Clowclass binder1st     // deprecated in C++11, removed in C++17
2493e519524SHoward Hinnant    : public unary_function<typename Operation::second_argument_type,
2503e519524SHoward Hinnant                            typename Operation::result_type>
2513e519524SHoward Hinnant{
2523e519524SHoward Hinnantprotected:
2533e519524SHoward Hinnant    Operation                               op;
2543e519524SHoward Hinnant    typename Operation::first_argument_type value;
2553e519524SHoward Hinnantpublic:
2563e519524SHoward Hinnant    binder1st(const Operation& x, const typename Operation::first_argument_type y);
2573e519524SHoward Hinnant    typename Operation::result_type operator()(      typename Operation::second_argument_type& x) const;
2583e519524SHoward Hinnant    typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const;
2593e519524SHoward Hinnant};
2603e519524SHoward Hinnant
2613e519524SHoward Hinnanttemplate <class Operation, class T>
2627d210c78SMarshall Clowbinder1st<Operation> bind1st(const Operation& op, const T& x);  // deprecated in C++11, removed in C++17
2633e519524SHoward Hinnant
2643e519524SHoward Hinnanttemplate <class Operation>
2657d210c78SMarshall Clowclass binder2nd     // deprecated in C++11, removed in C++17
2663e519524SHoward Hinnant    : public unary_function<typename Operation::first_argument_type,
2673e519524SHoward Hinnant                            typename Operation::result_type>
2683e519524SHoward Hinnant{
2693e519524SHoward Hinnantprotected:
2703e519524SHoward Hinnant    Operation                                op;
2713e519524SHoward Hinnant    typename Operation::second_argument_type value;
2723e519524SHoward Hinnantpublic:
2733e519524SHoward Hinnant    binder2nd(const Operation& x, const typename Operation::second_argument_type y);
2743e519524SHoward Hinnant    typename Operation::result_type operator()(      typename Operation::first_argument_type& x) const;
2753e519524SHoward Hinnant    typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const;
2763e519524SHoward Hinnant};
2773e519524SHoward Hinnant
2783e519524SHoward Hinnanttemplate <class Operation, class T>
2797d210c78SMarshall Clowbinder2nd<Operation> bind2nd(const Operation& op, const T& x);  // deprecated in C++11, removed in C++17
2803e519524SHoward Hinnant
2817d210c78SMarshall Clowtemplate <class Arg, class Result>      // deprecated in C++11, removed in C++17
2823e519524SHoward Hinnantclass pointer_to_unary_function : public unary_function<Arg, Result>
2833e519524SHoward Hinnant{
2843e519524SHoward Hinnantpublic:
2853e519524SHoward Hinnant    explicit pointer_to_unary_function(Result (*f)(Arg));
2863e519524SHoward Hinnant    Result operator()(Arg x) const;
2873e519524SHoward Hinnant};
2883e519524SHoward Hinnant
2893e519524SHoward Hinnanttemplate <class Arg, class Result>
2907d210c78SMarshall Clowpointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg));      // deprecated in C++11, removed in C++17
2913e519524SHoward Hinnant
2927d210c78SMarshall Clowtemplate <class Arg1, class Arg2, class Result>      // deprecated in C++11, removed in C++17
2933e519524SHoward Hinnantclass pointer_to_binary_function : public binary_function<Arg1, Arg2, Result>
2943e519524SHoward Hinnant{
2953e519524SHoward Hinnantpublic:
2963e519524SHoward Hinnant    explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
2973e519524SHoward Hinnant    Result operator()(Arg1 x, Arg2 y) const;
2983e519524SHoward Hinnant};
2993e519524SHoward Hinnant
3003e519524SHoward Hinnanttemplate <class Arg1, class Arg2, class Result>
3017d210c78SMarshall Clowpointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2));      // deprecated in C++11, removed in C++17
3023e519524SHoward Hinnant
3037d210c78SMarshall Clowtemplate<class S, class T>      // deprecated in C++11, removed in C++17
3043e519524SHoward Hinnantclass mem_fun_t : public unary_function<T*, S>
3053e519524SHoward Hinnant{
3063e519524SHoward Hinnantpublic:
3073e519524SHoward Hinnant    explicit mem_fun_t(S (T::*p)());
3083e519524SHoward Hinnant    S operator()(T* p) const;
3093e519524SHoward Hinnant};
3103e519524SHoward Hinnant
3113e519524SHoward Hinnanttemplate<class S, class T, class A>
3127d210c78SMarshall Clowclass mem_fun1_t : public binary_function<T*, A, S>      // deprecated in C++11, removed in C++17
3133e519524SHoward Hinnant{
3143e519524SHoward Hinnantpublic:
3153e519524SHoward Hinnant    explicit mem_fun1_t(S (T::*p)(A));
3163e519524SHoward Hinnant    S operator()(T* p, A x) const;
3173e519524SHoward Hinnant};
3183e519524SHoward Hinnant
3197d210c78SMarshall Clowtemplate<class S, class T>          mem_fun_t<S,T>    mem_fun(S (T::*f)());      // deprecated in C++11, removed in C++17
3207d210c78SMarshall Clowtemplate<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
3213e519524SHoward Hinnant
3223e519524SHoward Hinnanttemplate<class S, class T>
3237d210c78SMarshall Clowclass mem_fun_ref_t : public unary_function<T, S>      // deprecated in C++11, removed in C++17
3243e519524SHoward Hinnant{
3253e519524SHoward Hinnantpublic:
3263e519524SHoward Hinnant    explicit mem_fun_ref_t(S (T::*p)());
3273e519524SHoward Hinnant    S operator()(T& p) const;
3283e519524SHoward Hinnant};
3293e519524SHoward Hinnant
3303e519524SHoward Hinnanttemplate<class S, class T, class A>
3317d210c78SMarshall Clowclass mem_fun1_ref_t : public binary_function<T, A, S>      // deprecated in C++11, removed in C++17
3323e519524SHoward Hinnant{
3333e519524SHoward Hinnantpublic:
3343e519524SHoward Hinnant    explicit mem_fun1_ref_t(S (T::*p)(A));
3353e519524SHoward Hinnant    S operator()(T& p, A x) const;
3363e519524SHoward Hinnant};
3373e519524SHoward Hinnant
3387d210c78SMarshall Clowtemplate<class S, class T>          mem_fun_ref_t<S,T>    mem_fun_ref(S (T::*f)());      // deprecated in C++11, removed in C++17
3397d210c78SMarshall Clowtemplate<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
3403e519524SHoward Hinnant
3413e519524SHoward Hinnanttemplate <class S, class T>
3427d210c78SMarshall Clowclass const_mem_fun_t : public unary_function<const T*, S>      // deprecated in C++11, removed in C++17
3433e519524SHoward Hinnant{
3443e519524SHoward Hinnantpublic:
3453e519524SHoward Hinnant    explicit const_mem_fun_t(S (T::*p)() const);
3463e519524SHoward Hinnant    S operator()(const T* p) const;
3473e519524SHoward Hinnant};
3483e519524SHoward Hinnant
3493e519524SHoward Hinnanttemplate <class S, class T, class A>
3507d210c78SMarshall Clowclass const_mem_fun1_t : public binary_function<const T*, A, S>      // deprecated in C++11, removed in C++17
3513e519524SHoward Hinnant{
3523e519524SHoward Hinnantpublic:
3533e519524SHoward Hinnant    explicit const_mem_fun1_t(S (T::*p)(A) const);
3543e519524SHoward Hinnant    S operator()(const T* p, A x) const;
3553e519524SHoward Hinnant};
3563e519524SHoward Hinnant
3577d210c78SMarshall Clowtemplate <class S, class T>          const_mem_fun_t<S,T>    mem_fun(S (T::*f)() const);      // deprecated in C++11, removed in C++17
3587d210c78SMarshall Clowtemplate <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
3593e519524SHoward Hinnant
3603e519524SHoward Hinnanttemplate <class S, class T>
3617d210c78SMarshall Clowclass const_mem_fun_ref_t : public unary_function<T, S>      // deprecated in C++11, removed in C++17
3623e519524SHoward Hinnant{
3633e519524SHoward Hinnantpublic:
3643e519524SHoward Hinnant    explicit const_mem_fun_ref_t(S (T::*p)() const);
3653e519524SHoward Hinnant    S operator()(const T& p) const;
3663e519524SHoward Hinnant};
3673e519524SHoward Hinnant
3683e519524SHoward Hinnanttemplate <class S, class T, class A>
3697d210c78SMarshall Clowclass const_mem_fun1_ref_t : public binary_function<T, A, S>      // deprecated in C++11, removed in C++17
3703e519524SHoward Hinnant{
3713e519524SHoward Hinnantpublic:
3723e519524SHoward Hinnant    explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
3733e519524SHoward Hinnant    S operator()(const T& p, A x) const;
3743e519524SHoward Hinnant};
3753e519524SHoward Hinnant
3767d210c78SMarshall Clowtemplate <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
3777d210c78SMarshall Clowtemplate <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
3783e519524SHoward Hinnant
3799b0b6d45SHoward Hinnanttemplate<class R, class T> unspecified mem_fn(R T::*);
3809b0b6d45SHoward Hinnant
3813e519524SHoward Hinnantclass bad_function_call
3823e519524SHoward Hinnant    : public exception
3833e519524SHoward Hinnant{
3843e519524SHoward Hinnant};
3853e519524SHoward Hinnant
3869b0b6d45SHoward Hinnanttemplate<class> class function; // undefined
3873e519524SHoward Hinnant
3889b0b6d45SHoward Hinnanttemplate<class R, class... ArgTypes>
3893e519524SHoward Hinnantclass function<R(ArgTypes...)>
3903e519524SHoward Hinnant  : public unary_function<T1, R>      // iff sizeof...(ArgTypes) == 1 and
3913e519524SHoward Hinnant                                      // ArgTypes contains T1
3923e519524SHoward Hinnant  : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and
3933e519524SHoward Hinnant                                      // ArgTypes contains T1 and T2
3943e519524SHoward Hinnant{
3953e519524SHoward Hinnantpublic:
3963e519524SHoward Hinnant    typedef R result_type;
3973e519524SHoward Hinnant
3989b0b6d45SHoward Hinnant    // construct/copy/destroy:
3996a07d6f0SHoward Hinnant    function() noexcept;
4006a07d6f0SHoward Hinnant    function(nullptr_t) noexcept;
4013e519524SHoward Hinnant    function(const function&);
4026a07d6f0SHoward Hinnant    function(function&&) noexcept;
4033e519524SHoward Hinnant    template<class F>
4043e519524SHoward Hinnant      function(F);
4053e519524SHoward Hinnant    template<Allocator Alloc>
4066ecac730SMarshall Clow      function(allocator_arg_t, const Alloc&) noexcept;            // removed in C++17
4073e519524SHoward Hinnant    template<Allocator Alloc>
4086ecac730SMarshall Clow      function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17
4093e519524SHoward Hinnant    template<Allocator Alloc>
4106ecac730SMarshall Clow      function(allocator_arg_t, const Alloc&, const function&);    // removed in C++17
4113e519524SHoward Hinnant    template<Allocator Alloc>
4126ecac730SMarshall Clow      function(allocator_arg_t, const Alloc&, function&&);         // removed in C++17
4133e519524SHoward Hinnant    template<class F, Allocator Alloc>
4146ecac730SMarshall Clow      function(allocator_arg_t, const Alloc&, F);                  // removed in C++17
4153e519524SHoward Hinnant
4163e519524SHoward Hinnant    function& operator=(const function&);
4176a07d6f0SHoward Hinnant    function& operator=(function&&) noexcept;
418af152c84SHoward Hinnant    function& operator=(nullptr_t) noexcept;
4193e519524SHoward Hinnant    template<class F>
4209b0b6d45SHoward Hinnant      function& operator=(F&&);
4213e519524SHoward Hinnant    template<class F>
4226a07d6f0SHoward Hinnant      function& operator=(reference_wrapper<F>) noexcept;
4233e519524SHoward Hinnant
4243e519524SHoward Hinnant    ~function();
4253e519524SHoward Hinnant
4269b0b6d45SHoward Hinnant    // function modifiers:
4276a07d6f0SHoward Hinnant    void swap(function&) noexcept;
4289b0b6d45SHoward Hinnant    template<class F, class Alloc>
4290aa1ccb0SMarshall Clow      void assign(F&&, const Alloc&);                 // Removed in C++17
4303e519524SHoward Hinnant
4319b0b6d45SHoward Hinnant    // function capacity:
4326a07d6f0SHoward Hinnant    explicit operator bool() const noexcept;
4333e519524SHoward Hinnant
4349b0b6d45SHoward Hinnant    // function invocation:
4353e519524SHoward Hinnant    R operator()(ArgTypes...) const;
4363e519524SHoward Hinnant
4379b0b6d45SHoward Hinnant    // function target access:
4386a07d6f0SHoward Hinnant    const std::type_info& target_type() const noexcept;
4396a07d6f0SHoward Hinnant    template <typename T>       T* target() noexcept;
4406a07d6f0SHoward Hinnant    template <typename T> const T* target() const noexcept;
4413e519524SHoward Hinnant};
4423e519524SHoward Hinnant
443*e1eabcdfSLouis Dionne// Deduction guides
444*e1eabcdfSLouis Dionnetemplate<class R, class ...Args>
445*e1eabcdfSLouis Dionnefunction(R(*)(Args...)) -> function<R(Args...)>; // since C++17
446*e1eabcdfSLouis Dionne
447*e1eabcdfSLouis Dionnetemplate<class F>
448*e1eabcdfSLouis Dionnefunction(F) -> function<see-below>; // since C++17
449*e1eabcdfSLouis Dionne
4509b0b6d45SHoward Hinnant// Null pointer comparisons:
4519b0b6d45SHoward Hinnanttemplate <class R, class ... ArgTypes>
4526a07d6f0SHoward Hinnant  bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
4533e519524SHoward Hinnant
4549b0b6d45SHoward Hinnanttemplate <class R, class ... ArgTypes>
4556a07d6f0SHoward Hinnant  bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
4563e519524SHoward Hinnant
4579b0b6d45SHoward Hinnanttemplate <class R, class ... ArgTypes>
4586a07d6f0SHoward Hinnant  bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
4593e519524SHoward Hinnant
4609b0b6d45SHoward Hinnanttemplate <class  R, class ... ArgTypes>
4616a07d6f0SHoward Hinnant  bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
4623e519524SHoward Hinnant
4639b0b6d45SHoward Hinnant// specialized algorithms:
4649b0b6d45SHoward Hinnanttemplate <class  R, class ... ArgTypes>
4656a07d6f0SHoward Hinnant  void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
4663e519524SHoward Hinnant
4673e519524SHoward Hinnanttemplate <class T> struct hash;
4683e519524SHoward Hinnant
4693e519524SHoward Hinnanttemplate <> struct hash<bool>;
4703e519524SHoward Hinnanttemplate <> struct hash<char>;
4713e519524SHoward Hinnanttemplate <> struct hash<signed char>;
4723e519524SHoward Hinnanttemplate <> struct hash<unsigned char>;
4733e519524SHoward Hinnanttemplate <> struct hash<char16_t>;
4743e519524SHoward Hinnanttemplate <> struct hash<char32_t>;
4753e519524SHoward Hinnanttemplate <> struct hash<wchar_t>;
4763e519524SHoward Hinnanttemplate <> struct hash<short>;
4773e519524SHoward Hinnanttemplate <> struct hash<unsigned short>;
4783e519524SHoward Hinnanttemplate <> struct hash<int>;
4793e519524SHoward Hinnanttemplate <> struct hash<unsigned int>;
4803e519524SHoward Hinnanttemplate <> struct hash<long>;
4813e519524SHoward Hinnanttemplate <> struct hash<long long>;
4823e519524SHoward Hinnanttemplate <> struct hash<unsigned long>;
4833e519524SHoward Hinnanttemplate <> struct hash<unsigned long long>;
4843e519524SHoward Hinnant
4853e519524SHoward Hinnanttemplate <> struct hash<float>;
4863e519524SHoward Hinnanttemplate <> struct hash<double>;
4873e519524SHoward Hinnanttemplate <> struct hash<long double>;
4883e519524SHoward Hinnant
4893e519524SHoward Hinnanttemplate<class T> struct hash<T*>;
490d8323168SMarshall Clowtemplate <> struct hash<nullptr_t>;  // C++17
4913e519524SHoward Hinnant
4923e519524SHoward Hinnant}  // std
4933e519524SHoward Hinnant
4943e519524SHoward HinnantPOLICY:  For non-variadic implementations, the number of arguments is limited
4953e519524SHoward Hinnant         to 3.  It is hoped that the need for non-variadic implementations
4963e519524SHoward Hinnant         will be minimal.
4973e519524SHoward Hinnant
4983e519524SHoward Hinnant*/
4993e519524SHoward Hinnant
5003e519524SHoward Hinnant#include <__config>
5013e519524SHoward Hinnant#include <type_traits>
5023e519524SHoward Hinnant#include <typeinfo>
5033e519524SHoward Hinnant#include <exception>
5043e519524SHoward Hinnant#include <memory>
5053e519524SHoward Hinnant#include <tuple>
506f9127593SEric Fiselier#include <utility>
507f56972e2SMarshall Clow#include <version>
5083e519524SHoward Hinnant
5093e519524SHoward Hinnant#include <__functional_base>
5103e519524SHoward Hinnant
511073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
5123e519524SHoward Hinnant#pragma GCC system_header
513073458b1SHoward Hinnant#endif
5143e519524SHoward Hinnant
5153e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
5163e519524SHoward Hinnant
51783c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
51883c08b44SMarshall Clowtemplate <class _Tp = void>
51983c08b44SMarshall Clow#else
5203e519524SHoward Hinnanttemplate <class _Tp>
52183c08b44SMarshall Clow#endif
522e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS plus : binary_function<_Tp, _Tp, _Tp>
5233e519524SHoward Hinnant{
5243d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
5253d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
5263e519524SHoward Hinnant        {return __x + __y;}
5273e519524SHoward Hinnant};
5283e519524SHoward Hinnant
52983c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
53083c08b44SMarshall Clowtemplate <>
531e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS plus<void>
53283c08b44SMarshall Clow{
53383c08b44SMarshall Clow    template <class _T1, class _T2>
5343d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
5353d5134ddSMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
536a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
537a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
53883c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
53925d3402cSMarshall Clow    typedef void is_transparent;
54083c08b44SMarshall Clow};
54183c08b44SMarshall Clow#endif
54283c08b44SMarshall Clow
54383c08b44SMarshall Clow
54483c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
54583c08b44SMarshall Clowtemplate <class _Tp = void>
54683c08b44SMarshall Clow#else
5473e519524SHoward Hinnanttemplate <class _Tp>
54883c08b44SMarshall Clow#endif
549e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS minus : binary_function<_Tp, _Tp, _Tp>
5503e519524SHoward Hinnant{
5513d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
5523d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
5533e519524SHoward Hinnant        {return __x - __y;}
5543e519524SHoward Hinnant};
5553e519524SHoward Hinnant
55683c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
55783c08b44SMarshall Clowtemplate <>
558e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS minus<void>
55983c08b44SMarshall Clow{
56083c08b44SMarshall Clow    template <class _T1, class _T2>
5613d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
5623d5134ddSMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
563a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)))
564a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))
56583c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); }
56625d3402cSMarshall Clow    typedef void is_transparent;
56783c08b44SMarshall Clow};
56883c08b44SMarshall Clow#endif
56983c08b44SMarshall Clow
57083c08b44SMarshall Clow
57183c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
57283c08b44SMarshall Clowtemplate <class _Tp = void>
57383c08b44SMarshall Clow#else
5743e519524SHoward Hinnanttemplate <class _Tp>
57583c08b44SMarshall Clow#endif
576e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS multiplies : binary_function<_Tp, _Tp, _Tp>
5773e519524SHoward Hinnant{
5783d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
5793d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
5803e519524SHoward Hinnant        {return __x * __y;}
5813e519524SHoward Hinnant};
5823e519524SHoward Hinnant
58383c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
58483c08b44SMarshall Clowtemplate <>
585e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS multiplies<void>
58683c08b44SMarshall Clow{
58783c08b44SMarshall Clow    template <class _T1, class _T2>
5883d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
5893d5134ddSMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
590a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)))
591a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))
59283c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); }
59325d3402cSMarshall Clow    typedef void is_transparent;
59483c08b44SMarshall Clow};
59583c08b44SMarshall Clow#endif
59683c08b44SMarshall Clow
59783c08b44SMarshall Clow
59883c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
59983c08b44SMarshall Clowtemplate <class _Tp = void>
60083c08b44SMarshall Clow#else
6013e519524SHoward Hinnanttemplate <class _Tp>
60283c08b44SMarshall Clow#endif
603e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS divides : binary_function<_Tp, _Tp, _Tp>
6043e519524SHoward Hinnant{
6053d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
6063d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
6073e519524SHoward Hinnant        {return __x / __y;}
6083e519524SHoward Hinnant};
6093e519524SHoward Hinnant
61083c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
61183c08b44SMarshall Clowtemplate <>
612e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS divides<void>
61383c08b44SMarshall Clow{
61483c08b44SMarshall Clow    template <class _T1, class _T2>
6153d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
6163d5134ddSMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
617a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)))
618a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))
61983c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); }
62025d3402cSMarshall Clow    typedef void is_transparent;
62183c08b44SMarshall Clow};
62283c08b44SMarshall Clow#endif
62383c08b44SMarshall Clow
62483c08b44SMarshall Clow
62583c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
62683c08b44SMarshall Clowtemplate <class _Tp = void>
62783c08b44SMarshall Clow#else
6283e519524SHoward Hinnanttemplate <class _Tp>
62983c08b44SMarshall Clow#endif
630e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS modulus : binary_function<_Tp, _Tp, _Tp>
6313e519524SHoward Hinnant{
6323d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
6333d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
6343e519524SHoward Hinnant        {return __x % __y;}
6353e519524SHoward Hinnant};
6363e519524SHoward Hinnant
63783c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
63883c08b44SMarshall Clowtemplate <>
639e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS modulus<void>
64083c08b44SMarshall Clow{
64183c08b44SMarshall Clow    template <class _T1, class _T2>
6423d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
6433d5134ddSMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
644a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)))
645a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))
64683c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); }
64725d3402cSMarshall Clow    typedef void is_transparent;
64883c08b44SMarshall Clow};
64983c08b44SMarshall Clow#endif
65083c08b44SMarshall Clow
65183c08b44SMarshall Clow
65283c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
65383c08b44SMarshall Clowtemplate <class _Tp = void>
65483c08b44SMarshall Clow#else
6553e519524SHoward Hinnanttemplate <class _Tp>
65683c08b44SMarshall Clow#endif
657e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS negate : unary_function<_Tp, _Tp>
6583e519524SHoward Hinnant{
6593d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
6603d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x) const
6613e519524SHoward Hinnant        {return -__x;}
6623e519524SHoward Hinnant};
6633e519524SHoward Hinnant
66483c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
66583c08b44SMarshall Clowtemplate <>
666e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS negate<void>
66783c08b44SMarshall Clow{
6683e519524SHoward Hinnant    template <class _Tp>
6693d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
6703d5134ddSMarshall Clow    auto operator()(_Tp&& __x) const
671a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x)))
672a64f2fbcSMarshall Clow    -> decltype        (- _VSTD::forward<_Tp>(__x))
67383c08b44SMarshall Clow        { return        - _VSTD::forward<_Tp>(__x); }
67425d3402cSMarshall Clow    typedef void is_transparent;
67583c08b44SMarshall Clow};
67683c08b44SMarshall Clow#endif
67783c08b44SMarshall Clow
67883c08b44SMarshall Clow
67983c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
68083c08b44SMarshall Clowtemplate <class _Tp = void>
68183c08b44SMarshall Clow#else
68283c08b44SMarshall Clowtemplate <class _Tp>
68383c08b44SMarshall Clow#endif
684e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS equal_to : binary_function<_Tp, _Tp, bool>
6853e519524SHoward Hinnant{
6863d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
6873d5134ddSMarshall Clow    bool operator()(const _Tp& __x, const _Tp& __y) const
6883e519524SHoward Hinnant        {return __x == __y;}
6893e519524SHoward Hinnant};
6903e519524SHoward Hinnant
69183c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
69283c08b44SMarshall Clowtemplate <>
693e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS equal_to<void>
69483c08b44SMarshall Clow{
6953d5134ddSMarshall Clow    template <class _T1, class _T2>
6963d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
69783c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
698a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)))
699a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))
70083c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); }
70125d3402cSMarshall Clow    typedef void is_transparent;
70283c08b44SMarshall Clow};
70383c08b44SMarshall Clow#endif
70483c08b44SMarshall Clow
70583c08b44SMarshall Clow
70683c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
70783c08b44SMarshall Clowtemplate <class _Tp = void>
70883c08b44SMarshall Clow#else
7093e519524SHoward Hinnanttemplate <class _Tp>
71083c08b44SMarshall Clow#endif
711e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS not_equal_to : binary_function<_Tp, _Tp, bool>
7123e519524SHoward Hinnant{
7133d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
7143d5134ddSMarshall Clow    bool operator()(const _Tp& __x, const _Tp& __y) const
7153e519524SHoward Hinnant        {return __x != __y;}
7163e519524SHoward Hinnant};
7173e519524SHoward Hinnant
71883c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
71983c08b44SMarshall Clowtemplate <>
720e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS not_equal_to<void>
72183c08b44SMarshall Clow{
7223d5134ddSMarshall Clow    template <class _T1, class _T2>
7233d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
72483c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
725a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)))
726a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))
72783c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); }
72825d3402cSMarshall Clow    typedef void is_transparent;
72983c08b44SMarshall Clow};
73083c08b44SMarshall Clow#endif
73183c08b44SMarshall Clow
73283c08b44SMarshall Clow
73383c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
73483c08b44SMarshall Clowtemplate <class _Tp = void>
73583c08b44SMarshall Clow#else
7363e519524SHoward Hinnanttemplate <class _Tp>
73783c08b44SMarshall Clow#endif
738e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool>
7393e519524SHoward Hinnant{
7403d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
7413d5134ddSMarshall Clow    bool operator()(const _Tp& __x, const _Tp& __y) const
7423e519524SHoward Hinnant        {return __x > __y;}
7433e519524SHoward Hinnant};
7443e519524SHoward Hinnant
74583c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
74683c08b44SMarshall Clowtemplate <>
747e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS greater<void>
74883c08b44SMarshall Clow{
7493d5134ddSMarshall Clow    template <class _T1, class _T2>
7503d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
75183c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
752a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)))
753a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))
75483c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); }
75525d3402cSMarshall Clow    typedef void is_transparent;
75683c08b44SMarshall Clow};
75783c08b44SMarshall Clow#endif
75883c08b44SMarshall Clow
75983c08b44SMarshall Clow
76067f39647SHoward Hinnant// less in <__functional_base>
7613e519524SHoward Hinnant
76283c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
76383c08b44SMarshall Clowtemplate <class _Tp = void>
76483c08b44SMarshall Clow#else
7653e519524SHoward Hinnanttemplate <class _Tp>
76683c08b44SMarshall Clow#endif
767e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS greater_equal : binary_function<_Tp, _Tp, bool>
7683e519524SHoward Hinnant{
7693d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
7703d5134ddSMarshall Clow    bool operator()(const _Tp& __x, const _Tp& __y) const
7713e519524SHoward Hinnant        {return __x >= __y;}
7723e519524SHoward Hinnant};
7733e519524SHoward Hinnant
77483c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
77583c08b44SMarshall Clowtemplate <>
776e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS greater_equal<void>
77783c08b44SMarshall Clow{
7783d5134ddSMarshall Clow    template <class _T1, class _T2>
7793d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
78083c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
781a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)))
782a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))
78383c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); }
78425d3402cSMarshall Clow    typedef void is_transparent;
78583c08b44SMarshall Clow};
78683c08b44SMarshall Clow#endif
78783c08b44SMarshall Clow
78883c08b44SMarshall Clow
78983c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
79083c08b44SMarshall Clowtemplate <class _Tp = void>
79183c08b44SMarshall Clow#else
7923e519524SHoward Hinnanttemplate <class _Tp>
79383c08b44SMarshall Clow#endif
794e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS less_equal : binary_function<_Tp, _Tp, bool>
7953e519524SHoward Hinnant{
7963d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
7973d5134ddSMarshall Clow    bool operator()(const _Tp& __x, const _Tp& __y) const
7983e519524SHoward Hinnant        {return __x <= __y;}
7993e519524SHoward Hinnant};
8003e519524SHoward Hinnant
80183c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
80283c08b44SMarshall Clowtemplate <>
803e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS less_equal<void>
80483c08b44SMarshall Clow{
8053d5134ddSMarshall Clow    template <class _T1, class _T2>
8063d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
80783c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
808a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)))
809a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))
81083c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); }
81125d3402cSMarshall Clow    typedef void is_transparent;
81283c08b44SMarshall Clow};
81383c08b44SMarshall Clow#endif
81483c08b44SMarshall Clow
81583c08b44SMarshall Clow
81683c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
81783c08b44SMarshall Clowtemplate <class _Tp = void>
81883c08b44SMarshall Clow#else
8193e519524SHoward Hinnanttemplate <class _Tp>
82083c08b44SMarshall Clow#endif
821e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS logical_and : binary_function<_Tp, _Tp, bool>
8223e519524SHoward Hinnant{
8233d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
8243d5134ddSMarshall Clow    bool operator()(const _Tp& __x, const _Tp& __y) const
8253e519524SHoward Hinnant        {return __x && __y;}
8263e519524SHoward Hinnant};
8273e519524SHoward Hinnant
82883c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
82983c08b44SMarshall Clowtemplate <>
830e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS logical_and<void>
83183c08b44SMarshall Clow{
8323d5134ddSMarshall Clow    template <class _T1, class _T2>
8333d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
83483c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
835a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)))
836a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))
83783c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); }
83825d3402cSMarshall Clow    typedef void is_transparent;
83983c08b44SMarshall Clow};
84083c08b44SMarshall Clow#endif
84183c08b44SMarshall Clow
84283c08b44SMarshall Clow
84383c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
84483c08b44SMarshall Clowtemplate <class _Tp = void>
84583c08b44SMarshall Clow#else
8463e519524SHoward Hinnanttemplate <class _Tp>
84783c08b44SMarshall Clow#endif
848e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS logical_or : binary_function<_Tp, _Tp, bool>
8493e519524SHoward Hinnant{
8503d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
8513d5134ddSMarshall Clow    bool operator()(const _Tp& __x, const _Tp& __y) const
8523e519524SHoward Hinnant        {return __x || __y;}
8533e519524SHoward Hinnant};
8543e519524SHoward Hinnant
85583c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
85683c08b44SMarshall Clowtemplate <>
857e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS logical_or<void>
85883c08b44SMarshall Clow{
8593d5134ddSMarshall Clow    template <class _T1, class _T2>
8603d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
86183c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
862a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)))
863a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))
86483c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); }
86525d3402cSMarshall Clow    typedef void is_transparent;
86683c08b44SMarshall Clow};
86783c08b44SMarshall Clow#endif
86883c08b44SMarshall Clow
86983c08b44SMarshall Clow
87083c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
87183c08b44SMarshall Clowtemplate <class _Tp = void>
87283c08b44SMarshall Clow#else
8733e519524SHoward Hinnanttemplate <class _Tp>
87483c08b44SMarshall Clow#endif
875e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS logical_not : unary_function<_Tp, bool>
8763e519524SHoward Hinnant{
8773d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
8783d5134ddSMarshall Clow    bool operator()(const _Tp& __x) const
8793e519524SHoward Hinnant        {return !__x;}
8803e519524SHoward Hinnant};
8813e519524SHoward Hinnant
88283c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
88383c08b44SMarshall Clowtemplate <>
884e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS logical_not<void>
88583c08b44SMarshall Clow{
8863e519524SHoward Hinnant    template <class _Tp>
8873d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
8883d5134ddSMarshall Clow    auto operator()(_Tp&& __x) const
889a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x)))
890a64f2fbcSMarshall Clow    -> decltype        (!_VSTD::forward<_Tp>(__x))
89183c08b44SMarshall Clow        { return        !_VSTD::forward<_Tp>(__x); }
89225d3402cSMarshall Clow    typedef void is_transparent;
89383c08b44SMarshall Clow};
89483c08b44SMarshall Clow#endif
89583c08b44SMarshall Clow
89683c08b44SMarshall Clow
89783c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
89883c08b44SMarshall Clowtemplate <class _Tp = void>
89983c08b44SMarshall Clow#else
90083c08b44SMarshall Clowtemplate <class _Tp>
90183c08b44SMarshall Clow#endif
902e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_and : binary_function<_Tp, _Tp, _Tp>
9033e519524SHoward Hinnant{
9043d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
9053d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
9063e519524SHoward Hinnant        {return __x & __y;}
9073e519524SHoward Hinnant};
9083e519524SHoward Hinnant
90983c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
91083c08b44SMarshall Clowtemplate <>
911e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_and<void>
91283c08b44SMarshall Clow{
9133d5134ddSMarshall Clow    template <class _T1, class _T2>
9143d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
91583c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
916a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)))
917a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))
91883c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); }
91925d3402cSMarshall Clow    typedef void is_transparent;
92083c08b44SMarshall Clow};
92183c08b44SMarshall Clow#endif
92283c08b44SMarshall Clow
92383c08b44SMarshall Clow
92483c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
92583c08b44SMarshall Clowtemplate <class _Tp = void>
92683c08b44SMarshall Clow#else
9273e519524SHoward Hinnanttemplate <class _Tp>
92883c08b44SMarshall Clow#endif
929e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_or : binary_function<_Tp, _Tp, _Tp>
9303e519524SHoward Hinnant{
9313d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
9323d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
9333e519524SHoward Hinnant        {return __x | __y;}
9343e519524SHoward Hinnant};
9353e519524SHoward Hinnant
93683c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
93783c08b44SMarshall Clowtemplate <>
938e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_or<void>
93983c08b44SMarshall Clow{
9403d5134ddSMarshall Clow    template <class _T1, class _T2>
9413d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
94283c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
943a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)))
944a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))
94583c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); }
94625d3402cSMarshall Clow    typedef void is_transparent;
94783c08b44SMarshall Clow};
94883c08b44SMarshall Clow#endif
94983c08b44SMarshall Clow
95083c08b44SMarshall Clow
95183c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
95283c08b44SMarshall Clowtemplate <class _Tp = void>
95383c08b44SMarshall Clow#else
9543e519524SHoward Hinnanttemplate <class _Tp>
95583c08b44SMarshall Clow#endif
956e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_xor : binary_function<_Tp, _Tp, _Tp>
9573e519524SHoward Hinnant{
9583d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
9593d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x, const _Tp& __y) const
9603e519524SHoward Hinnant        {return __x ^ __y;}
9613e519524SHoward Hinnant};
9623e519524SHoward Hinnant
96383c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
96483c08b44SMarshall Clowtemplate <>
965e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_xor<void>
96683c08b44SMarshall Clow{
9673d5134ddSMarshall Clow    template <class _T1, class _T2>
9683d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
96983c08b44SMarshall Clow    auto operator()(_T1&& __t, _T2&& __u) const
970a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)))
971a64f2fbcSMarshall Clow    -> decltype        (_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))
97283c08b44SMarshall Clow        { return        _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); }
97325d3402cSMarshall Clow    typedef void is_transparent;
97483c08b44SMarshall Clow};
97583c08b44SMarshall Clow#endif
97683c08b44SMarshall Clow
97783c08b44SMarshall Clow
97883c08b44SMarshall Clow#if _LIBCPP_STD_VER > 11
97983c08b44SMarshall Clowtemplate <class _Tp = void>
980e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_not : unary_function<_Tp, _Tp>
98183c08b44SMarshall Clow{
9823d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
9833d5134ddSMarshall Clow    _Tp operator()(const _Tp& __x) const
98483c08b44SMarshall Clow        {return ~__x;}
98583c08b44SMarshall Clow};
98683c08b44SMarshall Clow
98783c08b44SMarshall Clowtemplate <>
988e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS bit_not<void>
98983c08b44SMarshall Clow{
99083c08b44SMarshall Clow    template <class _Tp>
9913d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
9923d5134ddSMarshall Clow    auto operator()(_Tp&& __x) const
993a64f2fbcSMarshall Clow    _NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x)))
994a64f2fbcSMarshall Clow    -> decltype        (~_VSTD::forward<_Tp>(__x))
99583c08b44SMarshall Clow        { return        ~_VSTD::forward<_Tp>(__x); }
99625d3402cSMarshall Clow    typedef void is_transparent;
99783c08b44SMarshall Clow};
99883c08b44SMarshall Clow#endif
99983c08b44SMarshall Clow
10003e519524SHoward Hinnanttemplate <class _Predicate>
1001ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 unary_negate
10023e519524SHoward Hinnant    : public unary_function<typename _Predicate::argument_type, bool>
10033e519524SHoward Hinnant{
10043e519524SHoward Hinnant    _Predicate __pred_;
10053e519524SHoward Hinnantpublic:
10063d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
10073d5134ddSMarshall Clow    explicit unary_negate(const _Predicate& __pred)
10083e519524SHoward Hinnant        : __pred_(__pred) {}
10093d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
10103d5134ddSMarshall Clow    bool operator()(const typename _Predicate::argument_type& __x) const
10113e519524SHoward Hinnant        {return !__pred_(__x);}
10123e519524SHoward Hinnant};
10133e519524SHoward Hinnant
10143e519524SHoward Hinnanttemplate <class _Predicate>
1015ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
10163e519524SHoward Hinnantunary_negate<_Predicate>
10173e519524SHoward Hinnantnot1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);}
10183e519524SHoward Hinnant
10193e519524SHoward Hinnanttemplate <class _Predicate>
1020ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 binary_negate
10213e519524SHoward Hinnant    : public binary_function<typename _Predicate::first_argument_type,
10223e519524SHoward Hinnant                             typename _Predicate::second_argument_type,
10233e519524SHoward Hinnant                             bool>
10243e519524SHoward Hinnant{
10253e519524SHoward Hinnant    _Predicate __pred_;
10263e519524SHoward Hinnantpublic:
10273d5134ddSMarshall Clow    _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11
10283d5134ddSMarshall Clow    binary_negate(const _Predicate& __pred) : __pred_(__pred) {}
10293d5134ddSMarshall Clow
10303d5134ddSMarshall Clow    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
10313d5134ddSMarshall Clow    bool operator()(const typename _Predicate::first_argument_type& __x,
10323e519524SHoward Hinnant                    const typename _Predicate::second_argument_type& __y) const
10333e519524SHoward Hinnant        {return !__pred_(__x, __y);}
10343e519524SHoward Hinnant};
10353e519524SHoward Hinnant
10363e519524SHoward Hinnanttemplate <class _Predicate>
1037ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
10383e519524SHoward Hinnantbinary_negate<_Predicate>
10393e519524SHoward Hinnantnot2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);}
10403e519524SHoward Hinnant
10417d210c78SMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
10423e519524SHoward Hinnanttemplate <class __Operation>
1043ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder1st
10443e519524SHoward Hinnant    : public unary_function<typename __Operation::second_argument_type,
10453e519524SHoward Hinnant                            typename __Operation::result_type>
10463e519524SHoward Hinnant{
10473e519524SHoward Hinnantprotected:
10483e519524SHoward Hinnant    __Operation                               op;
10493e519524SHoward Hinnant    typename __Operation::first_argument_type value;
10503e519524SHoward Hinnantpublic:
10513e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x,
10523e519524SHoward Hinnant                               const typename __Operation::first_argument_type __y)
10533e519524SHoward Hinnant        : op(__x), value(__y) {}
10543e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
10553e519524SHoward Hinnant        (typename __Operation::second_argument_type& __x) const
10563e519524SHoward Hinnant            {return op(value, __x);}
10573e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
10583e519524SHoward Hinnant        (const typename __Operation::second_argument_type& __x) const
10593e519524SHoward Hinnant            {return op(value, __x);}
10603e519524SHoward Hinnant};
10613e519524SHoward Hinnant
10623e519524SHoward Hinnanttemplate <class __Operation, class _Tp>
1063ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
10643e519524SHoward Hinnantbinder1st<__Operation>
10653e519524SHoward Hinnantbind1st(const __Operation& __op, const _Tp& __x)
10663e519524SHoward Hinnant    {return binder1st<__Operation>(__op, __x);}
10673e519524SHoward Hinnant
10683e519524SHoward Hinnanttemplate <class __Operation>
1069ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder2nd
10703e519524SHoward Hinnant    : public unary_function<typename __Operation::first_argument_type,
10713e519524SHoward Hinnant                            typename __Operation::result_type>
10723e519524SHoward Hinnant{
10733e519524SHoward Hinnantprotected:
10743e519524SHoward Hinnant    __Operation                                op;
10753e519524SHoward Hinnant    typename __Operation::second_argument_type value;
10763e519524SHoward Hinnantpublic:
10770af133f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10783e519524SHoward Hinnant    binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y)
10793e519524SHoward Hinnant        : op(__x), value(__y) {}
10803e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
10813e519524SHoward Hinnant        (      typename __Operation::first_argument_type& __x) const
10823e519524SHoward Hinnant            {return op(__x, value);}
10833e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
10843e519524SHoward Hinnant        (const typename __Operation::first_argument_type& __x) const
10853e519524SHoward Hinnant            {return op(__x, value);}
10863e519524SHoward Hinnant};
10873e519524SHoward Hinnant
10883e519524SHoward Hinnanttemplate <class __Operation, class _Tp>
1089ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
10903e519524SHoward Hinnantbinder2nd<__Operation>
10913e519524SHoward Hinnantbind2nd(const __Operation& __op, const _Tp& __x)
10923e519524SHoward Hinnant    {return binder2nd<__Operation>(__op, __x);}
10933e519524SHoward Hinnant
10943e519524SHoward Hinnanttemplate <class _Arg, class _Result>
1095ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_unary_function
10960af133f9SHoward Hinnant    : public unary_function<_Arg, _Result>
10973e519524SHoward Hinnant{
10983e519524SHoward Hinnant    _Result (*__f_)(_Arg);
10993e519524SHoward Hinnantpublic:
11003e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg))
11013e519524SHoward Hinnant        : __f_(__f) {}
11023e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const
11033e519524SHoward Hinnant        {return __f_(__x);}
11043e519524SHoward Hinnant};
11053e519524SHoward Hinnant
11063e519524SHoward Hinnanttemplate <class _Arg, class _Result>
1107ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
11083e519524SHoward Hinnantpointer_to_unary_function<_Arg,_Result>
11093e519524SHoward Hinnantptr_fun(_Result (*__f)(_Arg))
11103e519524SHoward Hinnant    {return pointer_to_unary_function<_Arg,_Result>(__f);}
11113e519524SHoward Hinnant
11123e519524SHoward Hinnanttemplate <class _Arg1, class _Arg2, class _Result>
1113ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_binary_function
11140af133f9SHoward Hinnant    : public binary_function<_Arg1, _Arg2, _Result>
11153e519524SHoward Hinnant{
11163e519524SHoward Hinnant    _Result (*__f_)(_Arg1, _Arg2);
11173e519524SHoward Hinnantpublic:
11183e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2))
11193e519524SHoward Hinnant        : __f_(__f) {}
11203e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const
11213e519524SHoward Hinnant        {return __f_(__x, __y);}
11223e519524SHoward Hinnant};
11233e519524SHoward Hinnant
11243e519524SHoward Hinnanttemplate <class _Arg1, class _Arg2, class _Result>
1125ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
11263e519524SHoward Hinnantpointer_to_binary_function<_Arg1,_Arg2,_Result>
11273e519524SHoward Hinnantptr_fun(_Result (*__f)(_Arg1,_Arg2))
11283e519524SHoward Hinnant    {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);}
11293e519524SHoward Hinnant
11303e519524SHoward Hinnanttemplate<class _Sp, class _Tp>
1131ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_t
1132ea5cd3b4SLouis Dionne    : public unary_function<_Tp*, _Sp>
11333e519524SHoward Hinnant{
11343e519524SHoward Hinnant    _Sp (_Tp::*__p_)();
11353e519524SHoward Hinnantpublic:
11363e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)())
11373e519524SHoward Hinnant        : __p_(__p) {}
11383e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const
11393e519524SHoward Hinnant        {return (__p->*__p_)();}
11403e519524SHoward Hinnant};
11413e519524SHoward Hinnant
11423e519524SHoward Hinnanttemplate<class _Sp, class _Tp, class _Ap>
1143ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_t
1144ea5cd3b4SLouis Dionne    : public binary_function<_Tp*, _Ap, _Sp>
11453e519524SHoward Hinnant{
11463e519524SHoward Hinnant    _Sp (_Tp::*__p_)(_Ap);
11473e519524SHoward Hinnantpublic:
11483e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap))
11493e519524SHoward Hinnant        : __p_(__p) {}
11503e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const
11513e519524SHoward Hinnant        {return (__p->*__p_)(__x);}
11523e519524SHoward Hinnant};
11533e519524SHoward Hinnant
11543e519524SHoward Hinnanttemplate<class _Sp, class _Tp>
1155ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
11563e519524SHoward Hinnantmem_fun_t<_Sp,_Tp>
11573e519524SHoward Hinnantmem_fun(_Sp (_Tp::*__f)())
11583e519524SHoward Hinnant    {return mem_fun_t<_Sp,_Tp>(__f);}
11593e519524SHoward Hinnant
11603e519524SHoward Hinnanttemplate<class _Sp, class _Tp, class _Ap>
1161ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
11623e519524SHoward Hinnantmem_fun1_t<_Sp,_Tp,_Ap>
11633e519524SHoward Hinnantmem_fun(_Sp (_Tp::*__f)(_Ap))
11643e519524SHoward Hinnant    {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
11653e519524SHoward Hinnant
11663e519524SHoward Hinnanttemplate<class _Sp, class _Tp>
1167ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_ref_t
1168ea5cd3b4SLouis Dionne    : public unary_function<_Tp, _Sp>
11693e519524SHoward Hinnant{
11703e519524SHoward Hinnant    _Sp (_Tp::*__p_)();
11713e519524SHoward Hinnantpublic:
11723e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)())
11733e519524SHoward Hinnant        : __p_(__p) {}
11743e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const
11753e519524SHoward Hinnant        {return (__p.*__p_)();}
11763e519524SHoward Hinnant};
11773e519524SHoward Hinnant
11783e519524SHoward Hinnanttemplate<class _Sp, class _Tp, class _Ap>
1179ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_ref_t
1180ea5cd3b4SLouis Dionne    : public binary_function<_Tp, _Ap, _Sp>
11813e519524SHoward Hinnant{
11823e519524SHoward Hinnant    _Sp (_Tp::*__p_)(_Ap);
11833e519524SHoward Hinnantpublic:
11843e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap))
11853e519524SHoward Hinnant        : __p_(__p) {}
11863e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const
11873e519524SHoward Hinnant        {return (__p.*__p_)(__x);}
11883e519524SHoward Hinnant};
11893e519524SHoward Hinnant
11903e519524SHoward Hinnanttemplate<class _Sp, class _Tp>
1191ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
11923e519524SHoward Hinnantmem_fun_ref_t<_Sp,_Tp>
11933e519524SHoward Hinnantmem_fun_ref(_Sp (_Tp::*__f)())
11943e519524SHoward Hinnant    {return mem_fun_ref_t<_Sp,_Tp>(__f);}
11953e519524SHoward Hinnant
11963e519524SHoward Hinnanttemplate<class _Sp, class _Tp, class _Ap>
1197ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
11983e519524SHoward Hinnantmem_fun1_ref_t<_Sp,_Tp,_Ap>
11993e519524SHoward Hinnantmem_fun_ref(_Sp (_Tp::*__f)(_Ap))
12003e519524SHoward Hinnant    {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
12013e519524SHoward Hinnant
12023e519524SHoward Hinnanttemplate <class _Sp, class _Tp>
1203ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_t
1204ea5cd3b4SLouis Dionne    : public unary_function<const _Tp*, _Sp>
12053e519524SHoward Hinnant{
12063e519524SHoward Hinnant    _Sp (_Tp::*__p_)() const;
12073e519524SHoward Hinnantpublic:
12083e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const)
12093e519524SHoward Hinnant        : __p_(__p) {}
12103e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const
12113e519524SHoward Hinnant        {return (__p->*__p_)();}
12123e519524SHoward Hinnant};
12133e519524SHoward Hinnant
12143e519524SHoward Hinnanttemplate <class _Sp, class _Tp, class _Ap>
1215ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_t
1216ea5cd3b4SLouis Dionne    : public binary_function<const _Tp*, _Ap, _Sp>
12173e519524SHoward Hinnant{
12183e519524SHoward Hinnant    _Sp (_Tp::*__p_)(_Ap) const;
12193e519524SHoward Hinnantpublic:
12203e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const)
12213e519524SHoward Hinnant        : __p_(__p) {}
12223e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const
12233e519524SHoward Hinnant        {return (__p->*__p_)(__x);}
12243e519524SHoward Hinnant};
12253e519524SHoward Hinnant
12263e519524SHoward Hinnanttemplate <class _Sp, class _Tp>
1227ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
12283e519524SHoward Hinnantconst_mem_fun_t<_Sp,_Tp>
12293e519524SHoward Hinnantmem_fun(_Sp (_Tp::*__f)() const)
12303e519524SHoward Hinnant    {return const_mem_fun_t<_Sp,_Tp>(__f);}
12313e519524SHoward Hinnant
12323e519524SHoward Hinnanttemplate <class _Sp, class _Tp, class _Ap>
1233ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
12343e519524SHoward Hinnantconst_mem_fun1_t<_Sp,_Tp,_Ap>
12353e519524SHoward Hinnantmem_fun(_Sp (_Tp::*__f)(_Ap) const)
12363e519524SHoward Hinnant    {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
12373e519524SHoward Hinnant
12383e519524SHoward Hinnanttemplate <class _Sp, class _Tp>
1239ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_ref_t
1240ea5cd3b4SLouis Dionne    : public unary_function<_Tp, _Sp>
12413e519524SHoward Hinnant{
12423e519524SHoward Hinnant    _Sp (_Tp::*__p_)() const;
12433e519524SHoward Hinnantpublic:
12443e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const)
12453e519524SHoward Hinnant        : __p_(__p) {}
12463e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const
12473e519524SHoward Hinnant        {return (__p.*__p_)();}
12483e519524SHoward Hinnant};
12493e519524SHoward Hinnant
12503e519524SHoward Hinnanttemplate <class _Sp, class _Tp, class _Ap>
1251ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_ref_t
12520af133f9SHoward Hinnant    : public binary_function<_Tp, _Ap, _Sp>
12533e519524SHoward Hinnant{
12543e519524SHoward Hinnant    _Sp (_Tp::*__p_)(_Ap) const;
12553e519524SHoward Hinnantpublic:
12563e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const)
12573e519524SHoward Hinnant        : __p_(__p) {}
12583e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const
12593e519524SHoward Hinnant        {return (__p.*__p_)(__x);}
12603e519524SHoward Hinnant};
12613e519524SHoward Hinnant
12623e519524SHoward Hinnanttemplate <class _Sp, class _Tp>
1263ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
12643e519524SHoward Hinnantconst_mem_fun_ref_t<_Sp,_Tp>
12653e519524SHoward Hinnantmem_fun_ref(_Sp (_Tp::*__f)() const)
12663e519524SHoward Hinnant    {return const_mem_fun_ref_t<_Sp,_Tp>(__f);}
12673e519524SHoward Hinnant
12683e519524SHoward Hinnanttemplate <class _Sp, class _Tp, class _Ap>
1269ea5cd3b4SLouis Dionne_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
12703e519524SHoward Hinnantconst_mem_fun1_ref_t<_Sp,_Tp,_Ap>
12713e519524SHoward Hinnantmem_fun_ref(_Sp (_Tp::*__f)(_Ap) const)
12723e519524SHoward Hinnant    {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
12737d210c78SMarshall Clow#endif
12743e519524SHoward Hinnant
1275e5407178SEric Fiselier////////////////////////////////////////////////////////////////////////////////
1276e5407178SEric Fiselier//                                MEMFUN
1277e5407178SEric Fiselier//==============================================================================
12783e519524SHoward Hinnant
12793e519524SHoward Hinnanttemplate <class _Tp>
12803e519524SHoward Hinnantclass __mem_fn
12813e519524SHoward Hinnant    : public __weak_result_type<_Tp>
12823e519524SHoward Hinnant{
12833e519524SHoward Hinnantpublic:
12843e519524SHoward Hinnant    // types
12853e519524SHoward Hinnant    typedef _Tp type;
12863e519524SHoward Hinnantprivate:
12873e519524SHoward Hinnant    type __f_;
12883e519524SHoward Hinnant
12893e519524SHoward Hinnantpublic:
12903b72a6efSMarshall Clow    _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
12913e519524SHoward Hinnant
12927e23afcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12933e519524SHoward Hinnant    // invoke
12943e519524SHoward Hinnant    template <class... _ArgTypes>
12950af133f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12963e519524SHoward Hinnant    typename __invoke_return<type, _ArgTypes...>::type
129700f512ebSEric Fiselier    operator() (_ArgTypes&&... __args) const {
1298ce48a113SHoward Hinnant        return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
12993e519524SHoward Hinnant    }
130000f512ebSEric Fiselier#else
130100f512ebSEric Fiselier
130200f512ebSEric Fiselier    template <class _A0>
130370192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
130400f512ebSEric Fiselier    typename __invoke_return0<type, _A0>::type
130500f512ebSEric Fiselier    operator() (_A0& __a0) const {
130600f512ebSEric Fiselier        return __invoke(__f_, __a0);
130700f512ebSEric Fiselier    }
130800f512ebSEric Fiselier
130970192a9eSEric Fiselier    template <class _A0>
131070192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
131170192a9eSEric Fiselier    typename __invoke_return0<type, _A0 const>::type
131270192a9eSEric Fiselier    operator() (_A0 const& __a0) const {
131370192a9eSEric Fiselier        return __invoke(__f_, __a0);
131470192a9eSEric Fiselier    }
131570192a9eSEric Fiselier
131600f512ebSEric Fiselier    template <class _A0, class _A1>
131770192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
131800f512ebSEric Fiselier    typename __invoke_return1<type, _A0, _A1>::type
131900f512ebSEric Fiselier    operator() (_A0& __a0, _A1& __a1) const {
132000f512ebSEric Fiselier        return __invoke(__f_, __a0, __a1);
132100f512ebSEric Fiselier    }
132200f512ebSEric Fiselier
132370192a9eSEric Fiselier    template <class _A0, class _A1>
132470192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
132570192a9eSEric Fiselier    typename __invoke_return1<type, _A0 const, _A1>::type
132670192a9eSEric Fiselier    operator() (_A0 const& __a0, _A1& __a1) const {
132770192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1);
132870192a9eSEric Fiselier    }
132970192a9eSEric Fiselier
133070192a9eSEric Fiselier    template <class _A0, class _A1>
133170192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
133270192a9eSEric Fiselier    typename __invoke_return1<type, _A0, _A1 const>::type
133370192a9eSEric Fiselier    operator() (_A0& __a0, _A1 const& __a1) const {
133470192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1);
133570192a9eSEric Fiselier    }
133670192a9eSEric Fiselier
133770192a9eSEric Fiselier    template <class _A0, class _A1>
133870192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
133970192a9eSEric Fiselier    typename __invoke_return1<type, _A0 const, _A1 const>::type
134070192a9eSEric Fiselier    operator() (_A0 const& __a0, _A1 const& __a1) const {
134170192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1);
134270192a9eSEric Fiselier    }
134370192a9eSEric Fiselier
134400f512ebSEric Fiselier    template <class _A0, class _A1, class _A2>
134570192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
134600f512ebSEric Fiselier    typename __invoke_return2<type, _A0, _A1, _A2>::type
134700f512ebSEric Fiselier    operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
134800f512ebSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
134900f512ebSEric Fiselier    }
135070192a9eSEric Fiselier
135170192a9eSEric Fiselier    template <class _A0, class _A1, class _A2>
135270192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
135370192a9eSEric Fiselier    typename __invoke_return2<type, _A0 const, _A1, _A2>::type
135470192a9eSEric Fiselier    operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
135570192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
135670192a9eSEric Fiselier    }
135770192a9eSEric Fiselier
135870192a9eSEric Fiselier    template <class _A0, class _A1, class _A2>
135970192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
136070192a9eSEric Fiselier    typename __invoke_return2<type, _A0, _A1 const, _A2>::type
136170192a9eSEric Fiselier    operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
136270192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
136370192a9eSEric Fiselier    }
136470192a9eSEric Fiselier
136570192a9eSEric Fiselier    template <class _A0, class _A1, class _A2>
136670192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
136770192a9eSEric Fiselier    typename __invoke_return2<type, _A0, _A1, _A2 const>::type
136870192a9eSEric Fiselier    operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
136970192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
137070192a9eSEric Fiselier    }
137170192a9eSEric Fiselier
137270192a9eSEric Fiselier    template <class _A0, class _A1, class _A2>
137370192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
137470192a9eSEric Fiselier    typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
137570192a9eSEric Fiselier    operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
137670192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
137770192a9eSEric Fiselier    }
137870192a9eSEric Fiselier
137970192a9eSEric Fiselier    template <class _A0, class _A1, class _A2>
138070192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
138170192a9eSEric Fiselier    typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
138270192a9eSEric Fiselier    operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
138370192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
138470192a9eSEric Fiselier    }
138570192a9eSEric Fiselier
138670192a9eSEric Fiselier    template <class _A0, class _A1, class _A2>
138770192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
138870192a9eSEric Fiselier    typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
138970192a9eSEric Fiselier    operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
139070192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
139170192a9eSEric Fiselier    }
139270192a9eSEric Fiselier
139370192a9eSEric Fiselier    template <class _A0, class _A1, class _A2>
139470192a9eSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
139570192a9eSEric Fiselier    typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
139670192a9eSEric Fiselier    operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
139770192a9eSEric Fiselier        return __invoke(__f_, __a0, __a1, __a2);
139870192a9eSEric Fiselier    }
139900f512ebSEric Fiselier#endif
14003e519524SHoward Hinnant};
14013e519524SHoward Hinnant
1402c003db1fSHoward Hinnanttemplate<class _Rp, class _Tp>
14033e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1404c003db1fSHoward Hinnant__mem_fn<_Rp _Tp::*>
14053b72a6efSMarshall Clowmem_fn(_Rp _Tp::* __pm) _NOEXCEPT
14063e519524SHoward Hinnant{
1407c003db1fSHoward Hinnant    return __mem_fn<_Rp _Tp::*>(__pm);
14083e519524SHoward Hinnant}
14093e519524SHoward Hinnant
1410e5407178SEric Fiselier////////////////////////////////////////////////////////////////////////////////
1411e5407178SEric Fiselier//                                FUNCTION
1412e5407178SEric Fiselier//==============================================================================
1413e5407178SEric Fiselier
14143e519524SHoward Hinnant// bad_function_call
14153e519524SHoward Hinnant
14160af133f9SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_function_call
14173e519524SHoward Hinnant    : public exception
14183e519524SHoward Hinnant{
1419c7cd73e8SShoaib Meenai#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
1420c7cd73e8SShoaib Meenaipublic:
1421c7cd73e8SShoaib Meenai    virtual ~bad_function_call() _NOEXCEPT;
1422c7cd73e8SShoaib Meenai
1423c7cd73e8SShoaib Meenai    virtual const char* what() const _NOEXCEPT;
1424c7cd73e8SShoaib Meenai#endif
14253e519524SHoward Hinnant};
14263e519524SHoward Hinnant
1427dc7200b4SLouis Dionne_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
1428d437fa5cSMarshall Clowvoid __throw_bad_function_call()
1429d437fa5cSMarshall Clow{
1430d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
1431d437fa5cSMarshall Clow    throw bad_function_call();
1432d437fa5cSMarshall Clow#else
1433d437fa5cSMarshall Clow    _VSTD::abort();
1434d437fa5cSMarshall Clow#endif
1435d437fa5cSMarshall Clow}
1436d437fa5cSMarshall Clow
1437e2f2d1edSEric Fiseliertemplate<class _Fp> class _LIBCPP_TEMPLATE_VIS function; // undefined
14383e519524SHoward Hinnant
14393e519524SHoward Hinnantnamespace __function
14403e519524SHoward Hinnant{
14413e519524SHoward Hinnant
1442e5407178SEric Fiseliertemplate<class _Rp>
14433e519524SHoward Hinnantstruct __maybe_derive_from_unary_function
14443e519524SHoward Hinnant{
14453e519524SHoward Hinnant};
14463e519524SHoward Hinnant
1447c003db1fSHoward Hinnanttemplate<class _Rp, class _A1>
1448c003db1fSHoward Hinnantstruct __maybe_derive_from_unary_function<_Rp(_A1)>
1449c003db1fSHoward Hinnant    : public unary_function<_A1, _Rp>
14503e519524SHoward Hinnant{
14513e519524SHoward Hinnant};
14523e519524SHoward Hinnant
1453e5407178SEric Fiseliertemplate<class _Rp>
14543e519524SHoward Hinnantstruct __maybe_derive_from_binary_function
14553e519524SHoward Hinnant{
14563e519524SHoward Hinnant};
14573e519524SHoward Hinnant
1458c003db1fSHoward Hinnanttemplate<class _Rp, class _A1, class _A2>
1459c003db1fSHoward Hinnantstruct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
1460c003db1fSHoward Hinnant    : public binary_function<_A1, _A2, _Rp>
14613e519524SHoward Hinnant{
14623e519524SHoward Hinnant};
14633e519524SHoward Hinnant
14640d28f784SEric Fiseliertemplate <class _Fp>
14650d28f784SEric Fiselier_LIBCPP_INLINE_VISIBILITY
14660d28f784SEric Fiselierbool __not_null(_Fp const&) { return true; }
14670d28f784SEric Fiselier
14680d28f784SEric Fiseliertemplate <class _Fp>
14690d28f784SEric Fiselier_LIBCPP_INLINE_VISIBILITY
14700d28f784SEric Fiselierbool __not_null(_Fp* __ptr) { return __ptr; }
14710d28f784SEric Fiselier
14720d28f784SEric Fiseliertemplate <class _Ret, class _Class>
14730d28f784SEric Fiselier_LIBCPP_INLINE_VISIBILITY
14740d28f784SEric Fiselierbool __not_null(_Ret _Class::*__ptr) { return __ptr; }
14750d28f784SEric Fiselier
14760d28f784SEric Fiseliertemplate <class _Fp>
14770d28f784SEric Fiselier_LIBCPP_INLINE_VISIBILITY
14780d28f784SEric Fiselierbool __not_null(function<_Fp> const& __f) { return !!__f; }
14790d28f784SEric Fiselier
1480e5407178SEric Fiselier} // namespace __function
1481e5407178SEric Fiselier
14827e23afcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1483e5407178SEric Fiselier
1484e5407178SEric Fiseliernamespace __function {
1485e5407178SEric Fiselier
14865f503b47SEric Fiselier// __alloc_func holds a functor and an allocator.
14875f503b47SEric Fiselier
14885f503b47SEric Fiseliertemplate <class _Fp, class _Ap, class _FB> class __alloc_func;
1489d63dd874SEric Fiseliertemplate <class _Fp, class _FB>
1490d63dd874SEric Fiselierclass __default_alloc_func;
14915f503b47SEric Fiselier
14925f503b47SEric Fiseliertemplate <class _Fp, class _Ap, class _Rp, class... _ArgTypes>
14935f503b47SEric Fiselierclass __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)>
14945f503b47SEric Fiselier{
14955f503b47SEric Fiselier    __compressed_pair<_Fp, _Ap> __f_;
14965f503b47SEric Fiselier
14975f503b47SEric Fiselier  public:
149814d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE _Fp _Target;
149914d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE _Ap _Alloc;
15005f503b47SEric Fiselier
15015f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15025f503b47SEric Fiselier    const _Target& __target() const { return __f_.first(); }
15035f503b47SEric Fiselier
15047f50dfa6SThomas Anderson    // WIN32 APIs may define __allocator, so use __get_allocator instead.
15055f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15067f50dfa6SThomas Anderson    const _Alloc& __get_allocator() const { return __f_.second(); }
15075f503b47SEric Fiselier
15085f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15095f503b47SEric Fiselier    explicit __alloc_func(_Target&& __f)
15105f503b47SEric Fiselier        : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
15115f503b47SEric Fiselier               _VSTD::forward_as_tuple())
15125f503b47SEric Fiselier    {
15135f503b47SEric Fiselier    }
15145f503b47SEric Fiselier
15155f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15165f503b47SEric Fiselier    explicit __alloc_func(const _Target& __f, const _Alloc& __a)
15175f503b47SEric Fiselier        : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
15185f503b47SEric Fiselier               _VSTD::forward_as_tuple(__a))
15195f503b47SEric Fiselier    {
15205f503b47SEric Fiselier    }
15215f503b47SEric Fiselier
15225f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15235f503b47SEric Fiselier    explicit __alloc_func(const _Target& __f, _Alloc&& __a)
15245f503b47SEric Fiselier        : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
15255f503b47SEric Fiselier               _VSTD::forward_as_tuple(_VSTD::move(__a)))
15265f503b47SEric Fiselier    {
15275f503b47SEric Fiselier    }
15285f503b47SEric Fiselier
15295f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15305f503b47SEric Fiselier    explicit __alloc_func(_Target&& __f, _Alloc&& __a)
15315f503b47SEric Fiselier        : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
15325f503b47SEric Fiselier               _VSTD::forward_as_tuple(_VSTD::move(__a)))
15335f503b47SEric Fiselier    {
15345f503b47SEric Fiselier    }
15355f503b47SEric Fiselier
15365f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15375f503b47SEric Fiselier    _Rp operator()(_ArgTypes&&... __arg)
15385f503b47SEric Fiselier    {
15395f503b47SEric Fiselier        typedef __invoke_void_return_wrapper<_Rp> _Invoker;
15405f503b47SEric Fiselier        return _Invoker::__call(__f_.first(),
15415f503b47SEric Fiselier                                _VSTD::forward<_ArgTypes>(__arg)...);
15425f503b47SEric Fiselier    }
15435f503b47SEric Fiselier
15445f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15455f503b47SEric Fiselier    __alloc_func* __clone() const
15465f503b47SEric Fiselier    {
15475f503b47SEric Fiselier        typedef allocator_traits<_Alloc> __alloc_traits;
15485f503b47SEric Fiselier        typedef
15495f503b47SEric Fiselier            typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type
15505f503b47SEric Fiselier                _AA;
15515f503b47SEric Fiselier        _AA __a(__f_.second());
15525f503b47SEric Fiselier        typedef __allocator_destructor<_AA> _Dp;
15535f503b47SEric Fiselier        unique_ptr<__alloc_func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
15545f503b47SEric Fiselier        ::new ((void*)__hold.get()) __alloc_func(__f_.first(), _Alloc(__a));
15555f503b47SEric Fiselier        return __hold.release();
15565f503b47SEric Fiselier    }
15575f503b47SEric Fiselier
15585f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15595f503b47SEric Fiselier    void destroy() _NOEXCEPT { __f_.~__compressed_pair<_Target, _Alloc>(); }
1560d63dd874SEric Fiselier
1561d63dd874SEric Fiselier    static void __destroy_and_delete(__alloc_func* __f) {
1562d63dd874SEric Fiselier      typedef allocator_traits<_Alloc> __alloc_traits;
1563d63dd874SEric Fiselier      typedef typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type
1564d63dd874SEric Fiselier          _FunAlloc;
1565d63dd874SEric Fiselier      _FunAlloc __a(__f->__get_allocator());
1566d63dd874SEric Fiselier      __f->destroy();
1567d63dd874SEric Fiselier      __a.deallocate(__f, 1);
1568d63dd874SEric Fiselier    }
1569d63dd874SEric Fiselier};
1570d63dd874SEric Fiselier
1571d63dd874SEric Fiseliertemplate <class _Fp, class _Rp, class... _ArgTypes>
1572d63dd874SEric Fiselierclass __default_alloc_func<_Fp, _Rp(_ArgTypes...)> {
1573d63dd874SEric Fiselier  _Fp __f_;
1574d63dd874SEric Fiselier
1575d63dd874SEric Fiselierpublic:
157614d48692SEric Fiselier  typedef _LIBCPP_NODEBUG_TYPE _Fp _Target;
1577d63dd874SEric Fiselier
1578d63dd874SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1579d63dd874SEric Fiselier  const _Target& __target() const { return __f_; }
1580d63dd874SEric Fiselier
1581d63dd874SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1582d63dd874SEric Fiselier  explicit __default_alloc_func(_Target&& __f) : __f_(std::move(__f)) {}
1583d63dd874SEric Fiselier
1584d63dd874SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1585d63dd874SEric Fiselier  explicit __default_alloc_func(const _Target& __f) : __f_(__f) {}
1586d63dd874SEric Fiselier
1587d63dd874SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1588d63dd874SEric Fiselier  _Rp operator()(_ArgTypes&&... __arg) {
1589d63dd874SEric Fiselier    typedef __invoke_void_return_wrapper<_Rp> _Invoker;
1590d63dd874SEric Fiselier    return _Invoker::__call(__f_, _VSTD::forward<_ArgTypes>(__arg)...);
1591d63dd874SEric Fiselier  }
1592d63dd874SEric Fiselier
1593d63dd874SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1594d63dd874SEric Fiselier  __default_alloc_func* __clone() const {
1595d63dd874SEric Fiselier      __builtin_new_allocator::__holder_t __hold =
1596d63dd874SEric Fiselier        __builtin_new_allocator::__allocate_type<__default_alloc_func>(1);
1597d63dd874SEric Fiselier    __default_alloc_func* __res =
1598d63dd874SEric Fiselier        ::new (__hold.get()) __default_alloc_func(__f_);
1599d63dd874SEric Fiselier    (void)__hold.release();
1600d63dd874SEric Fiselier    return __res;
1601d63dd874SEric Fiselier  }
1602d63dd874SEric Fiselier
1603d63dd874SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1604d63dd874SEric Fiselier  void destroy() _NOEXCEPT { __f_.~_Target(); }
1605d63dd874SEric Fiselier
1606d63dd874SEric Fiselier  static void __destroy_and_delete(__default_alloc_func* __f) {
1607d63dd874SEric Fiselier    __f->destroy();
1608d63dd874SEric Fiselier      __builtin_new_allocator::__deallocate_type<__default_alloc_func>(__f, 1);
1609d63dd874SEric Fiselier  }
16105f503b47SEric Fiselier};
16115f503b47SEric Fiselier
16125f503b47SEric Fiselier// __base provides an abstract interface for copyable functors.
16135f503b47SEric Fiselier
16143e519524SHoward Hinnanttemplate<class _Fp> class __base;
16153e519524SHoward Hinnant
1616c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1617c003db1fSHoward Hinnantclass __base<_Rp(_ArgTypes...)>
16183e519524SHoward Hinnant{
16193e519524SHoward Hinnant    __base(const __base&);
16203e519524SHoward Hinnant    __base& operator=(const __base&);
16213e519524SHoward Hinnantpublic:
16220af133f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __base() {}
16230af133f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
16243e519524SHoward Hinnant    virtual __base* __clone() const = 0;
16253e519524SHoward Hinnant    virtual void __clone(__base*) const = 0;
16266a07d6f0SHoward Hinnant    virtual void destroy() _NOEXCEPT = 0;
16276a07d6f0SHoward Hinnant    virtual void destroy_deallocate() _NOEXCEPT = 0;
1628c003db1fSHoward Hinnant    virtual _Rp operator()(_ArgTypes&& ...) = 0;
162954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
16306a07d6f0SHoward Hinnant    virtual const void* target(const type_info&) const _NOEXCEPT = 0;
16316a07d6f0SHoward Hinnant    virtual const std::type_info& target_type() const _NOEXCEPT = 0;
1632b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
16333e519524SHoward Hinnant};
16343e519524SHoward Hinnant
16355f503b47SEric Fiselier// __func implements __base for a given functor type.
16365f503b47SEric Fiselier
16373e519524SHoward Hinnanttemplate<class _FD, class _Alloc, class _FB> class __func;
16383e519524SHoward Hinnant
1639c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1640c003db1fSHoward Hinnantclass __func<_Fp, _Alloc, _Rp(_ArgTypes...)>
1641c003db1fSHoward Hinnant    : public  __base<_Rp(_ArgTypes...)>
16423e519524SHoward Hinnant{
16435f503b47SEric Fiselier    __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> __f_;
16443e519524SHoward Hinnantpublic:
16450af133f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16469bb1429fSHoward Hinnant    explicit __func(_Fp&& __f)
16475f503b47SEric Fiselier        : __f_(_VSTD::move(__f)) {}
16485f503b47SEric Fiselier
16490af133f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16509bb1429fSHoward Hinnant    explicit __func(const _Fp& __f, const _Alloc& __a)
16515f503b47SEric Fiselier        : __f_(__f, __a) {}
16529bb1429fSHoward Hinnant
16539bb1429fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16549bb1429fSHoward Hinnant    explicit __func(const _Fp& __f, _Alloc&& __a)
16555f503b47SEric Fiselier        : __f_(__f, _VSTD::move(__a)) {}
16569bb1429fSHoward Hinnant
16579bb1429fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16589bb1429fSHoward Hinnant    explicit __func(_Fp&& __f, _Alloc&& __a)
16595f503b47SEric Fiselier        : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
16605f503b47SEric Fiselier
1661c003db1fSHoward Hinnant    virtual __base<_Rp(_ArgTypes...)>* __clone() const;
1662c003db1fSHoward Hinnant    virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;
16636a07d6f0SHoward Hinnant    virtual void destroy() _NOEXCEPT;
16646a07d6f0SHoward Hinnant    virtual void destroy_deallocate() _NOEXCEPT;
1665c003db1fSHoward Hinnant    virtual _Rp operator()(_ArgTypes&&... __arg);
166654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
16676a07d6f0SHoward Hinnant    virtual const void* target(const type_info&) const _NOEXCEPT;
16686a07d6f0SHoward Hinnant    virtual const std::type_info& target_type() const _NOEXCEPT;
1669b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
16703e519524SHoward Hinnant};
16713e519524SHoward Hinnant
1672c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1673c003db1fSHoward Hinnant__base<_Rp(_ArgTypes...)>*
1674c003db1fSHoward Hinnant__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const
16753e519524SHoward Hinnant{
16766d370568SEric Fiselier    typedef allocator_traits<_Alloc> __alloc_traits;
16771f508014SMarshall Clow    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
16787f50dfa6SThomas Anderson    _Ap __a(__f_.__get_allocator());
1679c003db1fSHoward Hinnant    typedef __allocator_destructor<_Ap> _Dp;
1680c003db1fSHoward Hinnant    unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
16815f503b47SEric Fiselier    ::new ((void*)__hold.get()) __func(__f_.__target(), _Alloc(__a));
16823e519524SHoward Hinnant    return __hold.release();
16833e519524SHoward Hinnant}
16843e519524SHoward Hinnant
1685c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
16863e519524SHoward Hinnantvoid
1687c003db1fSHoward Hinnant__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const
16883e519524SHoward Hinnant{
16897f50dfa6SThomas Anderson    ::new (__p) __func(__f_.__target(), __f_.__get_allocator());
16903e519524SHoward Hinnant}
16913e519524SHoward Hinnant
1692c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
16933e519524SHoward Hinnantvoid
1694c003db1fSHoward Hinnant__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT
16953e519524SHoward Hinnant{
16965f503b47SEric Fiselier    __f_.destroy();
16973e519524SHoward Hinnant}
16983e519524SHoward Hinnant
1699c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
17003e519524SHoward Hinnantvoid
1701c003db1fSHoward Hinnant__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
17023e519524SHoward Hinnant{
17036d370568SEric Fiselier    typedef allocator_traits<_Alloc> __alloc_traits;
17041f508014SMarshall Clow    typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
17057f50dfa6SThomas Anderson    _Ap __a(__f_.__get_allocator());
17065f503b47SEric Fiselier    __f_.destroy();
17073e519524SHoward Hinnant    __a.deallocate(this, 1);
17083e519524SHoward Hinnant}
17093e519524SHoward Hinnant
1710c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1711c003db1fSHoward Hinnant_Rp
1712c003db1fSHoward Hinnant__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
17133e519524SHoward Hinnant{
17145f503b47SEric Fiselier    return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
17153e519524SHoward Hinnant}
17163e519524SHoward Hinnant
171754b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
171854b409fdSHoward Hinnant
1719c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
17203e519524SHoward Hinnantconst void*
1721c003db1fSHoward Hinnant__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
17223e519524SHoward Hinnant{
1723c003db1fSHoward Hinnant    if (__ti == typeid(_Fp))
17245f503b47SEric Fiselier        return &__f_.__target();
17253e519524SHoward Hinnant    return (const void*)0;
17263e519524SHoward Hinnant}
17273e519524SHoward Hinnant
1728c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
17293e519524SHoward Hinnantconst std::type_info&
1730c003db1fSHoward Hinnant__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
17313e519524SHoward Hinnant{
1732c003db1fSHoward Hinnant    return typeid(_Fp);
17333e519524SHoward Hinnant}
17343e519524SHoward Hinnant
1735b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
173654b409fdSHoward Hinnant
17375f503b47SEric Fiselier// __value_func creates a value-type from a __func.
17383e519524SHoward Hinnant
17395f503b47SEric Fiseliertemplate <class _Fp> class __value_func;
17405f503b47SEric Fiselier
17415f503b47SEric Fiseliertemplate <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)>
17423e519524SHoward Hinnant{
17438d3e7974SHoward Hinnant    typename aligned_storage<3 * sizeof(void*)>::type __buf_;
17443e519524SHoward Hinnant
17455f503b47SEric Fiselier    typedef __base<_Rp(_ArgTypes...)> __func;
17465f503b47SEric Fiselier    __func* __f_;
17475f503b47SEric Fiselier
17485f503b47SEric Fiselier    _LIBCPP_NO_CFI static __func* __as_base(void* p)
17495f503b47SEric Fiselier    {
17505f503b47SEric Fiselier        return reinterpret_cast<__func*>(p);
17513e58a6a7SEvgeniy Stepanov    }
17523e58a6a7SEvgeniy Stepanov
17533e519524SHoward Hinnant  public:
17540af133f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17555f503b47SEric Fiselier    __value_func() _NOEXCEPT : __f_(0) {}
17563e519524SHoward Hinnant
1757c003db1fSHoward Hinnant    template <class _Fp, class _Alloc>
1758d63dd874SEric Fiselier    _LIBCPP_INLINE_VISIBILITY __value_func(_Fp&& __f, const _Alloc& __a)
17599b0b6d45SHoward Hinnant        : __f_(0)
17609b0b6d45SHoward Hinnant    {
17619b0b6d45SHoward Hinnant        typedef allocator_traits<_Alloc> __alloc_traits;
17625f503b47SEric Fiselier        typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
17635f503b47SEric Fiselier        typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
17645f503b47SEric Fiselier            _FunAlloc;
17655f503b47SEric Fiselier
17660d28f784SEric Fiselier        if (__function::__not_null(__f))
17679b0b6d45SHoward Hinnant        {
17685f503b47SEric Fiselier            _FunAlloc __af(__a);
17695f503b47SEric Fiselier            if (sizeof(_Fun) <= sizeof(__buf_) &&
17705f503b47SEric Fiselier                is_nothrow_copy_constructible<_Fp>::value &&
17715f503b47SEric Fiselier                is_nothrow_copy_constructible<_FunAlloc>::value)
17725f7c2db2SMarshall Clow            {
17735f503b47SEric Fiselier                __f_ =
17745f503b47SEric Fiselier                    ::new ((void*)&__buf_) _Fun(_VSTD::move(__f), _Alloc(__af));
17755f7c2db2SMarshall Clow            }
17765f7c2db2SMarshall Clow            else
17775f7c2db2SMarshall Clow            {
17785f503b47SEric Fiselier                typedef __allocator_destructor<_FunAlloc> _Dp;
17795f503b47SEric Fiselier                unique_ptr<__func, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
17805f503b47SEric Fiselier                ::new ((void*)__hold.get()) _Fun(_VSTD::move(__f), _Alloc(__a));
17819b0b6d45SHoward Hinnant                __f_ = __hold.release();
17829b0b6d45SHoward Hinnant            }
17839b0b6d45SHoward Hinnant        }
17849b0b6d45SHoward Hinnant    }
17859b0b6d45SHoward Hinnant
1786d63dd874SEric Fiselier    template <class _Fp,
1787d63dd874SEric Fiselier        class = typename enable_if<!is_same<typename decay<_Fp>::type, __value_func>::value>::type>
1788d63dd874SEric Fiselier    _LIBCPP_INLINE_VISIBILITY explicit __value_func(_Fp&& __f)
1789d63dd874SEric Fiselier        : __value_func(std::forward<_Fp>(__f), allocator<_Fp>()) {}
1790d63dd874SEric Fiselier
17915f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17925f503b47SEric Fiselier    __value_func(const __value_func& __f)
17933e519524SHoward Hinnant    {
17945f503b47SEric Fiselier        if (__f.__f_ == 0)
17955f503b47SEric Fiselier            __f_ = 0;
17965f503b47SEric Fiselier        else if ((void*)__f.__f_ == &__f.__buf_)
17975f503b47SEric Fiselier        {
17985f503b47SEric Fiselier            __f_ = __as_base(&__buf_);
17995f503b47SEric Fiselier            __f.__f_->__clone(__f_);
18005f503b47SEric Fiselier        }
18015f503b47SEric Fiselier        else
18025f503b47SEric Fiselier            __f_ = __f.__f_->__clone();
18033e519524SHoward Hinnant    }
18043e519524SHoward Hinnant
18055f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18065f503b47SEric Fiselier    __value_func(__value_func&& __f) _NOEXCEPT
18075f503b47SEric Fiselier    {
18085f503b47SEric Fiselier        if (__f.__f_ == 0)
18095f503b47SEric Fiselier            __f_ = 0;
18105f503b47SEric Fiselier        else if ((void*)__f.__f_ == &__f.__buf_)
18115f503b47SEric Fiselier        {
18125f503b47SEric Fiselier            __f_ = __as_base(&__buf_);
18135f503b47SEric Fiselier            __f.__f_->__clone(__f_);
18145f503b47SEric Fiselier        }
18155f503b47SEric Fiselier        else
18165f503b47SEric Fiselier        {
18175f503b47SEric Fiselier            __f_ = __f.__f_;
18185f503b47SEric Fiselier            __f.__f_ = 0;
18195f503b47SEric Fiselier        }
18205f503b47SEric Fiselier    }
18215f503b47SEric Fiselier
18225f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18235f503b47SEric Fiselier    ~__value_func()
18245f503b47SEric Fiselier    {
18255f503b47SEric Fiselier        if ((void*)__f_ == &__buf_)
18265f503b47SEric Fiselier            __f_->destroy();
18275f503b47SEric Fiselier        else if (__f_)
18285f503b47SEric Fiselier            __f_->destroy_deallocate();
18295f503b47SEric Fiselier    }
18305f503b47SEric Fiselier
18315f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18325f503b47SEric Fiselier    __value_func& operator=(__value_func&& __f)
18333e519524SHoward Hinnant    {
1834aa208791SVolodymyr Sapsai        *this = nullptr;
18353e519524SHoward Hinnant        if (__f.__f_ == 0)
18363e519524SHoward Hinnant            __f_ = 0;
18373e58a6a7SEvgeniy Stepanov        else if ((void*)__f.__f_ == &__f.__buf_)
18383e519524SHoward Hinnant        {
18393e58a6a7SEvgeniy Stepanov            __f_ = __as_base(&__buf_);
18403e519524SHoward Hinnant            __f.__f_->__clone(__f_);
18413e519524SHoward Hinnant        }
18423e519524SHoward Hinnant        else
18433e519524SHoward Hinnant        {
18443e519524SHoward Hinnant            __f_ = __f.__f_;
18453e519524SHoward Hinnant            __f.__f_ = 0;
18463e519524SHoward Hinnant        }
184788db3171SArgyrios Kyrtzidis        return *this;
18483e519524SHoward Hinnant    }
18493e519524SHoward Hinnant
18505f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18515f503b47SEric Fiselier    __value_func& operator=(nullptr_t)
18523e519524SHoward Hinnant    {
18535f503b47SEric Fiselier        __func* __f = __f_;
18543e519524SHoward Hinnant        __f_ = 0;
18555f503b47SEric Fiselier        if ((void*)__f == &__buf_)
18565f503b47SEric Fiselier            __f->destroy();
18575f503b47SEric Fiselier        else if (__f)
18585f503b47SEric Fiselier            __f->destroy_deallocate();
185988db3171SArgyrios Kyrtzidis        return *this;
18603e519524SHoward Hinnant    }
18613e519524SHoward Hinnant
18625f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18635f503b47SEric Fiselier    _Rp operator()(_ArgTypes&&... __args) const
18643e519524SHoward Hinnant    {
18655f503b47SEric Fiselier        if (__f_ == 0)
18665f503b47SEric Fiselier            __throw_bad_function_call();
18675f503b47SEric Fiselier        return (*__f_)(_VSTD::forward<_ArgTypes>(__args)...);
18683e519524SHoward Hinnant    }
18693e519524SHoward Hinnant
18705f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18715f503b47SEric Fiselier    void swap(__value_func& __f) _NOEXCEPT
18723e519524SHoward Hinnant    {
18735f503b47SEric Fiselier        if (&__f == this)
1874d566c345SEric Fiselier            return;
18753e58a6a7SEvgeniy Stepanov        if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_)
18763e519524SHoward Hinnant        {
18773e519524SHoward Hinnant            typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
18785f503b47SEric Fiselier            __func* __t = __as_base(&__tempbuf);
18793e519524SHoward Hinnant            __f_->__clone(__t);
18803e519524SHoward Hinnant            __f_->destroy();
18813e519524SHoward Hinnant            __f_ = 0;
18823e58a6a7SEvgeniy Stepanov            __f.__f_->__clone(__as_base(&__buf_));
18833e519524SHoward Hinnant            __f.__f_->destroy();
18843e519524SHoward Hinnant            __f.__f_ = 0;
18853e58a6a7SEvgeniy Stepanov            __f_ = __as_base(&__buf_);
18863e58a6a7SEvgeniy Stepanov            __t->__clone(__as_base(&__f.__buf_));
18873e519524SHoward Hinnant            __t->destroy();
18883e58a6a7SEvgeniy Stepanov            __f.__f_ = __as_base(&__f.__buf_);
18893e519524SHoward Hinnant        }
18903e58a6a7SEvgeniy Stepanov        else if ((void*)__f_ == &__buf_)
18913e519524SHoward Hinnant        {
18923e58a6a7SEvgeniy Stepanov            __f_->__clone(__as_base(&__f.__buf_));
18933e519524SHoward Hinnant            __f_->destroy();
18943e519524SHoward Hinnant            __f_ = __f.__f_;
18953e58a6a7SEvgeniy Stepanov            __f.__f_ = __as_base(&__f.__buf_);
18963e519524SHoward Hinnant        }
18973e58a6a7SEvgeniy Stepanov        else if ((void*)__f.__f_ == &__f.__buf_)
18983e519524SHoward Hinnant        {
18993e58a6a7SEvgeniy Stepanov            __f.__f_->__clone(__as_base(&__buf_));
19003e519524SHoward Hinnant            __f.__f_->destroy();
19013e519524SHoward Hinnant            __f.__f_ = __f_;
19023e58a6a7SEvgeniy Stepanov            __f_ = __as_base(&__buf_);
19033e519524SHoward Hinnant        }
19043e519524SHoward Hinnant        else
1905ce48a113SHoward Hinnant            _VSTD::swap(__f_, __f.__f_);
19063e519524SHoward Hinnant    }
19073e519524SHoward Hinnant
19085f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19095f503b47SEric Fiselier    _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { return __f_ != 0; }
19105f503b47SEric Fiselier
19115f503b47SEric Fiselier#ifndef _LIBCPP_NO_RTTI
19125f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19135f503b47SEric Fiselier    const std::type_info& target_type() const _NOEXCEPT
19145f503b47SEric Fiselier    {
19155f503b47SEric Fiselier        if (__f_ == 0)
19165f503b47SEric Fiselier            return typeid(void);
19175f503b47SEric Fiselier        return __f_->target_type();
19185f503b47SEric Fiselier    }
19195f503b47SEric Fiselier
19205f503b47SEric Fiselier    template <typename _Tp>
19215f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
19225f503b47SEric Fiselier    {
19235f503b47SEric Fiselier        if (__f_ == 0)
19245f503b47SEric Fiselier            return 0;
19255f503b47SEric Fiselier        return (const _Tp*)__f_->target(typeid(_Tp));
19265f503b47SEric Fiselier    }
19275f503b47SEric Fiselier#endif // _LIBCPP_NO_RTTI
19285f503b47SEric Fiselier};
19295f503b47SEric Fiselier
193008e231ddSEric Fiselier// Storage for a functor object, to be used with __policy to manage copy and
193108e231ddSEric Fiselier// destruction.
193208e231ddSEric Fiselierunion __policy_storage
193308e231ddSEric Fiselier{
193408e231ddSEric Fiselier    mutable char __small[sizeof(void*) * 2];
193508e231ddSEric Fiselier    void* __large;
193608e231ddSEric Fiselier};
193708e231ddSEric Fiselier
193808e231ddSEric Fiselier// True if _Fun can safely be held in __policy_storage.__small.
193908e231ddSEric Fiseliertemplate <typename _Fun>
194008e231ddSEric Fiselierstruct __use_small_storage
194108e231ddSEric Fiselier    : public _VSTD::integral_constant<
194208e231ddSEric Fiselier          bool, sizeof(_Fun) <= sizeof(__policy_storage) &&
1943d108bf85SEric Fiselier                    _LIBCPP_ALIGNOF(_Fun) <= _LIBCPP_ALIGNOF(__policy_storage) &&
194408e231ddSEric Fiselier                    _VSTD::is_trivially_copy_constructible<_Fun>::value &&
194508e231ddSEric Fiselier                    _VSTD::is_trivially_destructible<_Fun>::value> {};
194608e231ddSEric Fiselier
194708e231ddSEric Fiselier// Policy contains information about how to copy, destroy, and move the
194808e231ddSEric Fiselier// underlying functor. You can think of it as a vtable of sorts.
194908e231ddSEric Fiselierstruct __policy
195008e231ddSEric Fiselier{
195108e231ddSEric Fiselier    // Used to copy or destroy __large values. null for trivial objects.
195208e231ddSEric Fiselier    void* (*const __clone)(const void*);
195308e231ddSEric Fiselier    void (*const __destroy)(void*);
195408e231ddSEric Fiselier
195508e231ddSEric Fiselier    // True if this is the null policy (no value).
195608e231ddSEric Fiselier    const bool __is_null;
195708e231ddSEric Fiselier
195808e231ddSEric Fiselier    // The target type. May be null if RTTI is disabled.
195908e231ddSEric Fiselier    const std::type_info* const __type_info;
196008e231ddSEric Fiselier
196108e231ddSEric Fiselier    // Returns a pointer to a static policy object suitable for the functor
196208e231ddSEric Fiselier    // type.
196308e231ddSEric Fiselier    template <typename _Fun>
196408e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY static const __policy* __create()
196508e231ddSEric Fiselier    {
196608e231ddSEric Fiselier        return __choose_policy<_Fun>(__use_small_storage<_Fun>());
196708e231ddSEric Fiselier    }
196808e231ddSEric Fiselier
196908e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
197008e231ddSEric Fiselier    static const __policy* __create_empty()
197108e231ddSEric Fiselier    {
197208e231ddSEric Fiselier        static const _LIBCPP_CONSTEXPR __policy __policy_ = {nullptr, nullptr,
197308e231ddSEric Fiselier                                                             true,
197408e231ddSEric Fiselier#ifndef _LIBCPP_NO_RTTI
197508e231ddSEric Fiselier                                                             &typeid(void)
197608e231ddSEric Fiselier#else
197708e231ddSEric Fiselier                                                             nullptr
197808e231ddSEric Fiselier#endif
197908e231ddSEric Fiselier        };
198008e231ddSEric Fiselier        return &__policy_;
198108e231ddSEric Fiselier    }
198208e231ddSEric Fiselier
198308e231ddSEric Fiselier  private:
198408e231ddSEric Fiselier    template <typename _Fun> static void* __large_clone(const void* __s)
198508e231ddSEric Fiselier    {
198608e231ddSEric Fiselier        const _Fun* __f = static_cast<const _Fun*>(__s);
198708e231ddSEric Fiselier        return __f->__clone();
198808e231ddSEric Fiselier    }
198908e231ddSEric Fiselier
1990d63dd874SEric Fiselier    template <typename _Fun>
1991d63dd874SEric Fiselier    static void __large_destroy(void* __s) {
1992d63dd874SEric Fiselier      _Fun::__destroy_and_delete(static_cast<_Fun*>(__s));
199308e231ddSEric Fiselier    }
199408e231ddSEric Fiselier
199508e231ddSEric Fiselier    template <typename _Fun>
199608e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY static const __policy*
1997d63dd874SEric Fiselier    __choose_policy(/* is_small = */ false_type) {
199808e231ddSEric Fiselier      static const _LIBCPP_CONSTEXPR __policy __policy_ = {
199908e231ddSEric Fiselier          &__large_clone<_Fun>, &__large_destroy<_Fun>, false,
200008e231ddSEric Fiselier#ifndef _LIBCPP_NO_RTTI
200108e231ddSEric Fiselier          &typeid(typename _Fun::_Target)
200208e231ddSEric Fiselier#else
200308e231ddSEric Fiselier          nullptr
200408e231ddSEric Fiselier#endif
200508e231ddSEric Fiselier      };
200608e231ddSEric Fiselier        return &__policy_;
200708e231ddSEric Fiselier    }
200808e231ddSEric Fiselier
200908e231ddSEric Fiselier    template <typename _Fun>
201008e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY static const __policy*
201108e231ddSEric Fiselier        __choose_policy(/* is_small = */ true_type)
201208e231ddSEric Fiselier    {
201308e231ddSEric Fiselier        static const _LIBCPP_CONSTEXPR __policy __policy_ = {
201408e231ddSEric Fiselier            nullptr, nullptr, false,
201508e231ddSEric Fiselier#ifndef _LIBCPP_NO_RTTI
201608e231ddSEric Fiselier            &typeid(typename _Fun::_Target)
201708e231ddSEric Fiselier#else
201808e231ddSEric Fiselier            nullptr
201908e231ddSEric Fiselier#endif
202008e231ddSEric Fiselier        };
202108e231ddSEric Fiselier        return &__policy_;
202208e231ddSEric Fiselier    }
202308e231ddSEric Fiselier};
202408e231ddSEric Fiselier
202508e231ddSEric Fiselier// Used to choose between perfect forwarding or pass-by-value. Pass-by-value is
202608e231ddSEric Fiselier// faster for types that can be passed in registers.
202708e231ddSEric Fiseliertemplate <typename _Tp>
202808e231ddSEric Fiselierusing __fast_forward =
202908e231ddSEric Fiselier    typename _VSTD::conditional<_VSTD::is_scalar<_Tp>::value, _Tp, _Tp&&>::type;
203008e231ddSEric Fiselier
203108e231ddSEric Fiselier// __policy_invoker calls an instance of __alloc_func held in __policy_storage.
203208e231ddSEric Fiselier
203308e231ddSEric Fiseliertemplate <class _Fp> struct __policy_invoker;
203408e231ddSEric Fiselier
203508e231ddSEric Fiseliertemplate <class _Rp, class... _ArgTypes>
203608e231ddSEric Fiselierstruct __policy_invoker<_Rp(_ArgTypes...)>
203708e231ddSEric Fiselier{
203808e231ddSEric Fiselier    typedef _Rp (*__Call)(const __policy_storage*,
203908e231ddSEric Fiselier                          __fast_forward<_ArgTypes>...);
204008e231ddSEric Fiselier
204108e231ddSEric Fiselier    __Call __call_;
204208e231ddSEric Fiselier
204308e231ddSEric Fiselier    // Creates an invoker that throws bad_function_call.
204408e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
204508e231ddSEric Fiselier    __policy_invoker() : __call_(&__call_empty) {}
204608e231ddSEric Fiselier
204708e231ddSEric Fiselier    // Creates an invoker that calls the given instance of __func.
204808e231ddSEric Fiselier    template <typename _Fun>
204908e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY static __policy_invoker __create()
205008e231ddSEric Fiselier    {
205108e231ddSEric Fiselier        return __policy_invoker(&__call_impl<_Fun>);
205208e231ddSEric Fiselier    }
205308e231ddSEric Fiselier
205408e231ddSEric Fiselier  private:
205508e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
205608e231ddSEric Fiselier    explicit __policy_invoker(__Call __c) : __call_(__c) {}
205708e231ddSEric Fiselier
205808e231ddSEric Fiselier    static _Rp __call_empty(const __policy_storage*,
205908e231ddSEric Fiselier                            __fast_forward<_ArgTypes>...)
206008e231ddSEric Fiselier    {
206108e231ddSEric Fiselier        __throw_bad_function_call();
206208e231ddSEric Fiselier    }
206308e231ddSEric Fiselier
206408e231ddSEric Fiselier    template <typename _Fun>
206508e231ddSEric Fiselier    static _Rp __call_impl(const __policy_storage* __buf,
206608e231ddSEric Fiselier                           __fast_forward<_ArgTypes>... __args)
206708e231ddSEric Fiselier    {
206808e231ddSEric Fiselier        _Fun* __f = reinterpret_cast<_Fun*>(__use_small_storage<_Fun>::value
206908e231ddSEric Fiselier                                                ? &__buf->__small
207008e231ddSEric Fiselier                                                : __buf->__large);
207108e231ddSEric Fiselier        return (*__f)(_VSTD::forward<_ArgTypes>(__args)...);
207208e231ddSEric Fiselier    }
207308e231ddSEric Fiselier};
207408e231ddSEric Fiselier
207508e231ddSEric Fiselier// __policy_func uses a __policy and __policy_invoker to create a type-erased,
207608e231ddSEric Fiselier// copyable functor.
207708e231ddSEric Fiselier
207808e231ddSEric Fiseliertemplate <class _Fp> class __policy_func;
207908e231ddSEric Fiselier
208008e231ddSEric Fiseliertemplate <class _Rp, class... _ArgTypes> class __policy_func<_Rp(_ArgTypes...)>
208108e231ddSEric Fiselier{
208208e231ddSEric Fiselier    // Inline storage for small objects.
208308e231ddSEric Fiselier    __policy_storage __buf_;
208408e231ddSEric Fiselier
208508e231ddSEric Fiselier    // Calls the value stored in __buf_. This could technically be part of
208608e231ddSEric Fiselier    // policy, but storing it here eliminates a level of indirection inside
208708e231ddSEric Fiselier    // operator().
208808e231ddSEric Fiselier    typedef __function::__policy_invoker<_Rp(_ArgTypes...)> __invoker;
208908e231ddSEric Fiselier    __invoker __invoker_;
209008e231ddSEric Fiselier
209108e231ddSEric Fiselier    // The policy that describes how to move / copy / destroy __buf_. Never
209208e231ddSEric Fiselier    // null, even if the function is empty.
209308e231ddSEric Fiselier    const __policy* __policy_;
209408e231ddSEric Fiselier
209508e231ddSEric Fiselier  public:
209608e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
209708e231ddSEric Fiselier    __policy_func() : __policy_(__policy::__create_empty()) {}
209808e231ddSEric Fiselier
209908e231ddSEric Fiselier    template <class _Fp, class _Alloc>
210008e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY __policy_func(_Fp&& __f, const _Alloc& __a)
210108e231ddSEric Fiselier        : __policy_(__policy::__create_empty())
210208e231ddSEric Fiselier    {
210308e231ddSEric Fiselier        typedef __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
210408e231ddSEric Fiselier        typedef allocator_traits<_Alloc> __alloc_traits;
210508e231ddSEric Fiselier        typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
210608e231ddSEric Fiselier            _FunAlloc;
210708e231ddSEric Fiselier
210808e231ddSEric Fiselier        if (__function::__not_null(__f))
210908e231ddSEric Fiselier        {
211008e231ddSEric Fiselier            __invoker_ = __invoker::template __create<_Fun>();
211108e231ddSEric Fiselier            __policy_ = __policy::__create<_Fun>();
211208e231ddSEric Fiselier
211308e231ddSEric Fiselier            _FunAlloc __af(__a);
211408e231ddSEric Fiselier            if (__use_small_storage<_Fun>())
211508e231ddSEric Fiselier            {
211608e231ddSEric Fiselier                ::new ((void*)&__buf_.__small)
211708e231ddSEric Fiselier                    _Fun(_VSTD::move(__f), _Alloc(__af));
211808e231ddSEric Fiselier            }
211908e231ddSEric Fiselier            else
212008e231ddSEric Fiselier            {
212108e231ddSEric Fiselier                typedef __allocator_destructor<_FunAlloc> _Dp;
212208e231ddSEric Fiselier                unique_ptr<_Fun, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
212308e231ddSEric Fiselier                ::new ((void*)__hold.get())
212408e231ddSEric Fiselier                    _Fun(_VSTD::move(__f), _Alloc(__af));
212508e231ddSEric Fiselier                __buf_.__large = __hold.release();
212608e231ddSEric Fiselier            }
212708e231ddSEric Fiselier        }
212808e231ddSEric Fiselier    }
212908e231ddSEric Fiselier
2130d63dd874SEric Fiselier    template <class _Fp, class = typename enable_if<!is_same<typename decay<_Fp>::type, __policy_func>::value>::type>
2131d63dd874SEric Fiselier    _LIBCPP_INLINE_VISIBILITY explicit __policy_func(_Fp&& __f)
2132d63dd874SEric Fiselier        : __policy_(__policy::__create_empty()) {
2133d63dd874SEric Fiselier      typedef __default_alloc_func<_Fp, _Rp(_ArgTypes...)> _Fun;
2134d63dd874SEric Fiselier
2135d63dd874SEric Fiselier      if (__function::__not_null(__f)) {
2136d63dd874SEric Fiselier        __invoker_ = __invoker::template __create<_Fun>();
2137d63dd874SEric Fiselier        __policy_ = __policy::__create<_Fun>();
2138d63dd874SEric Fiselier        if (__use_small_storage<_Fun>()) {
2139d63dd874SEric Fiselier          ::new ((void*)&__buf_.__small) _Fun(_VSTD::move(__f));
2140d63dd874SEric Fiselier        } else {
2141d63dd874SEric Fiselier          __builtin_new_allocator::__holder_t __hold =
2142d63dd874SEric Fiselier              __builtin_new_allocator::__allocate_type<_Fun>(1);
2143d63dd874SEric Fiselier          __buf_.__large = ::new (__hold.get()) _Fun(_VSTD::move(__f));
2144d63dd874SEric Fiselier          (void)__hold.release();
2145d63dd874SEric Fiselier        }
2146d63dd874SEric Fiselier      }
2147d63dd874SEric Fiselier    }
2148d63dd874SEric Fiselier
214908e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
215008e231ddSEric Fiselier    __policy_func(const __policy_func& __f)
215108e231ddSEric Fiselier        : __buf_(__f.__buf_), __invoker_(__f.__invoker_),
215208e231ddSEric Fiselier          __policy_(__f.__policy_)
215308e231ddSEric Fiselier    {
215408e231ddSEric Fiselier        if (__policy_->__clone)
215508e231ddSEric Fiselier            __buf_.__large = __policy_->__clone(__f.__buf_.__large);
215608e231ddSEric Fiselier    }
215708e231ddSEric Fiselier
215808e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
215908e231ddSEric Fiselier    __policy_func(__policy_func&& __f)
216008e231ddSEric Fiselier        : __buf_(__f.__buf_), __invoker_(__f.__invoker_),
216108e231ddSEric Fiselier          __policy_(__f.__policy_)
216208e231ddSEric Fiselier    {
216308e231ddSEric Fiselier        if (__policy_->__destroy)
216408e231ddSEric Fiselier        {
216508e231ddSEric Fiselier            __f.__policy_ = __policy::__create_empty();
216608e231ddSEric Fiselier            __f.__invoker_ = __invoker();
216708e231ddSEric Fiselier        }
216808e231ddSEric Fiselier    }
216908e231ddSEric Fiselier
217008e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
217108e231ddSEric Fiselier    ~__policy_func()
217208e231ddSEric Fiselier    {
217308e231ddSEric Fiselier        if (__policy_->__destroy)
217408e231ddSEric Fiselier            __policy_->__destroy(__buf_.__large);
217508e231ddSEric Fiselier    }
217608e231ddSEric Fiselier
217708e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
217808e231ddSEric Fiselier    __policy_func& operator=(__policy_func&& __f)
217908e231ddSEric Fiselier    {
218008e231ddSEric Fiselier        *this = nullptr;
218108e231ddSEric Fiselier        __buf_ = __f.__buf_;
218208e231ddSEric Fiselier        __invoker_ = __f.__invoker_;
218308e231ddSEric Fiselier        __policy_ = __f.__policy_;
218408e231ddSEric Fiselier        __f.__policy_ = __policy::__create_empty();
218508e231ddSEric Fiselier        __f.__invoker_ = __invoker();
218608e231ddSEric Fiselier        return *this;
218708e231ddSEric Fiselier    }
218808e231ddSEric Fiselier
218908e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
219008e231ddSEric Fiselier    __policy_func& operator=(nullptr_t)
219108e231ddSEric Fiselier    {
219208e231ddSEric Fiselier        const __policy* __p = __policy_;
219308e231ddSEric Fiselier        __policy_ = __policy::__create_empty();
219408e231ddSEric Fiselier        __invoker_ = __invoker();
219508e231ddSEric Fiselier        if (__p->__destroy)
219608e231ddSEric Fiselier            __p->__destroy(__buf_.__large);
219708e231ddSEric Fiselier        return *this;
219808e231ddSEric Fiselier    }
219908e231ddSEric Fiselier
220008e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
220108e231ddSEric Fiselier    _Rp operator()(_ArgTypes&&... __args) const
220208e231ddSEric Fiselier    {
220308e231ddSEric Fiselier        return __invoker_.__call_(_VSTD::addressof(__buf_),
220408e231ddSEric Fiselier                                  _VSTD::forward<_ArgTypes>(__args)...);
220508e231ddSEric Fiselier    }
220608e231ddSEric Fiselier
220708e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
220808e231ddSEric Fiselier    void swap(__policy_func& __f)
220908e231ddSEric Fiselier    {
221008e231ddSEric Fiselier        _VSTD::swap(__invoker_, __f.__invoker_);
221108e231ddSEric Fiselier        _VSTD::swap(__policy_, __f.__policy_);
221208e231ddSEric Fiselier        _VSTD::swap(__buf_, __f.__buf_);
221308e231ddSEric Fiselier    }
221408e231ddSEric Fiselier
221508e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
221608e231ddSEric Fiselier    explicit operator bool() const _NOEXCEPT
221708e231ddSEric Fiselier    {
221808e231ddSEric Fiselier        return !__policy_->__is_null;
221908e231ddSEric Fiselier    }
222008e231ddSEric Fiselier
222108e231ddSEric Fiselier#ifndef _LIBCPP_NO_RTTI
222208e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
222308e231ddSEric Fiselier    const std::type_info& target_type() const _NOEXCEPT
222408e231ddSEric Fiselier    {
222508e231ddSEric Fiselier        return *__policy_->__type_info;
222608e231ddSEric Fiselier    }
222708e231ddSEric Fiselier
222808e231ddSEric Fiselier    template <typename _Tp>
222908e231ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
223008e231ddSEric Fiselier    {
223108e231ddSEric Fiselier        if (__policy_->__is_null || typeid(_Tp) != *__policy_->__type_info)
223208e231ddSEric Fiselier            return nullptr;
223308e231ddSEric Fiselier        if (__policy_->__clone) // Out of line storage.
223408e231ddSEric Fiselier            return reinterpret_cast<const _Tp*>(__buf_.__large);
223508e231ddSEric Fiselier        else
223608e231ddSEric Fiselier            return reinterpret_cast<const _Tp*>(&__buf_.__small);
223708e231ddSEric Fiselier    }
223808e231ddSEric Fiselier#endif // _LIBCPP_NO_RTTI
223908e231ddSEric Fiselier};
224008e231ddSEric Fiselier
22415f503b47SEric Fiselier}  // __function
22425f503b47SEric Fiselier
22435f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
22445f503b47SEric Fiselierclass _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>
22455f503b47SEric Fiselier    : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,
22465f503b47SEric Fiselier      public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>
22475f503b47SEric Fiselier{
224808e231ddSEric Fiselier#ifndef _LIBCPP_ABI_OPTIMIZED_FUNCTION
22495f503b47SEric Fiselier    typedef __function::__value_func<_Rp(_ArgTypes...)> __func;
225008e231ddSEric Fiselier#else
225108e231ddSEric Fiselier    typedef __function::__policy_func<_Rp(_ArgTypes...)> __func;
225208e231ddSEric Fiselier#endif
22535f503b47SEric Fiselier
22545f503b47SEric Fiselier    __func __f_;
22555f503b47SEric Fiselier
22563359a17bSEric Fiselier    template <class _Fp, bool = _And<
22573359a17bSEric Fiselier        _IsNotSame<__uncvref_t<_Fp>, function>,
22585f503b47SEric Fiselier        __invokable<_Fp&, _ArgTypes...>
22595f503b47SEric Fiselier    >::value>
22605f503b47SEric Fiselier    struct __callable;
22615f503b47SEric Fiselier    template <class _Fp>
22625f503b47SEric Fiselier        struct __callable<_Fp, true>
22635f503b47SEric Fiselier        {
22645f503b47SEric Fiselier            static const bool value = is_same<void, _Rp>::value ||
22655f503b47SEric Fiselier                is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type,
22665f503b47SEric Fiselier                               _Rp>::value;
22675f503b47SEric Fiselier        };
22685f503b47SEric Fiselier    template <class _Fp>
22695f503b47SEric Fiselier        struct __callable<_Fp, false>
22705f503b47SEric Fiselier        {
22715f503b47SEric Fiselier            static const bool value = false;
22725f503b47SEric Fiselier        };
22735f503b47SEric Fiselier
22745f503b47SEric Fiselier  template <class _Fp>
22755f503b47SEric Fiselier  using _EnableIfCallable = typename enable_if<__callable<_Fp>::value>::type;
22765f503b47SEric Fiselierpublic:
22775f503b47SEric Fiselier    typedef _Rp result_type;
22785f503b47SEric Fiselier
22795f503b47SEric Fiselier    // construct/copy/destroy:
22805f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
22815f503b47SEric Fiselier    function() _NOEXCEPT { }
22825f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
22835f503b47SEric Fiselier    function(nullptr_t) _NOEXCEPT {}
22845f503b47SEric Fiselier    function(const function&);
22855f503b47SEric Fiselier    function(function&&) _NOEXCEPT;
22865f503b47SEric Fiselier    template<class _Fp, class = _EnableIfCallable<_Fp>>
22875f503b47SEric Fiselier    function(_Fp);
22885f503b47SEric Fiselier
22895f503b47SEric Fiselier#if _LIBCPP_STD_VER <= 14
22905f503b47SEric Fiselier    template<class _Alloc>
22915f503b47SEric Fiselier      _LIBCPP_INLINE_VISIBILITY
22925f503b47SEric Fiselier      function(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
22935f503b47SEric Fiselier    template<class _Alloc>
22945f503b47SEric Fiselier      _LIBCPP_INLINE_VISIBILITY
22955f503b47SEric Fiselier      function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT {}
22965f503b47SEric Fiselier    template<class _Alloc>
22975f503b47SEric Fiselier      function(allocator_arg_t, const _Alloc&, const function&);
22985f503b47SEric Fiselier    template<class _Alloc>
22995f503b47SEric Fiselier      function(allocator_arg_t, const _Alloc&, function&&);
23005f503b47SEric Fiselier    template<class _Fp, class _Alloc, class = _EnableIfCallable<_Fp>>
23015f503b47SEric Fiselier      function(allocator_arg_t, const _Alloc& __a, _Fp __f);
23025f503b47SEric Fiselier#endif
23035f503b47SEric Fiselier
23045f503b47SEric Fiselier    function& operator=(const function&);
23055f503b47SEric Fiselier    function& operator=(function&&) _NOEXCEPT;
23065f503b47SEric Fiselier    function& operator=(nullptr_t) _NOEXCEPT;
23075f503b47SEric Fiselier    template<class _Fp, class = _EnableIfCallable<_Fp>>
23085f503b47SEric Fiselier    function& operator=(_Fp&&);
23095f503b47SEric Fiselier
23105f503b47SEric Fiselier    ~function();
23115f503b47SEric Fiselier
23125f503b47SEric Fiselier    // function modifiers:
23135f503b47SEric Fiselier    void swap(function&) _NOEXCEPT;
23145f503b47SEric Fiselier
23155f503b47SEric Fiselier#if _LIBCPP_STD_VER <= 14
23165f503b47SEric Fiselier    template<class _Fp, class _Alloc>
23175f503b47SEric Fiselier      _LIBCPP_INLINE_VISIBILITY
23185f503b47SEric Fiselier      void assign(_Fp&& __f, const _Alloc& __a)
23195f503b47SEric Fiselier        {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
23205f503b47SEric Fiselier#endif
23215f503b47SEric Fiselier
23225f503b47SEric Fiselier    // function capacity:
23235f503b47SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
23245f503b47SEric Fiselier    _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
23255f503b47SEric Fiselier      return static_cast<bool>(__f_);
23265f503b47SEric Fiselier    }
23275f503b47SEric Fiselier
23285f503b47SEric Fiselier    // deleted overloads close possible hole in the type system
23295f503b47SEric Fiselier    template<class _R2, class... _ArgTypes2>
23305f503b47SEric Fiselier      bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;
23315f503b47SEric Fiselier    template<class _R2, class... _ArgTypes2>
23325f503b47SEric Fiselier      bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;
23335f503b47SEric Fiselierpublic:
23345f503b47SEric Fiselier    // function invocation:
23355f503b47SEric Fiselier    _Rp operator()(_ArgTypes...) const;
23365f503b47SEric Fiselier
23375f503b47SEric Fiselier#ifndef _LIBCPP_NO_RTTI
23385f503b47SEric Fiselier    // function target access:
23395f503b47SEric Fiselier    const std::type_info& target_type() const _NOEXCEPT;
23405f503b47SEric Fiselier    template <typename _Tp> _Tp* target() _NOEXCEPT;
23415f503b47SEric Fiselier    template <typename _Tp> const _Tp* target() const _NOEXCEPT;
23425f503b47SEric Fiselier#endif  // _LIBCPP_NO_RTTI
23435f503b47SEric Fiselier};
23445f503b47SEric Fiselier
2345*e1eabcdfSLouis Dionne#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
2346*e1eabcdfSLouis Dionnetemplate<class _Rp, class ..._Ap>
2347*e1eabcdfSLouis Dionnefunction(_Rp(*)(_Ap...)) -> function<_Rp(_Ap...)>;
2348*e1eabcdfSLouis Dionne
2349*e1eabcdfSLouis Dionnetemplate<class _Fp>
2350*e1eabcdfSLouis Dionnestruct __strip_signature;
2351*e1eabcdfSLouis Dionne
2352*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2353*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...)> { using type = _Rp(_Ap...); };
2354*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2355*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const> { using type = _Rp(_Ap...); };
2356*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2357*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile> { using type = _Rp(_Ap...); };
2358*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2359*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile> { using type = _Rp(_Ap...); };
2360*e1eabcdfSLouis Dionne
2361*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2362*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) &> { using type = _Rp(_Ap...); };
2363*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2364*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const &> { using type = _Rp(_Ap...); };
2365*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2366*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile &> { using type = _Rp(_Ap...); };
2367*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2368*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile &> { using type = _Rp(_Ap...); };
2369*e1eabcdfSLouis Dionne
2370*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2371*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) noexcept> { using type = _Rp(_Ap...); };
2372*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2373*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const noexcept> { using type = _Rp(_Ap...); };
2374*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2375*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile noexcept> { using type = _Rp(_Ap...); };
2376*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2377*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile noexcept> { using type = _Rp(_Ap...); };
2378*e1eabcdfSLouis Dionne
2379*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2380*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) & noexcept> { using type = _Rp(_Ap...); };
2381*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2382*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const & noexcept> { using type = _Rp(_Ap...); };
2383*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2384*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile & noexcept> { using type = _Rp(_Ap...); };
2385*e1eabcdfSLouis Dionnetemplate<class _Rp, class _Gp, class ..._Ap>
2386*e1eabcdfSLouis Dionnestruct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile & noexcept> { using type = _Rp(_Ap...); };
2387*e1eabcdfSLouis Dionne
2388*e1eabcdfSLouis Dionnetemplate<class _Fp, class _Stripped = typename __strip_signature<decltype(&_Fp::operator())>::type>
2389*e1eabcdfSLouis Dionnefunction(_Fp) -> function<_Stripped>;
2390*e1eabcdfSLouis Dionne#endif // !_LIBCPP_HAS_NO_DEDUCTION_GUIDES
2391*e1eabcdfSLouis Dionne
23925f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
23935f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::function(const function& __f) : __f_(__f.__f_) {}
23945f503b47SEric Fiselier
23955f503b47SEric Fiselier#if _LIBCPP_STD_VER <= 14
23965f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
23975f503b47SEric Fiseliertemplate <class _Alloc>
23985f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
23995f503b47SEric Fiselier                                     const function& __f) : __f_(__f.__f_) {}
24005f503b47SEric Fiselier#endif
24015f503b47SEric Fiselier
24025f503b47SEric Fiseliertemplate <class _Rp, class... _ArgTypes>
24035f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
24045f503b47SEric Fiselier    : __f_(_VSTD::move(__f.__f_)) {}
24055f503b47SEric Fiselier
24065f503b47SEric Fiselier#if _LIBCPP_STD_VER <= 14
24075f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
24085f503b47SEric Fiseliertemplate <class _Alloc>
24095f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
24105f503b47SEric Fiselier                                      function&& __f)
24115f503b47SEric Fiselier    : __f_(_VSTD::move(__f.__f_)) {}
24125f503b47SEric Fiselier#endif
24135f503b47SEric Fiselier
24145f503b47SEric Fiseliertemplate <class _Rp, class... _ArgTypes>
24155f503b47SEric Fiseliertemplate <class _Fp, class>
2416d63dd874SEric Fiselierfunction<_Rp(_ArgTypes...)>::function(_Fp __f) : __f_(_VSTD::move(__f)) {}
24175f503b47SEric Fiselier
24185f503b47SEric Fiselier#if _LIBCPP_STD_VER <= 14
24195f503b47SEric Fiseliertemplate <class _Rp, class... _ArgTypes>
24205f503b47SEric Fiseliertemplate <class _Fp, class _Alloc, class>
24215f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a,
24225f503b47SEric Fiselier                                      _Fp __f)
24235f503b47SEric Fiselier    : __f_(_VSTD::move(__f), __a) {}
24245f503b47SEric Fiselier#endif
24255f503b47SEric Fiselier
24265f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
24275f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>&
24285f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::operator=(const function& __f)
24295f503b47SEric Fiselier{
24305f503b47SEric Fiselier    function(__f).swap(*this);
24315f503b47SEric Fiselier    return *this;
24325f503b47SEric Fiselier}
24335f503b47SEric Fiselier
24345f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
24355f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>&
24365f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
24375f503b47SEric Fiselier{
24385f503b47SEric Fiselier    __f_ = std::move(__f.__f_);
24395f503b47SEric Fiselier    return *this;
24405f503b47SEric Fiselier}
24415f503b47SEric Fiselier
24425f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
24435f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>&
24445f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
24455f503b47SEric Fiselier{
24465f503b47SEric Fiselier    __f_ = nullptr;
24475f503b47SEric Fiselier    return *this;
24485f503b47SEric Fiselier}
24495f503b47SEric Fiselier
24505f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
24515f503b47SEric Fiseliertemplate <class _Fp, class>
24525f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>&
24535f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
24545f503b47SEric Fiselier{
24555f503b47SEric Fiselier    function(_VSTD::forward<_Fp>(__f)).swap(*this);
24565f503b47SEric Fiselier    return *this;
24575f503b47SEric Fiselier}
24585f503b47SEric Fiselier
24595f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
24605f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::~function() {}
24615f503b47SEric Fiselier
24625f503b47SEric Fiseliertemplate<class _Rp, class ..._ArgTypes>
24635f503b47SEric Fiseliervoid
24645f503b47SEric Fiselierfunction<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
24655f503b47SEric Fiselier{
24665f503b47SEric Fiselier    __f_.swap(__f.__f_);
24675f503b47SEric Fiselier}
24685f503b47SEric Fiselier
2469c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
2470c003db1fSHoward Hinnant_Rp
2471c003db1fSHoward Hinnantfunction<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
24723e519524SHoward Hinnant{
24735f503b47SEric Fiselier    return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
24743e519524SHoward Hinnant}
24753e519524SHoward Hinnant
247654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
247754b409fdSHoward Hinnant
2478c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
24793e519524SHoward Hinnantconst std::type_info&
2480c003db1fSHoward Hinnantfunction<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
24813e519524SHoward Hinnant{
24825f503b47SEric Fiselier    return __f_.target_type();
24833e519524SHoward Hinnant}
24843e519524SHoward Hinnant
2485c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
2486c003db1fSHoward Hinnanttemplate <typename _Tp>
2487c003db1fSHoward Hinnant_Tp*
2488c003db1fSHoward Hinnantfunction<_Rp(_ArgTypes...)>::target() _NOEXCEPT
24893e519524SHoward Hinnant{
24905f503b47SEric Fiselier    return (_Tp*)(__f_.template target<_Tp>());
24913e519524SHoward Hinnant}
24923e519524SHoward Hinnant
2493c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
2494c003db1fSHoward Hinnanttemplate <typename _Tp>
2495c003db1fSHoward Hinnantconst _Tp*
2496c003db1fSHoward Hinnantfunction<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
24973e519524SHoward Hinnant{
24985f503b47SEric Fiselier    return __f_.template target<_Tp>();
24993e519524SHoward Hinnant}
25003e519524SHoward Hinnant
2501b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
250254b409fdSHoward Hinnant
2503c003db1fSHoward Hinnanttemplate <class _Rp, class... _ArgTypes>
25043e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25053e519524SHoward Hinnantbool
2506c003db1fSHoward Hinnantoperator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
25073e519524SHoward Hinnant
2508c003db1fSHoward Hinnanttemplate <class _Rp, class... _ArgTypes>
25093e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25103e519524SHoward Hinnantbool
2511c003db1fSHoward Hinnantoperator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
25123e519524SHoward Hinnant
2513c003db1fSHoward Hinnanttemplate <class _Rp, class... _ArgTypes>
25143e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25153e519524SHoward Hinnantbool
2516c003db1fSHoward Hinnantoperator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
25173e519524SHoward Hinnant
2518c003db1fSHoward Hinnanttemplate <class _Rp, class... _ArgTypes>
25193e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25203e519524SHoward Hinnantbool
2521c003db1fSHoward Hinnantoperator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
25223e519524SHoward Hinnant
2523c003db1fSHoward Hinnanttemplate <class _Rp, class... _ArgTypes>
25243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25253e519524SHoward Hinnantvoid
2526c003db1fSHoward Hinnantswap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
25273e519524SHoward Hinnant{return __x.swap(__y);}
25283e519524SHoward Hinnant
25297e23afcbSEric Fiselier#else // _LIBCPP_CXX03_LANG
253000f512ebSEric Fiselier
253100f512ebSEric Fiselier#include <__functional_03>
253200f512ebSEric Fiselier
253300f512ebSEric Fiselier#endif
2534e5407178SEric Fiselier
2535e5407178SEric Fiselier////////////////////////////////////////////////////////////////////////////////
2536e5407178SEric Fiselier//                                  BIND
2537e5407178SEric Fiselier//==============================================================================
2538e5407178SEric Fiselier
25393e519524SHoward Hinnanttemplate<class _Tp> struct __is_bind_expression : public false_type {};
2540e2f2d1edSEric Fiseliertemplate<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_bind_expression
25413e519524SHoward Hinnant    : public __is_bind_expression<typename remove_cv<_Tp>::type> {};
25423e519524SHoward Hinnant
2543a48055ceSMarshall Clow#if _LIBCPP_STD_VER > 14
2544a48055ceSMarshall Clowtemplate <class _Tp>
254540a01d53SMarshall Clow_LIBCPP_INLINE_VAR constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value;
2546a48055ceSMarshall Clow#endif
2547a48055ceSMarshall Clow
25483e519524SHoward Hinnanttemplate<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
2549e2f2d1edSEric Fiseliertemplate<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_placeholder
25503e519524SHoward Hinnant    : public __is_placeholder<typename remove_cv<_Tp>::type> {};
25513e519524SHoward Hinnant
2552a48055ceSMarshall Clow#if _LIBCPP_STD_VER > 14
2553a48055ceSMarshall Clowtemplate <class _Tp>
255440a01d53SMarshall Clow_LIBCPP_INLINE_VAR constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value;
2555a48055ceSMarshall Clow#endif
2556a48055ceSMarshall Clow
25573e519524SHoward Hinnantnamespace placeholders
25583e519524SHoward Hinnant{
25593e519524SHoward Hinnant
2560c003db1fSHoward Hinnanttemplate <int _Np> struct __ph {};
25613e519524SHoward Hinnant
2562c8e84ff2SLouis Dionne#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
256355533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<1>   _1;
256455533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<2>   _2;
256555533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<3>   _3;
256655533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<4>   _4;
256755533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<5>   _5;
256855533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<6>   _6;
256955533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<7>   _7;
257055533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<8>   _8;
257155533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<9>   _9;
257255533071SEric Fiselier_LIBCPP_FUNC_VIS extern const __ph<10> _10;
257355533071SEric Fiselier#else
2574a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<1>   _1{};
2575a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<2>   _2{};
2576a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<3>   _3{};
2577a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<4>   _4{};
2578a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<5>   _5{};
2579a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<6>   _6{};
2580a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<7>   _7{};
2581a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<8>   _8{};
2582a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<9>   _9{};
2583a911f39dSMarshall Clow/* _LIBCPP_INLINE_VAR */ constexpr __ph<10> _10{};
2584c8e84ff2SLouis Dionne#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
25853e519524SHoward Hinnant
25863e519524SHoward Hinnant}  // placeholders
25873e519524SHoward Hinnant
2588c003db1fSHoward Hinnanttemplate<int _Np>
2589c003db1fSHoward Hinnantstruct __is_placeholder<placeholders::__ph<_Np> >
2590c003db1fSHoward Hinnant    : public integral_constant<int, _Np> {};
25913e519524SHoward Hinnant
2592e5407178SEric Fiselier
25937e23afcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2594e5407178SEric Fiselier
25953e519524SHoward Hinnanttemplate <class _Tp, class _Uj>
25963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25973e519524SHoward Hinnant_Tp&
25983e519524SHoward Hinnant__mu(reference_wrapper<_Tp> __t, _Uj&)
25993e519524SHoward Hinnant{
26003e519524SHoward Hinnant    return __t.get();
26013e519524SHoward Hinnant}
26023e519524SHoward Hinnant
26033e519524SHoward Hinnanttemplate <class _Ti, class ..._Uj, size_t ..._Indx>
26043e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
26052344d6c1SHoward Hinnanttypename __invoke_of<_Ti&, _Uj...>::type
26062344d6c1SHoward Hinnant__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>)
26073e519524SHoward Hinnant{
2608f9af6140SMarshall Clow    return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...);
26093e519524SHoward Hinnant}
26103e519524SHoward Hinnant
26113e519524SHoward Hinnanttemplate <class _Ti, class ..._Uj>
26123e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
26133359a17bSEric Fiseliertypename _EnableIf
26143e519524SHoward Hinnant<
26153e519524SHoward Hinnant    is_bind_expression<_Ti>::value,
2616279663c1SEric Fiselier    __invoke_of<_Ti&, _Uj...>
26173e519524SHoward Hinnant>::type
26183e519524SHoward Hinnant__mu(_Ti& __ti, tuple<_Uj...>& __uj)
26193e519524SHoward Hinnant{
26203e519524SHoward Hinnant    typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
26213e519524SHoward Hinnant    return  __mu_expand(__ti, __uj, __indices());
26223e519524SHoward Hinnant}
26233e519524SHoward Hinnant
26243e519524SHoward Hinnanttemplate <bool IsPh, class _Ti, class _Uj>
26253e519524SHoward Hinnantstruct __mu_return2 {};
26263e519524SHoward Hinnant
26273e519524SHoward Hinnanttemplate <class _Ti, class _Uj>
26283e519524SHoward Hinnantstruct __mu_return2<true, _Ti, _Uj>
26293e519524SHoward Hinnant{
26303e519524SHoward Hinnant    typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type;
26313e519524SHoward Hinnant};
26323e519524SHoward Hinnant
26333e519524SHoward Hinnanttemplate <class _Ti, class _Uj>
26343e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
26353e519524SHoward Hinnanttypename enable_if
26363e519524SHoward Hinnant<
26373e519524SHoward Hinnant    0 < is_placeholder<_Ti>::value,
26383e519524SHoward Hinnant    typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type
26393e519524SHoward Hinnant>::type
26403e519524SHoward Hinnant__mu(_Ti&, _Uj& __uj)
26413e519524SHoward Hinnant{
26423e519524SHoward Hinnant    const size_t _Indx = is_placeholder<_Ti>::value - 1;
2643f9af6140SMarshall Clow    return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj));
26443e519524SHoward Hinnant}
26453e519524SHoward Hinnant
26463e519524SHoward Hinnanttemplate <class _Ti, class _Uj>
26473e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
26483e519524SHoward Hinnanttypename enable_if
26493e519524SHoward Hinnant<
26503e519524SHoward Hinnant    !is_bind_expression<_Ti>::value &&
26513e519524SHoward Hinnant    is_placeholder<_Ti>::value == 0 &&
26523e519524SHoward Hinnant    !__is_reference_wrapper<_Ti>::value,
26533e519524SHoward Hinnant    _Ti&
26543e519524SHoward Hinnant>::type
2655c206366fSHoward Hinnant__mu(_Ti& __ti, _Uj&)
26563e519524SHoward Hinnant{
26573e519524SHoward Hinnant    return __ti;
26583e519524SHoward Hinnant}
26593e519524SHoward Hinnant
26602fa07ae9SHoward Hinnanttemplate <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
26612fa07ae9SHoward Hinnant          class _TupleUj>
26620805a4faSLouis Dionnestruct __mu_return_impl;
26633e519524SHoward Hinnant
26649bf42533SHoward Hinnanttemplate <bool _Invokable, class _Ti, class ..._Uj>
26650805a4faSLouis Dionnestruct __mu_return_invokable  // false
26669bf42533SHoward Hinnant{
26679bf42533SHoward Hinnant    typedef __nat type;
26689bf42533SHoward Hinnant};
26699bf42533SHoward Hinnant
26703e519524SHoward Hinnanttemplate <class _Ti, class ..._Uj>
26710805a4faSLouis Dionnestruct __mu_return_invokable<true, _Ti, _Uj...>
26723e519524SHoward Hinnant{
26732344d6c1SHoward Hinnant    typedef typename __invoke_of<_Ti&, _Uj...>::type type;
26743e519524SHoward Hinnant};
26753e519524SHoward Hinnant
26769bf42533SHoward Hinnanttemplate <class _Ti, class ..._Uj>
26770805a4faSLouis Dionnestruct __mu_return_impl<_Ti, false, true, false, tuple<_Uj...> >
26780805a4faSLouis Dionne    : public __mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
26799bf42533SHoward Hinnant{
26809bf42533SHoward Hinnant};
26819bf42533SHoward Hinnant
26823e519524SHoward Hinnanttemplate <class _Ti, class _TupleUj>
26830805a4faSLouis Dionnestruct __mu_return_impl<_Ti, false, false, true, _TupleUj>
26843e519524SHoward Hinnant{
26853e519524SHoward Hinnant    typedef typename tuple_element<is_placeholder<_Ti>::value - 1,
26863e519524SHoward Hinnant                                   _TupleUj>::type&& type;
26873e519524SHoward Hinnant};
26883e519524SHoward Hinnant
26893e519524SHoward Hinnanttemplate <class _Ti, class _TupleUj>
26900805a4faSLouis Dionnestruct __mu_return_impl<_Ti, true, false, false, _TupleUj>
26912fa07ae9SHoward Hinnant{
26922fa07ae9SHoward Hinnant    typedef typename _Ti::type& type;
26932fa07ae9SHoward Hinnant};
26942fa07ae9SHoward Hinnant
26952fa07ae9SHoward Hinnanttemplate <class _Ti, class _TupleUj>
26960805a4faSLouis Dionnestruct __mu_return_impl<_Ti, false, false, false, _TupleUj>
26973e519524SHoward Hinnant{
26983e519524SHoward Hinnant    typedef _Ti& type;
26993e519524SHoward Hinnant};
27003e519524SHoward Hinnant
27013e519524SHoward Hinnanttemplate <class _Ti, class _TupleUj>
27023e519524SHoward Hinnantstruct __mu_return
27030805a4faSLouis Dionne    : public __mu_return_impl<_Ti,
27042fa07ae9SHoward Hinnant                              __is_reference_wrapper<_Ti>::value,
27053e519524SHoward Hinnant                              is_bind_expression<_Ti>::value,
2706c0c9748cSHoward Hinnant                              0 < is_placeholder<_Ti>::value &&
2707c0c9748cSHoward Hinnant                              is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value,
27083e519524SHoward Hinnant                              _TupleUj>
27093e519524SHoward Hinnant{
27103e519524SHoward Hinnant};
27113e519524SHoward Hinnant
2712c003db1fSHoward Hinnanttemplate <class _Fp, class _BoundArgs, class _TupleUj>
271335cb2b28SEric Fiselierstruct __is_valid_bind_return
2714c0c9748cSHoward Hinnant{
2715c0c9748cSHoward Hinnant    static const bool value = false;
2716c0c9748cSHoward Hinnant};
2717c0c9748cSHoward Hinnant
2718c0c9748cSHoward Hinnanttemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
271935cb2b28SEric Fiselierstruct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj>
2720c0c9748cSHoward Hinnant{
2721c0c9748cSHoward Hinnant    static const bool value = __invokable<_Fp,
2722c0c9748cSHoward Hinnant                    typename __mu_return<_BoundArgs, _TupleUj>::type...>::value;
2723c0c9748cSHoward Hinnant};
2724c0c9748cSHoward Hinnant
2725c0c9748cSHoward Hinnanttemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
272635cb2b28SEric Fiselierstruct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj>
2727c0c9748cSHoward Hinnant{
2728c0c9748cSHoward Hinnant    static const bool value = __invokable<_Fp,
2729c0c9748cSHoward Hinnant                    typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value;
2730c0c9748cSHoward Hinnant};
2731c0c9748cSHoward Hinnant
2732c0c9748cSHoward Hinnanttemplate <class _Fp, class _BoundArgs, class _TupleUj,
273335cb2b28SEric Fiselier          bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
27343e519524SHoward Hinnantstruct __bind_return;
27353e519524SHoward Hinnant
2736c003db1fSHoward Hinnanttemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
2737c0c9748cSHoward Hinnantstruct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true>
27383e519524SHoward Hinnant{
27392344d6c1SHoward Hinnant    typedef typename __invoke_of
27403e519524SHoward Hinnant    <
2741c003db1fSHoward Hinnant        _Fp&,
27423e519524SHoward Hinnant        typename __mu_return
27433e519524SHoward Hinnant        <
27443e519524SHoward Hinnant            _BoundArgs,
27453e519524SHoward Hinnant            _TupleUj
27463e519524SHoward Hinnant        >::type...
27473e519524SHoward Hinnant    >::type type;
27483e519524SHoward Hinnant};
27493e519524SHoward Hinnant
2750c003db1fSHoward Hinnanttemplate <class _Fp, class ..._BoundArgs, class _TupleUj>
2751c0c9748cSHoward Hinnantstruct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true>
27523e519524SHoward Hinnant{
27532344d6c1SHoward Hinnant    typedef typename __invoke_of
27543e519524SHoward Hinnant    <
2755c003db1fSHoward Hinnant        _Fp&,
27563e519524SHoward Hinnant        typename __mu_return
27573e519524SHoward Hinnant        <
27583e519524SHoward Hinnant            const _BoundArgs,
27593e519524SHoward Hinnant            _TupleUj
27603e519524SHoward Hinnant        >::type...
27613e519524SHoward Hinnant    >::type type;
27623e519524SHoward Hinnant};
27633e519524SHoward Hinnant
2764c003db1fSHoward Hinnanttemplate <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args>
27653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2766c003db1fSHoward Hinnanttypename __bind_return<_Fp, _BoundArgs, _Args>::type
2767c003db1fSHoward Hinnant__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
27683e519524SHoward Hinnant                _Args&& __args)
27693e519524SHoward Hinnant{
27701f8b73d1SEric Fiselier    return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...);
27713e519524SHoward Hinnant}
27723e519524SHoward Hinnant
2773c003db1fSHoward Hinnanttemplate<class _Fp, class ..._BoundArgs>
27743e519524SHoward Hinnantclass __bind
2775c003db1fSHoward Hinnant    : public __weak_result_type<typename decay<_Fp>::type>
27763e519524SHoward Hinnant{
2777c0c9748cSHoward Hinnantprotected:
2778c003db1fSHoward Hinnant    typedef typename decay<_Fp>::type _Fd;
27792344d6c1SHoward Hinnant    typedef tuple<typename decay<_BoundArgs>::type...> _Td;
2780c0c9748cSHoward Hinnantprivate:
27812344d6c1SHoward Hinnant    _Fd __f_;
27822344d6c1SHoward Hinnant    _Td __bound_args_;
27833e519524SHoward Hinnant
27843e519524SHoward Hinnant    typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
27853e519524SHoward Hinnantpublic:
2786df7aad41SHoward Hinnant    template <class _Gp, class ..._BA,
2787df7aad41SHoward Hinnant              class = typename enable_if
2788df7aad41SHoward Hinnant                               <
27899dbbf8deSHoward Hinnant                                  is_constructible<_Fd, _Gp>::value &&
27909dbbf8deSHoward Hinnant                                  !is_same<typename remove_reference<_Gp>::type,
27919dbbf8deSHoward Hinnant                                           __bind>::value
2792df7aad41SHoward Hinnant                               >::type>
27930af133f9SHoward Hinnant      _LIBCPP_INLINE_VISIBILITY
2794c003db1fSHoward Hinnant      explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
2795c003db1fSHoward Hinnant        : __f_(_VSTD::forward<_Gp>(__f)),
2796ce48a113SHoward Hinnant          __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
27973e519524SHoward Hinnant
27983e519524SHoward Hinnant    template <class ..._Args>
27990af133f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
28002344d6c1SHoward Hinnant        typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
28013e519524SHoward Hinnant        operator()(_Args&& ...__args)
28023e519524SHoward Hinnant        {
28031f8b73d1SEric Fiselier            return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
2804ce48a113SHoward Hinnant                                  tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
28053e519524SHoward Hinnant        }
28063e519524SHoward Hinnant
28073e519524SHoward Hinnant    template <class ..._Args>
28080af133f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2809c0c9748cSHoward Hinnant        typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
28103e519524SHoward Hinnant        operator()(_Args&& ...__args) const
28113e519524SHoward Hinnant        {
28121f8b73d1SEric Fiselier            return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
2813ce48a113SHoward Hinnant                                   tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
28143e519524SHoward Hinnant        }
28153e519524SHoward Hinnant};
28163e519524SHoward Hinnant
2817c003db1fSHoward Hinnanttemplate<class _Fp, class ..._BoundArgs>
2818c003db1fSHoward Hinnantstruct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {};
28193e519524SHoward Hinnant
2820c003db1fSHoward Hinnanttemplate<class _Rp, class _Fp, class ..._BoundArgs>
28213e519524SHoward Hinnantclass __bind_r
2822c003db1fSHoward Hinnant    : public __bind<_Fp, _BoundArgs...>
28233e519524SHoward Hinnant{
2824c003db1fSHoward Hinnant    typedef __bind<_Fp, _BoundArgs...> base;
2825c0c9748cSHoward Hinnant    typedef typename base::_Fd _Fd;
2826c0c9748cSHoward Hinnant    typedef typename base::_Td _Td;
28273e519524SHoward Hinnantpublic:
2828c003db1fSHoward Hinnant    typedef _Rp result_type;
28293e519524SHoward Hinnant
2830086d0de1SHoward Hinnant
28319dbbf8deSHoward Hinnant    template <class _Gp, class ..._BA,
28329dbbf8deSHoward Hinnant              class = typename enable_if
28339dbbf8deSHoward Hinnant                               <
28349dbbf8deSHoward Hinnant                                  is_constructible<_Fd, _Gp>::value &&
28359dbbf8deSHoward Hinnant                                  !is_same<typename remove_reference<_Gp>::type,
28369dbbf8deSHoward Hinnant                                           __bind_r>::value
28379dbbf8deSHoward Hinnant                               >::type>
28380af133f9SHoward Hinnant      _LIBCPP_INLINE_VISIBILITY
2839c003db1fSHoward Hinnant      explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
2840c003db1fSHoward Hinnant        : base(_VSTD::forward<_Gp>(__f),
2841ce48a113SHoward Hinnant               _VSTD::forward<_BA>(__bound_args)...) {}
28423e519524SHoward Hinnant
28433e519524SHoward Hinnant    template <class ..._Args>
28440af133f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2845c0c9748cSHoward Hinnant        typename enable_if
2846c0c9748cSHoward Hinnant        <
2847c0c9748cSHoward Hinnant            is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
28482d15f15fSEric Fiselier                           result_type>::value || is_void<_Rp>::value,
28493e519524SHoward Hinnant            result_type
2850c0c9748cSHoward Hinnant        >::type
28513e519524SHoward Hinnant        operator()(_Args&& ...__args)
28523e519524SHoward Hinnant        {
28532d15f15fSEric Fiselier            typedef __invoke_void_return_wrapper<_Rp> _Invoker;
28542d15f15fSEric Fiselier            return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);
28553e519524SHoward Hinnant        }
28563e519524SHoward Hinnant
28573e519524SHoward Hinnant    template <class ..._Args>
28580af133f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2859c0c9748cSHoward Hinnant        typename enable_if
2860c0c9748cSHoward Hinnant        <
2861c0c9748cSHoward Hinnant            is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
28622d15f15fSEric Fiselier                           result_type>::value || is_void<_Rp>::value,
28633e519524SHoward Hinnant            result_type
2864c0c9748cSHoward Hinnant        >::type
28653e519524SHoward Hinnant        operator()(_Args&& ...__args) const
28663e519524SHoward Hinnant        {
28672d15f15fSEric Fiselier            typedef __invoke_void_return_wrapper<_Rp> _Invoker;
28682d15f15fSEric Fiselier            return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);
28693e519524SHoward Hinnant        }
28703e519524SHoward Hinnant};
28713e519524SHoward Hinnant
2872c003db1fSHoward Hinnanttemplate<class _Rp, class _Fp, class ..._BoundArgs>
2873c003db1fSHoward Hinnantstruct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
28743e519524SHoward Hinnant
2875c003db1fSHoward Hinnanttemplate<class _Fp, class ..._BoundArgs>
28763e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2877c003db1fSHoward Hinnant__bind<_Fp, _BoundArgs...>
2878c003db1fSHoward Hinnantbind(_Fp&& __f, _BoundArgs&&... __bound_args)
28793e519524SHoward Hinnant{
2880c003db1fSHoward Hinnant    typedef __bind<_Fp, _BoundArgs...> type;
2881c003db1fSHoward Hinnant    return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
28823e519524SHoward Hinnant}
28833e519524SHoward Hinnant
2884c003db1fSHoward Hinnanttemplate<class _Rp, class _Fp, class ..._BoundArgs>
28853e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2886c003db1fSHoward Hinnant__bind_r<_Rp, _Fp, _BoundArgs...>
2887c003db1fSHoward Hinnantbind(_Fp&& __f, _BoundArgs&&... __bound_args)
28883e519524SHoward Hinnant{
2889c003db1fSHoward Hinnant    typedef __bind_r<_Rp, _Fp, _BoundArgs...> type;
2890c003db1fSHoward Hinnant    return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
28913e519524SHoward Hinnant}
28923e519524SHoward Hinnant
28937e23afcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
28943e519524SHoward Hinnant
28955be45129SEric Fiselier#if _LIBCPP_STD_VER > 14
289657257567SEric Fiselier
28975be45129SEric Fiseliertemplate <class _Fn, class ..._Args>
28986c49e1ceSLouis Dionneinvoke_result_t<_Fn, _Args...>
289957257567SEric Fiselierinvoke(_Fn&& __f, _Args&&... __args)
29006c49e1ceSLouis Dionne    noexcept(is_nothrow_invocable_v<_Fn, _Args...>)
290157257567SEric Fiselier{
290257257567SEric Fiselier    return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
29035be45129SEric Fiselier}
290457257567SEric Fiselier
290557257567SEric Fiseliertemplate <class _DecayFunc>
2906e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __not_fn_imp {
290757257567SEric Fiselier  _DecayFunc __fd;
290857257567SEric Fiselier
290957257567SEric Fiselierpublic:
291057257567SEric Fiselier    __not_fn_imp() = delete;
291157257567SEric Fiselier
291257257567SEric Fiselier    template <class ..._Args>
291357257567SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
29149372d8bcSEric Fiselier    auto operator()(_Args&& ...__args) &
291557257567SEric Fiselier            noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
291657257567SEric Fiselier        -> decltype(          !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
291757257567SEric Fiselier        { return              !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
291857257567SEric Fiselier
291957257567SEric Fiselier    template <class ..._Args>
292057257567SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
29219372d8bcSEric Fiselier    auto operator()(_Args&& ...__args) &&
29229372d8bcSEric Fiselier            noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
29239372d8bcSEric Fiselier        -> decltype(          !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
29249372d8bcSEric Fiselier        { return              !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
29259372d8bcSEric Fiselier
29269372d8bcSEric Fiselier    template <class ..._Args>
29279372d8bcSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
29289372d8bcSEric Fiselier    auto operator()(_Args&& ...__args) const&
292957257567SEric Fiselier            noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
293057257567SEric Fiselier        -> decltype(          !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
293157257567SEric Fiselier        { return              !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
293257257567SEric Fiselier
29339372d8bcSEric Fiselier
29349372d8bcSEric Fiselier    template <class ..._Args>
29359372d8bcSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
29369372d8bcSEric Fiselier    auto operator()(_Args&& ...__args) const&&
29379372d8bcSEric Fiselier            noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
29389372d8bcSEric Fiselier        -> decltype(          !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
29399372d8bcSEric Fiselier        { return              !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
29409372d8bcSEric Fiselier
294157257567SEric Fiselierprivate:
294257257567SEric Fiselier    template <class _RawFunc,
294357257567SEric Fiselier              class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>>
294457257567SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
294557257567SEric Fiselier    explicit __not_fn_imp(_RawFunc&& __rf)
294657257567SEric Fiselier        : __fd(_VSTD::forward<_RawFunc>(__rf)) {}
294757257567SEric Fiselier
294857257567SEric Fiselier    template <class _RawFunc>
294957257567SEric Fiselier    friend inline _LIBCPP_INLINE_VISIBILITY
295057257567SEric Fiselier    __not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&);
295157257567SEric Fiselier};
295257257567SEric Fiselier
295357257567SEric Fiseliertemplate <class _RawFunc>
295457257567SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
295557257567SEric Fiselier__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) {
295657257567SEric Fiselier    return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn));
295757257567SEric Fiselier}
295857257567SEric Fiselier
29595be45129SEric Fiselier#endif
29605be45129SEric Fiselier
2961d1803b6cSHoward Hinnant// struct hash<T*> in <memory>
29623e519524SHoward Hinnant
2963d835e592SMarshall Clowtemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
296412f0a779SMarshall Clowpair<_ForwardIterator1, _ForwardIterator1> _LIBCPP_CONSTEXPR_AFTER_CXX11
2965d835e592SMarshall Clow__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
2966d835e592SMarshall Clow         _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
2967d835e592SMarshall Clow         forward_iterator_tag, forward_iterator_tag)
2968d835e592SMarshall Clow{
2969d835e592SMarshall Clow    if (__first2 == __last2)
2970d835e592SMarshall Clow        return make_pair(__first1, __first1);  // Everything matches an empty sequence
2971d835e592SMarshall Clow    while (true)
2972d835e592SMarshall Clow    {
2973d835e592SMarshall Clow        // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
2974d835e592SMarshall Clow        while (true)
2975d835e592SMarshall Clow        {
2976d835e592SMarshall Clow            if (__first1 == __last1)  // return __last1 if no element matches *__first2
2977d835e592SMarshall Clow                return make_pair(__last1, __last1);
2978d835e592SMarshall Clow            if (__pred(*__first1, *__first2))
2979d835e592SMarshall Clow                break;
2980d835e592SMarshall Clow            ++__first1;
2981d835e592SMarshall Clow        }
2982d835e592SMarshall Clow        // *__first1 matches *__first2, now match elements after here
2983d835e592SMarshall Clow        _ForwardIterator1 __m1 = __first1;
2984d835e592SMarshall Clow        _ForwardIterator2 __m2 = __first2;
2985d835e592SMarshall Clow        while (true)
2986d835e592SMarshall Clow        {
2987d835e592SMarshall Clow            if (++__m2 == __last2)  // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
2988d835e592SMarshall Clow                return make_pair(__first1, __m1);
2989d835e592SMarshall Clow            if (++__m1 == __last1)  // Otherwise if source exhaused, pattern not found
2990d835e592SMarshall Clow                return make_pair(__last1, __last1);
2991d835e592SMarshall Clow            if (!__pred(*__m1, *__m2))  // if there is a mismatch, restart with a new __first1
2992d835e592SMarshall Clow            {
2993d835e592SMarshall Clow                ++__first1;
2994d835e592SMarshall Clow                break;
2995d835e592SMarshall Clow            }  // else there is a match, check next elements
2996d835e592SMarshall Clow        }
2997d835e592SMarshall Clow    }
2998d835e592SMarshall Clow}
2999d835e592SMarshall Clow
3000d835e592SMarshall Clowtemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
3001d835e592SMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX11
3002d835e592SMarshall Clowpair<_RandomAccessIterator1, _RandomAccessIterator1>
3003d835e592SMarshall Clow__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
3004d835e592SMarshall Clow         _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
3005d835e592SMarshall Clow           random_access_iterator_tag, random_access_iterator_tag)
3006d835e592SMarshall Clow{
3007d835e592SMarshall Clow    typedef typename iterator_traits<_RandomAccessIterator1>::difference_type _D1;
3008d835e592SMarshall Clow    typedef typename iterator_traits<_RandomAccessIterator2>::difference_type _D2;
3009d835e592SMarshall Clow    // Take advantage of knowing source and pattern lengths.  Stop short when source is smaller than pattern
3010d835e592SMarshall Clow    const _D2 __len2 = __last2 - __first2;
3011d835e592SMarshall Clow    if (__len2 == 0)
3012d835e592SMarshall Clow        return make_pair(__first1, __first1);
3013d835e592SMarshall Clow    const _D1 __len1 = __last1 - __first1;
3014d835e592SMarshall Clow    if (__len1 < __len2)
3015d835e592SMarshall Clow        return make_pair(__last1, __last1);
3016d835e592SMarshall Clow    const _RandomAccessIterator1 __s = __last1 - (__len2 - 1);  // Start of pattern match can't go beyond here
3017d835e592SMarshall Clow
3018d835e592SMarshall Clow    while (true)
3019d835e592SMarshall Clow    {
3020d835e592SMarshall Clow        while (true)
3021d835e592SMarshall Clow        {
3022d835e592SMarshall Clow            if (__first1 == __s)
3023d835e592SMarshall Clow                return make_pair(__last1, __last1);
3024d835e592SMarshall Clow            if (__pred(*__first1, *__first2))
3025d835e592SMarshall Clow                break;
3026d835e592SMarshall Clow            ++__first1;
3027d835e592SMarshall Clow        }
3028d835e592SMarshall Clow
3029d835e592SMarshall Clow        _RandomAccessIterator1 __m1 = __first1;
3030d835e592SMarshall Clow        _RandomAccessIterator2 __m2 = __first2;
3031d835e592SMarshall Clow         while (true)
3032d835e592SMarshall Clow         {
3033d835e592SMarshall Clow             if (++__m2 == __last2)
3034d835e592SMarshall Clow                 return make_pair(__first1, __first1 + __len2);
3035d835e592SMarshall Clow             ++__m1;          // no need to check range on __m1 because __s guarantees we have enough source
3036d835e592SMarshall Clow             if (!__pred(*__m1, *__m2))
3037d835e592SMarshall Clow             {
3038d835e592SMarshall Clow                 ++__first1;
3039d835e592SMarshall Clow                 break;
3040d835e592SMarshall Clow             }
3041d835e592SMarshall Clow         }
3042d835e592SMarshall Clow    }
3043d835e592SMarshall Clow}
3044d835e592SMarshall Clow
3045d835e592SMarshall Clow#if _LIBCPP_STD_VER > 14
3046d835e592SMarshall Clow
3047d835e592SMarshall Clow// default searcher
3048d835e592SMarshall Clowtemplate<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
30491b1b80f4SDimitry Andricclass _LIBCPP_TYPE_VIS default_searcher {
3050d835e592SMarshall Clowpublic:
3051d835e592SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
3052d835e592SMarshall Clow    default_searcher(_ForwardIterator __f, _ForwardIterator __l,
3053d835e592SMarshall Clow                       _BinaryPredicate __p = _BinaryPredicate())
3054d835e592SMarshall Clow        : __first_(__f), __last_(__l), __pred_(__p) {}
3055d835e592SMarshall Clow
3056d835e592SMarshall Clow    template <typename _ForwardIterator2>
3057d835e592SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
3058d835e592SMarshall Clow    pair<_ForwardIterator2, _ForwardIterator2>
3059d835e592SMarshall Clow    operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
3060d835e592SMarshall Clow    {
3061d835e592SMarshall Clow        return _VSTD::__search(__f, __l, __first_, __last_, __pred_,
3062d835e592SMarshall Clow            typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category(),
3063d835e592SMarshall Clow            typename _VSTD::iterator_traits<_ForwardIterator2>::iterator_category());
3064d835e592SMarshall Clow    }
3065d835e592SMarshall Clow
3066d835e592SMarshall Clowprivate:
3067d835e592SMarshall Clow    _ForwardIterator __first_;
3068d835e592SMarshall Clow    _ForwardIterator __last_;
3069d835e592SMarshall Clow    _BinaryPredicate __pred_;
3070d835e592SMarshall Clow    };
3071d835e592SMarshall Clow
3072d835e592SMarshall Clow#endif // _LIBCPP_STD_VER > 14
3073d835e592SMarshall Clow
3074bb9ca6d0SLouis Dionne#if _LIBCPP_STD_VER > 17
3075bb9ca6d0SLouis Dionnetemplate <class _Tp>
3076bb9ca6d0SLouis Dionneusing unwrap_reference_t = typename unwrap_reference<_Tp>::type;
3077bb9ca6d0SLouis Dionne
3078bb9ca6d0SLouis Dionnetemplate <class _Tp>
3079bb9ca6d0SLouis Dionneusing unwrap_ref_decay_t = typename unwrap_ref_decay<_Tp>::type;
3080bb9ca6d0SLouis Dionne#endif // > C++17
3081bb9ca6d0SLouis Dionne
3082f60c63c0SMarshall Clowtemplate <class _Container, class _Predicate>
3083f60c63c0SMarshall Clowinline void __libcpp_erase_if_container( _Container& __c, _Predicate __pred)
3084f60c63c0SMarshall Clow{
3085f60c63c0SMarshall Clow	for (typename _Container::iterator __iter = __c.begin(), __last = __c.end(); __iter != __last;)
3086f60c63c0SMarshall Clow	{
3087f60c63c0SMarshall Clow		if (__pred(*__iter))
3088f60c63c0SMarshall Clow			__iter = __c.erase(__iter);
3089f60c63c0SMarshall Clow		else
3090f60c63c0SMarshall Clow			++__iter;
3091f60c63c0SMarshall Clow	}
3092f60c63c0SMarshall Clow}
3093f60c63c0SMarshall Clow
30943e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
30953e519524SHoward Hinnant
30963e519524SHoward Hinnant#endif  // _LIBCPP_FUNCTIONAL
3097