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