1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*- 2*58b9f456SAndroid Build Coastguard Worker//===------------------------ functional ----------------------------------===// 3*58b9f456SAndroid Build Coastguard Worker// 4*58b9f456SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 5*58b9f456SAndroid Build Coastguard Worker// 6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open 7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details. 8*58b9f456SAndroid Build Coastguard Worker// 9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 10*58b9f456SAndroid Build Coastguard Worker 11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_FUNCTIONAL 12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_FUNCTIONAL 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker/* 15*58b9f456SAndroid Build Coastguard Worker functional synopsis 16*58b9f456SAndroid Build Coastguard Worker 17*58b9f456SAndroid Build Coastguard Workernamespace std 18*58b9f456SAndroid Build Coastguard Worker{ 19*58b9f456SAndroid Build Coastguard Worker 20*58b9f456SAndroid Build Coastguard Workertemplate <class Arg, class Result> 21*58b9f456SAndroid Build Coastguard Workerstruct unary_function 22*58b9f456SAndroid Build Coastguard Worker{ 23*58b9f456SAndroid Build Coastguard Worker typedef Arg argument_type; 24*58b9f456SAndroid Build Coastguard Worker typedef Result result_type; 25*58b9f456SAndroid Build Coastguard Worker}; 26*58b9f456SAndroid Build Coastguard Worker 27*58b9f456SAndroid Build Coastguard Workertemplate <class Arg1, class Arg2, class Result> 28*58b9f456SAndroid Build Coastguard Workerstruct binary_function 29*58b9f456SAndroid Build Coastguard Worker{ 30*58b9f456SAndroid Build Coastguard Worker typedef Arg1 first_argument_type; 31*58b9f456SAndroid Build Coastguard Worker typedef Arg2 second_argument_type; 32*58b9f456SAndroid Build Coastguard Worker typedef Result result_type; 33*58b9f456SAndroid Build Coastguard Worker}; 34*58b9f456SAndroid Build Coastguard Worker 35*58b9f456SAndroid Build Coastguard Workertemplate <class T> 36*58b9f456SAndroid Build Coastguard Workerclass reference_wrapper 37*58b9f456SAndroid Build Coastguard Worker : public unary_function<T1, R> // if wrapping a unary functor 38*58b9f456SAndroid Build Coastguard Worker : public binary_function<T1, T2, R> // if wraping a binary functor 39*58b9f456SAndroid Build Coastguard Worker{ 40*58b9f456SAndroid Build Coastguard Workerpublic: 41*58b9f456SAndroid Build Coastguard Worker // types 42*58b9f456SAndroid Build Coastguard Worker typedef T type; 43*58b9f456SAndroid Build Coastguard Worker typedef see below result_type; // Not always defined 44*58b9f456SAndroid Build Coastguard Worker 45*58b9f456SAndroid Build Coastguard Worker // construct/copy/destroy 46*58b9f456SAndroid Build Coastguard Worker reference_wrapper(T&) noexcept; 47*58b9f456SAndroid Build Coastguard Worker reference_wrapper(T&&) = delete; // do not bind to temps 48*58b9f456SAndroid Build Coastguard Worker reference_wrapper(const reference_wrapper<T>& x) noexcept; 49*58b9f456SAndroid Build Coastguard Worker 50*58b9f456SAndroid Build Coastguard Worker // assignment 51*58b9f456SAndroid Build Coastguard Worker reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept; 52*58b9f456SAndroid Build Coastguard Worker 53*58b9f456SAndroid Build Coastguard Worker // access 54*58b9f456SAndroid Build Coastguard Worker operator T& () const noexcept; 55*58b9f456SAndroid Build Coastguard Worker T& get() const noexcept; 56*58b9f456SAndroid Build Coastguard Worker 57*58b9f456SAndroid Build Coastguard Worker // invoke 58*58b9f456SAndroid Build Coastguard Worker template <class... ArgTypes> 59*58b9f456SAndroid Build Coastguard Worker typename result_of<T&(ArgTypes&&...)>::type 60*58b9f456SAndroid Build Coastguard Worker operator() (ArgTypes&&...) const; 61*58b9f456SAndroid Build Coastguard Worker}; 62*58b9f456SAndroid Build Coastguard Worker 63*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<T> ref(T& t) noexcept; 64*58b9f456SAndroid Build Coastguard Workertemplate <class T> void ref(const T&& t) = delete; 65*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept; 66*58b9f456SAndroid Build Coastguard Worker 67*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<const T> cref(const T& t) noexcept; 68*58b9f456SAndroid Build Coastguard Workertemplate <class T> void cref(const T&& t) = delete; 69*58b9f456SAndroid Build Coastguard Workertemplate <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept; 70*58b9f456SAndroid Build Coastguard Worker 71*58b9f456SAndroid Build Coastguard Workertemplate <class T> struct unwrap_reference; // since C++20 72*58b9f456SAndroid Build Coastguard Workertemplate <class T> struct unwrap_ref_decay : unwrap_reference<decay_t<T>> { }; // since C++20 73*58b9f456SAndroid Build Coastguard Workertemplate <class T> using unwrap_reference_t = typename unwrap_reference<T>::type; // since C++20 74*58b9f456SAndroid Build Coastguard Workertemplate <class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; // since C++20 75*58b9f456SAndroid Build Coastguard Worker 76*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 77*58b9f456SAndroid Build Coastguard Workerstruct plus : binary_function<T, T, T> 78*58b9f456SAndroid Build Coastguard Worker{ 79*58b9f456SAndroid Build Coastguard Worker T operator()(const T& x, const T& y) const; 80*58b9f456SAndroid Build Coastguard Worker}; 81*58b9f456SAndroid Build Coastguard Worker 82*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 83*58b9f456SAndroid Build Coastguard Workerstruct minus : binary_function<T, T, T> 84*58b9f456SAndroid Build Coastguard Worker{ 85*58b9f456SAndroid Build Coastguard Worker T operator()(const T& x, const T& y) const; 86*58b9f456SAndroid Build Coastguard Worker}; 87*58b9f456SAndroid Build Coastguard Worker 88*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 89*58b9f456SAndroid Build Coastguard Workerstruct multiplies : binary_function<T, T, T> 90*58b9f456SAndroid Build Coastguard Worker{ 91*58b9f456SAndroid Build Coastguard Worker T operator()(const T& x, const T& y) const; 92*58b9f456SAndroid Build Coastguard Worker}; 93*58b9f456SAndroid Build Coastguard Worker 94*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 95*58b9f456SAndroid Build Coastguard Workerstruct divides : binary_function<T, T, T> 96*58b9f456SAndroid Build Coastguard Worker{ 97*58b9f456SAndroid Build Coastguard Worker T operator()(const T& x, const T& y) const; 98*58b9f456SAndroid Build Coastguard Worker}; 99*58b9f456SAndroid Build Coastguard Worker 100*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 101*58b9f456SAndroid Build Coastguard Workerstruct modulus : binary_function<T, T, T> 102*58b9f456SAndroid Build Coastguard Worker{ 103*58b9f456SAndroid Build Coastguard Worker T operator()(const T& x, const T& y) const; 104*58b9f456SAndroid Build Coastguard Worker}; 105*58b9f456SAndroid Build Coastguard Worker 106*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 107*58b9f456SAndroid Build Coastguard Workerstruct negate : unary_function<T, T> 108*58b9f456SAndroid Build Coastguard Worker{ 109*58b9f456SAndroid Build Coastguard Worker T operator()(const T& x) const; 110*58b9f456SAndroid Build Coastguard Worker}; 111*58b9f456SAndroid Build Coastguard Worker 112*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 113*58b9f456SAndroid Build Coastguard Workerstruct equal_to : binary_function<T, T, bool> 114*58b9f456SAndroid Build Coastguard Worker{ 115*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 116*58b9f456SAndroid Build Coastguard Worker}; 117*58b9f456SAndroid Build Coastguard Worker 118*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 119*58b9f456SAndroid Build Coastguard Workerstruct not_equal_to : binary_function<T, T, bool> 120*58b9f456SAndroid Build Coastguard Worker{ 121*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 122*58b9f456SAndroid Build Coastguard Worker}; 123*58b9f456SAndroid Build Coastguard Worker 124*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 125*58b9f456SAndroid Build Coastguard Workerstruct greater : binary_function<T, T, bool> 126*58b9f456SAndroid Build Coastguard Worker{ 127*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 128*58b9f456SAndroid Build Coastguard Worker}; 129*58b9f456SAndroid Build Coastguard Worker 130*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 131*58b9f456SAndroid Build Coastguard Workerstruct less : binary_function<T, T, bool> 132*58b9f456SAndroid Build Coastguard Worker{ 133*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 134*58b9f456SAndroid Build Coastguard Worker}; 135*58b9f456SAndroid Build Coastguard Worker 136*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 137*58b9f456SAndroid Build Coastguard Workerstruct greater_equal : binary_function<T, T, bool> 138*58b9f456SAndroid Build Coastguard Worker{ 139*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 140*58b9f456SAndroid Build Coastguard Worker}; 141*58b9f456SAndroid Build Coastguard Worker 142*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 143*58b9f456SAndroid Build Coastguard Workerstruct less_equal : binary_function<T, T, bool> 144*58b9f456SAndroid Build Coastguard Worker{ 145*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 146*58b9f456SAndroid Build Coastguard Worker}; 147*58b9f456SAndroid Build Coastguard Worker 148*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 149*58b9f456SAndroid Build Coastguard Workerstruct logical_and : binary_function<T, T, bool> 150*58b9f456SAndroid Build Coastguard Worker{ 151*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 152*58b9f456SAndroid Build Coastguard Worker}; 153*58b9f456SAndroid Build Coastguard Worker 154*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 155*58b9f456SAndroid Build Coastguard Workerstruct logical_or : binary_function<T, T, bool> 156*58b9f456SAndroid Build Coastguard Worker{ 157*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 158*58b9f456SAndroid Build Coastguard Worker}; 159*58b9f456SAndroid Build Coastguard Worker 160*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 161*58b9f456SAndroid Build Coastguard Workerstruct logical_not : unary_function<T, bool> 162*58b9f456SAndroid Build Coastguard Worker{ 163*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x) const; 164*58b9f456SAndroid Build Coastguard Worker}; 165*58b9f456SAndroid Build Coastguard Worker 166*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 167*58b9f456SAndroid Build Coastguard Workerstruct bit_and : unary_function<T, bool> 168*58b9f456SAndroid Build Coastguard Worker{ 169*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 170*58b9f456SAndroid Build Coastguard Worker}; 171*58b9f456SAndroid Build Coastguard Worker 172*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 173*58b9f456SAndroid Build Coastguard Workerstruct bit_or : unary_function<T, bool> 174*58b9f456SAndroid Build Coastguard Worker{ 175*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 176*58b9f456SAndroid Build Coastguard Worker}; 177*58b9f456SAndroid Build Coastguard Worker 178*58b9f456SAndroid Build Coastguard Workertemplate <class T> // <class T=void> in C++14 179*58b9f456SAndroid Build Coastguard Workerstruct bit_xor : unary_function<T, bool> 180*58b9f456SAndroid Build Coastguard Worker{ 181*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x, const T& y) const; 182*58b9f456SAndroid Build Coastguard Worker}; 183*58b9f456SAndroid Build Coastguard Worker 184*58b9f456SAndroid Build Coastguard Workertemplate <class T=void> // C++14 185*58b9f456SAndroid Build Coastguard Workerstruct bit_xor : unary_function<T, bool> 186*58b9f456SAndroid Build Coastguard Worker{ 187*58b9f456SAndroid Build Coastguard Worker bool operator()(const T& x) const; 188*58b9f456SAndroid Build Coastguard Worker}; 189*58b9f456SAndroid Build Coastguard Worker 190*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate> 191*58b9f456SAndroid Build Coastguard Workerclass unary_negate // deprecated in C++17 192*58b9f456SAndroid Build Coastguard Worker : public unary_function<typename Predicate::argument_type, bool> 193*58b9f456SAndroid Build Coastguard Worker{ 194*58b9f456SAndroid Build Coastguard Workerpublic: 195*58b9f456SAndroid Build Coastguard Worker explicit unary_negate(const Predicate& pred); 196*58b9f456SAndroid Build Coastguard Worker bool operator()(const typename Predicate::argument_type& x) const; 197*58b9f456SAndroid Build Coastguard Worker}; 198*58b9f456SAndroid Build Coastguard Worker 199*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate> // deprecated in C++17 200*58b9f456SAndroid Build Coastguard Workerunary_negate<Predicate> not1(const Predicate& pred); 201*58b9f456SAndroid Build Coastguard Worker 202*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate> 203*58b9f456SAndroid Build Coastguard Workerclass binary_negate // deprecated in C++17 204*58b9f456SAndroid Build Coastguard Worker : public binary_function<typename Predicate::first_argument_type, 205*58b9f456SAndroid Build Coastguard Worker typename Predicate::second_argument_type, 206*58b9f456SAndroid Build Coastguard Worker bool> 207*58b9f456SAndroid Build Coastguard Worker{ 208*58b9f456SAndroid Build Coastguard Workerpublic: 209*58b9f456SAndroid Build Coastguard Worker explicit binary_negate(const Predicate& pred); 210*58b9f456SAndroid Build Coastguard Worker bool operator()(const typename Predicate::first_argument_type& x, 211*58b9f456SAndroid Build Coastguard Worker const typename Predicate::second_argument_type& y) const; 212*58b9f456SAndroid Build Coastguard Worker}; 213*58b9f456SAndroid Build Coastguard Worker 214*58b9f456SAndroid Build Coastguard Workertemplate <class Predicate> // deprecated in C++17 215*58b9f456SAndroid Build Coastguard Workerbinary_negate<Predicate> not2(const Predicate& pred); 216*58b9f456SAndroid Build Coastguard Worker 217*58b9f456SAndroid Build Coastguard Workertemplate <class F> unspecified not_fn(F&& f); // C++17 218*58b9f456SAndroid Build Coastguard Worker 219*58b9f456SAndroid Build Coastguard Workertemplate<class T> struct is_bind_expression; 220*58b9f456SAndroid Build Coastguard Workertemplate<class T> struct is_placeholder; 221*58b9f456SAndroid Build Coastguard Worker 222*58b9f456SAndroid Build Coastguard Worker // See C++14 20.9.9, Function object binders 223*58b9f456SAndroid Build Coastguard Workertemplate <class T> inline constexpr bool is_bind_expression_v 224*58b9f456SAndroid Build Coastguard Worker = is_bind_expression<T>::value; // C++17 225*58b9f456SAndroid Build Coastguard Workertemplate <class T> inline constexpr int is_placeholder_v 226*58b9f456SAndroid Build Coastguard Worker = is_placeholder<T>::value; // C++17 227*58b9f456SAndroid Build Coastguard Worker 228*58b9f456SAndroid Build Coastguard Worker 229*58b9f456SAndroid Build Coastguard Workertemplate<class Fn, class... BoundArgs> 230*58b9f456SAndroid Build Coastguard Worker unspecified bind(Fn&&, BoundArgs&&...); 231*58b9f456SAndroid Build Coastguard Workertemplate<class R, class Fn, class... BoundArgs> 232*58b9f456SAndroid Build Coastguard Worker unspecified bind(Fn&&, BoundArgs&&...); 233*58b9f456SAndroid Build Coastguard Worker 234*58b9f456SAndroid Build Coastguard Workernamespace placeholders { 235*58b9f456SAndroid Build Coastguard Worker // M is the implementation-defined number of placeholders 236*58b9f456SAndroid Build Coastguard Worker extern unspecified _1; 237*58b9f456SAndroid Build Coastguard Worker extern unspecified _2; 238*58b9f456SAndroid Build Coastguard Worker . 239*58b9f456SAndroid Build Coastguard Worker . 240*58b9f456SAndroid Build Coastguard Worker . 241*58b9f456SAndroid Build Coastguard Worker extern unspecified _Mp; 242*58b9f456SAndroid Build Coastguard Worker} 243*58b9f456SAndroid Build Coastguard Worker 244*58b9f456SAndroid Build Coastguard Workertemplate <class Operation> 245*58b9f456SAndroid Build Coastguard Workerclass binder1st // deprecated in C++11, removed in C++17 246*58b9f456SAndroid Build Coastguard Worker : public unary_function<typename Operation::second_argument_type, 247*58b9f456SAndroid Build Coastguard Worker typename Operation::result_type> 248*58b9f456SAndroid Build Coastguard Worker{ 249*58b9f456SAndroid Build Coastguard Workerprotected: 250*58b9f456SAndroid Build Coastguard Worker Operation op; 251*58b9f456SAndroid Build Coastguard Worker typename Operation::first_argument_type value; 252*58b9f456SAndroid Build Coastguard Workerpublic: 253*58b9f456SAndroid Build Coastguard Worker binder1st(const Operation& x, const typename Operation::first_argument_type y); 254*58b9f456SAndroid Build Coastguard Worker typename Operation::result_type operator()( typename Operation::second_argument_type& x) const; 255*58b9f456SAndroid Build Coastguard Worker typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const; 256*58b9f456SAndroid Build Coastguard Worker}; 257*58b9f456SAndroid Build Coastguard Worker 258*58b9f456SAndroid Build Coastguard Workertemplate <class Operation, class T> 259*58b9f456SAndroid Build Coastguard Workerbinder1st<Operation> bind1st(const Operation& op, const T& x); // deprecated in C++11, removed in C++17 260*58b9f456SAndroid Build Coastguard Worker 261*58b9f456SAndroid Build Coastguard Workertemplate <class Operation> 262*58b9f456SAndroid Build Coastguard Workerclass binder2nd // deprecated in C++11, removed in C++17 263*58b9f456SAndroid Build Coastguard Worker : public unary_function<typename Operation::first_argument_type, 264*58b9f456SAndroid Build Coastguard Worker typename Operation::result_type> 265*58b9f456SAndroid Build Coastguard Worker{ 266*58b9f456SAndroid Build Coastguard Workerprotected: 267*58b9f456SAndroid Build Coastguard Worker Operation op; 268*58b9f456SAndroid Build Coastguard Worker typename Operation::second_argument_type value; 269*58b9f456SAndroid Build Coastguard Workerpublic: 270*58b9f456SAndroid Build Coastguard Worker binder2nd(const Operation& x, const typename Operation::second_argument_type y); 271*58b9f456SAndroid Build Coastguard Worker typename Operation::result_type operator()( typename Operation::first_argument_type& x) const; 272*58b9f456SAndroid Build Coastguard Worker typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const; 273*58b9f456SAndroid Build Coastguard Worker}; 274*58b9f456SAndroid Build Coastguard Worker 275*58b9f456SAndroid Build Coastguard Workertemplate <class Operation, class T> 276*58b9f456SAndroid Build Coastguard Workerbinder2nd<Operation> bind2nd(const Operation& op, const T& x); // deprecated in C++11, removed in C++17 277*58b9f456SAndroid Build Coastguard Worker 278*58b9f456SAndroid Build Coastguard Workertemplate <class Arg, class Result> // deprecated in C++11, removed in C++17 279*58b9f456SAndroid Build Coastguard Workerclass pointer_to_unary_function : public unary_function<Arg, Result> 280*58b9f456SAndroid Build Coastguard Worker{ 281*58b9f456SAndroid Build Coastguard Workerpublic: 282*58b9f456SAndroid Build Coastguard Worker explicit pointer_to_unary_function(Result (*f)(Arg)); 283*58b9f456SAndroid Build Coastguard Worker Result operator()(Arg x) const; 284*58b9f456SAndroid Build Coastguard Worker}; 285*58b9f456SAndroid Build Coastguard Worker 286*58b9f456SAndroid Build Coastguard Workertemplate <class Arg, class Result> 287*58b9f456SAndroid Build Coastguard Workerpointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg)); // deprecated in C++11, removed in C++17 288*58b9f456SAndroid Build Coastguard Worker 289*58b9f456SAndroid Build Coastguard Workertemplate <class Arg1, class Arg2, class Result> // deprecated in C++11, removed in C++17 290*58b9f456SAndroid Build Coastguard Workerclass pointer_to_binary_function : public binary_function<Arg1, Arg2, Result> 291*58b9f456SAndroid Build Coastguard Worker{ 292*58b9f456SAndroid Build Coastguard Workerpublic: 293*58b9f456SAndroid Build Coastguard Worker explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2)); 294*58b9f456SAndroid Build Coastguard Worker Result operator()(Arg1 x, Arg2 y) const; 295*58b9f456SAndroid Build Coastguard Worker}; 296*58b9f456SAndroid Build Coastguard Worker 297*58b9f456SAndroid Build Coastguard Workertemplate <class Arg1, class Arg2, class Result> 298*58b9f456SAndroid Build Coastguard Workerpointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2)); // deprecated in C++11, removed in C++17 299*58b9f456SAndroid Build Coastguard Worker 300*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T> // deprecated in C++11, removed in C++17 301*58b9f456SAndroid Build Coastguard Workerclass mem_fun_t : public unary_function<T*, S> 302*58b9f456SAndroid Build Coastguard Worker{ 303*58b9f456SAndroid Build Coastguard Workerpublic: 304*58b9f456SAndroid Build Coastguard Worker explicit mem_fun_t(S (T::*p)()); 305*58b9f456SAndroid Build Coastguard Worker S operator()(T* p) const; 306*58b9f456SAndroid Build Coastguard Worker}; 307*58b9f456SAndroid Build Coastguard Worker 308*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T, class A> 309*58b9f456SAndroid Build Coastguard Workerclass mem_fun1_t : public binary_function<T*, A, S> // deprecated in C++11, removed in C++17 310*58b9f456SAndroid Build Coastguard Worker{ 311*58b9f456SAndroid Build Coastguard Workerpublic: 312*58b9f456SAndroid Build Coastguard Worker explicit mem_fun1_t(S (T::*p)(A)); 313*58b9f456SAndroid Build Coastguard Worker S operator()(T* p, A x) const; 314*58b9f456SAndroid Build Coastguard Worker}; 315*58b9f456SAndroid Build Coastguard Worker 316*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)()); // deprecated in C++11, removed in C++17 317*58b9f456SAndroid Build Coastguard Workertemplate<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 318*58b9f456SAndroid Build Coastguard Worker 319*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T> 320*58b9f456SAndroid Build Coastguard Workerclass mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17 321*58b9f456SAndroid Build Coastguard Worker{ 322*58b9f456SAndroid Build Coastguard Workerpublic: 323*58b9f456SAndroid Build Coastguard Worker explicit mem_fun_ref_t(S (T::*p)()); 324*58b9f456SAndroid Build Coastguard Worker S operator()(T& p) const; 325*58b9f456SAndroid Build Coastguard Worker}; 326*58b9f456SAndroid Build Coastguard Worker 327*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T, class A> 328*58b9f456SAndroid Build Coastguard Workerclass mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17 329*58b9f456SAndroid Build Coastguard Worker{ 330*58b9f456SAndroid Build Coastguard Workerpublic: 331*58b9f456SAndroid Build Coastguard Worker explicit mem_fun1_ref_t(S (T::*p)(A)); 332*58b9f456SAndroid Build Coastguard Worker S operator()(T& p, A x) const; 333*58b9f456SAndroid Build Coastguard Worker}; 334*58b9f456SAndroid Build Coastguard Worker 335*58b9f456SAndroid Build Coastguard Workertemplate<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()); // deprecated in C++11, removed in C++17 336*58b9f456SAndroid Build Coastguard Workertemplate<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 337*58b9f456SAndroid Build Coastguard Worker 338*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T> 339*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun_t : public unary_function<const T*, S> // deprecated in C++11, removed in C++17 340*58b9f456SAndroid Build Coastguard Worker{ 341*58b9f456SAndroid Build Coastguard Workerpublic: 342*58b9f456SAndroid Build Coastguard Worker explicit const_mem_fun_t(S (T::*p)() const); 343*58b9f456SAndroid Build Coastguard Worker S operator()(const T* p) const; 344*58b9f456SAndroid Build Coastguard Worker}; 345*58b9f456SAndroid Build Coastguard Worker 346*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T, class A> 347*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun1_t : public binary_function<const T*, A, S> // deprecated in C++11, removed in C++17 348*58b9f456SAndroid Build Coastguard Worker{ 349*58b9f456SAndroid Build Coastguard Workerpublic: 350*58b9f456SAndroid Build Coastguard Worker explicit const_mem_fun1_t(S (T::*p)(A) const); 351*58b9f456SAndroid Build Coastguard Worker S operator()(const T* p, A x) const; 352*58b9f456SAndroid Build Coastguard Worker}; 353*58b9f456SAndroid Build Coastguard Worker 354*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T> const_mem_fun_t<S,T> mem_fun(S (T::*f)() const); // deprecated in C++11, removed in C++17 355*58b9f456SAndroid Build Coastguard Workertemplate <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 356*58b9f456SAndroid Build Coastguard Worker 357*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T> 358*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17 359*58b9f456SAndroid Build Coastguard Worker{ 360*58b9f456SAndroid Build Coastguard Workerpublic: 361*58b9f456SAndroid Build Coastguard Worker explicit const_mem_fun_ref_t(S (T::*p)() const); 362*58b9f456SAndroid Build Coastguard Worker S operator()(const T& p) const; 363*58b9f456SAndroid Build Coastguard Worker}; 364*58b9f456SAndroid Build Coastguard Worker 365*58b9f456SAndroid Build Coastguard Workertemplate <class S, class T, class A> 366*58b9f456SAndroid Build Coastguard Workerclass const_mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17 367*58b9f456SAndroid Build Coastguard Worker{ 368*58b9f456SAndroid Build Coastguard Workerpublic: 369*58b9f456SAndroid Build Coastguard Worker explicit const_mem_fun1_ref_t(S (T::*p)(A) const); 370*58b9f456SAndroid Build Coastguard Worker S operator()(const T& p, A x) const; 371*58b9f456SAndroid Build Coastguard Worker}; 372*58b9f456SAndroid Build Coastguard Worker 373*58b9f456SAndroid Build Coastguard Workertemplate <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 374*58b9f456SAndroid Build Coastguard Workertemplate <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 375*58b9f456SAndroid Build Coastguard Worker 376*58b9f456SAndroid Build Coastguard Workertemplate<class R, class T> unspecified mem_fn(R T::*); 377*58b9f456SAndroid Build Coastguard Worker 378*58b9f456SAndroid Build Coastguard Workerclass bad_function_call 379*58b9f456SAndroid Build Coastguard Worker : public exception 380*58b9f456SAndroid Build Coastguard Worker{ 381*58b9f456SAndroid Build Coastguard Worker}; 382*58b9f456SAndroid Build Coastguard Worker 383*58b9f456SAndroid Build Coastguard Workertemplate<class> class function; // undefined 384*58b9f456SAndroid Build Coastguard Worker 385*58b9f456SAndroid Build Coastguard Workertemplate<class R, class... ArgTypes> 386*58b9f456SAndroid Build Coastguard Workerclass function<R(ArgTypes...)> 387*58b9f456SAndroid Build Coastguard Worker : public unary_function<T1, R> // iff sizeof...(ArgTypes) == 1 and 388*58b9f456SAndroid Build Coastguard Worker // ArgTypes contains T1 389*58b9f456SAndroid Build Coastguard Worker : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and 390*58b9f456SAndroid Build Coastguard Worker // ArgTypes contains T1 and T2 391*58b9f456SAndroid Build Coastguard Worker{ 392*58b9f456SAndroid Build Coastguard Workerpublic: 393*58b9f456SAndroid Build Coastguard Worker typedef R result_type; 394*58b9f456SAndroid Build Coastguard Worker 395*58b9f456SAndroid Build Coastguard Worker // construct/copy/destroy: 396*58b9f456SAndroid Build Coastguard Worker function() noexcept; 397*58b9f456SAndroid Build Coastguard Worker function(nullptr_t) noexcept; 398*58b9f456SAndroid Build Coastguard Worker function(const function&); 399*58b9f456SAndroid Build Coastguard Worker function(function&&) noexcept; 400*58b9f456SAndroid Build Coastguard Worker template<class F> 401*58b9f456SAndroid Build Coastguard Worker function(F); 402*58b9f456SAndroid Build Coastguard Worker template<Allocator Alloc> 403*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const Alloc&) noexcept; // removed in C++17 404*58b9f456SAndroid Build Coastguard Worker template<Allocator Alloc> 405*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17 406*58b9f456SAndroid Build Coastguard Worker template<Allocator Alloc> 407*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const Alloc&, const function&); // removed in C++17 408*58b9f456SAndroid Build Coastguard Worker template<Allocator Alloc> 409*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const Alloc&, function&&); // removed in C++17 410*58b9f456SAndroid Build Coastguard Worker template<class F, Allocator Alloc> 411*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const Alloc&, F); // removed in C++17 412*58b9f456SAndroid Build Coastguard Worker 413*58b9f456SAndroid Build Coastguard Worker function& operator=(const function&); 414*58b9f456SAndroid Build Coastguard Worker function& operator=(function&&) noexcept; 415*58b9f456SAndroid Build Coastguard Worker function& operator=(nullptr_t) noexcept; 416*58b9f456SAndroid Build Coastguard Worker template<class F> 417*58b9f456SAndroid Build Coastguard Worker function& operator=(F&&); 418*58b9f456SAndroid Build Coastguard Worker template<class F> 419*58b9f456SAndroid Build Coastguard Worker function& operator=(reference_wrapper<F>) noexcept; 420*58b9f456SAndroid Build Coastguard Worker 421*58b9f456SAndroid Build Coastguard Worker ~function(); 422*58b9f456SAndroid Build Coastguard Worker 423*58b9f456SAndroid Build Coastguard Worker // function modifiers: 424*58b9f456SAndroid Build Coastguard Worker void swap(function&) noexcept; 425*58b9f456SAndroid Build Coastguard Worker template<class F, class Alloc> 426*58b9f456SAndroid Build Coastguard Worker void assign(F&&, const Alloc&); // Removed in C++17 427*58b9f456SAndroid Build Coastguard Worker 428*58b9f456SAndroid Build Coastguard Worker // function capacity: 429*58b9f456SAndroid Build Coastguard Worker explicit operator bool() const noexcept; 430*58b9f456SAndroid Build Coastguard Worker 431*58b9f456SAndroid Build Coastguard Worker // function invocation: 432*58b9f456SAndroid Build Coastguard Worker R operator()(ArgTypes...) const; 433*58b9f456SAndroid Build Coastguard Worker 434*58b9f456SAndroid Build Coastguard Worker // function target access: 435*58b9f456SAndroid Build Coastguard Worker const std::type_info& target_type() const noexcept; 436*58b9f456SAndroid Build Coastguard Worker template <typename T> T* target() noexcept; 437*58b9f456SAndroid Build Coastguard Worker template <typename T> const T* target() const noexcept; 438*58b9f456SAndroid Build Coastguard Worker}; 439*58b9f456SAndroid Build Coastguard Worker 440*58b9f456SAndroid Build Coastguard Worker// Null pointer comparisons: 441*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes> 442*58b9f456SAndroid Build Coastguard Worker bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept; 443*58b9f456SAndroid Build Coastguard Worker 444*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes> 445*58b9f456SAndroid Build Coastguard Worker bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept; 446*58b9f456SAndroid Build Coastguard Worker 447*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes> 448*58b9f456SAndroid Build Coastguard Worker bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept; 449*58b9f456SAndroid Build Coastguard Worker 450*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes> 451*58b9f456SAndroid Build Coastguard Worker bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept; 452*58b9f456SAndroid Build Coastguard Worker 453*58b9f456SAndroid Build Coastguard Worker// specialized algorithms: 454*58b9f456SAndroid Build Coastguard Workertemplate <class R, class ... ArgTypes> 455*58b9f456SAndroid Build Coastguard Worker void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept; 456*58b9f456SAndroid Build Coastguard Worker 457*58b9f456SAndroid Build Coastguard Workertemplate <class T> struct hash; 458*58b9f456SAndroid Build Coastguard Worker 459*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<bool>; 460*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<char>; 461*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<signed char>; 462*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned char>; 463*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<char16_t>; 464*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<char32_t>; 465*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<wchar_t>; 466*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<short>; 467*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned short>; 468*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<int>; 469*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned int>; 470*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<long>; 471*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<long long>; 472*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned long>; 473*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<unsigned long long>; 474*58b9f456SAndroid Build Coastguard Worker 475*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<float>; 476*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<double>; 477*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<long double>; 478*58b9f456SAndroid Build Coastguard Worker 479*58b9f456SAndroid Build Coastguard Workertemplate<class T> struct hash<T*>; 480*58b9f456SAndroid Build Coastguard Workertemplate <> struct hash<nullptr_t>; // C++17 481*58b9f456SAndroid Build Coastguard Worker 482*58b9f456SAndroid Build Coastguard Worker} // std 483*58b9f456SAndroid Build Coastguard Worker 484*58b9f456SAndroid Build Coastguard WorkerPOLICY: For non-variadic implementations, the number of arguments is limited 485*58b9f456SAndroid Build Coastguard Worker to 3. It is hoped that the need for non-variadic implementations 486*58b9f456SAndroid Build Coastguard Worker will be minimal. 487*58b9f456SAndroid Build Coastguard Worker 488*58b9f456SAndroid Build Coastguard Worker*/ 489*58b9f456SAndroid Build Coastguard Worker 490*58b9f456SAndroid Build Coastguard Worker#include <__config> 491*58b9f456SAndroid Build Coastguard Worker#include <type_traits> 492*58b9f456SAndroid Build Coastguard Worker#include <typeinfo> 493*58b9f456SAndroid Build Coastguard Worker#include <exception> 494*58b9f456SAndroid Build Coastguard Worker#include <memory> 495*58b9f456SAndroid Build Coastguard Worker#include <tuple> 496*58b9f456SAndroid Build Coastguard Worker#include <utility> 497*58b9f456SAndroid Build Coastguard Worker#include <version> 498*58b9f456SAndroid Build Coastguard Worker 499*58b9f456SAndroid Build Coastguard Worker#include <__functional_base> 500*58b9f456SAndroid Build Coastguard Worker 501*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 502*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header 503*58b9f456SAndroid Build Coastguard Worker#endif 504*58b9f456SAndroid Build Coastguard Worker 505*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD 506*58b9f456SAndroid Build Coastguard Worker 507*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 508*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 509*58b9f456SAndroid Build Coastguard Worker#else 510*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 511*58b9f456SAndroid Build Coastguard Worker#endif 512*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS plus : binary_function<_Tp, _Tp, _Tp> 513*58b9f456SAndroid Build Coastguard Worker{ 514*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 515*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 516*58b9f456SAndroid Build Coastguard Worker {return __x + __y;} 517*58b9f456SAndroid Build Coastguard Worker}; 518*58b9f456SAndroid Build Coastguard Worker 519*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 520*58b9f456SAndroid Build Coastguard Workertemplate <> 521*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS plus<void> 522*58b9f456SAndroid Build Coastguard Worker{ 523*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 524*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 525*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 526*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))) 527*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)) 528*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); } 529*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 530*58b9f456SAndroid Build Coastguard Worker}; 531*58b9f456SAndroid Build Coastguard Worker#endif 532*58b9f456SAndroid Build Coastguard Worker 533*58b9f456SAndroid Build Coastguard Worker 534*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 535*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 536*58b9f456SAndroid Build Coastguard Worker#else 537*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 538*58b9f456SAndroid Build Coastguard Worker#endif 539*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS minus : binary_function<_Tp, _Tp, _Tp> 540*58b9f456SAndroid Build Coastguard Worker{ 541*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 542*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 543*58b9f456SAndroid Build Coastguard Worker {return __x - __y;} 544*58b9f456SAndroid Build Coastguard Worker}; 545*58b9f456SAndroid Build Coastguard Worker 546*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 547*58b9f456SAndroid Build Coastguard Workertemplate <> 548*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS minus<void> 549*58b9f456SAndroid Build Coastguard Worker{ 550*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 551*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 552*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 553*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))) 554*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)) 555*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); } 556*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 557*58b9f456SAndroid Build Coastguard Worker}; 558*58b9f456SAndroid Build Coastguard Worker#endif 559*58b9f456SAndroid Build Coastguard Worker 560*58b9f456SAndroid Build Coastguard Worker 561*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 562*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 563*58b9f456SAndroid Build Coastguard Worker#else 564*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 565*58b9f456SAndroid Build Coastguard Worker#endif 566*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS multiplies : binary_function<_Tp, _Tp, _Tp> 567*58b9f456SAndroid Build Coastguard Worker{ 568*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 569*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 570*58b9f456SAndroid Build Coastguard Worker {return __x * __y;} 571*58b9f456SAndroid Build Coastguard Worker}; 572*58b9f456SAndroid Build Coastguard Worker 573*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 574*58b9f456SAndroid Build Coastguard Workertemplate <> 575*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS multiplies<void> 576*58b9f456SAndroid Build Coastguard Worker{ 577*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 578*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 579*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 580*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))) 581*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)) 582*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); } 583*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 584*58b9f456SAndroid Build Coastguard Worker}; 585*58b9f456SAndroid Build Coastguard Worker#endif 586*58b9f456SAndroid Build Coastguard Worker 587*58b9f456SAndroid Build Coastguard Worker 588*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 589*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 590*58b9f456SAndroid Build Coastguard Worker#else 591*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 592*58b9f456SAndroid Build Coastguard Worker#endif 593*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS divides : binary_function<_Tp, _Tp, _Tp> 594*58b9f456SAndroid Build Coastguard Worker{ 595*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 596*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 597*58b9f456SAndroid Build Coastguard Worker {return __x / __y;} 598*58b9f456SAndroid Build Coastguard Worker}; 599*58b9f456SAndroid Build Coastguard Worker 600*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 601*58b9f456SAndroid Build Coastguard Workertemplate <> 602*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS divides<void> 603*58b9f456SAndroid Build Coastguard Worker{ 604*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 605*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 606*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 607*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))) 608*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)) 609*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); } 610*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 611*58b9f456SAndroid Build Coastguard Worker}; 612*58b9f456SAndroid Build Coastguard Worker#endif 613*58b9f456SAndroid Build Coastguard Worker 614*58b9f456SAndroid Build Coastguard Worker 615*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 616*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 617*58b9f456SAndroid Build Coastguard Worker#else 618*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 619*58b9f456SAndroid Build Coastguard Worker#endif 620*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS modulus : binary_function<_Tp, _Tp, _Tp> 621*58b9f456SAndroid Build Coastguard Worker{ 622*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 623*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 624*58b9f456SAndroid Build Coastguard Worker {return __x % __y;} 625*58b9f456SAndroid Build Coastguard Worker}; 626*58b9f456SAndroid Build Coastguard Worker 627*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 628*58b9f456SAndroid Build Coastguard Workertemplate <> 629*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS modulus<void> 630*58b9f456SAndroid Build Coastguard Worker{ 631*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 632*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 633*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 634*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))) 635*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)) 636*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); } 637*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 638*58b9f456SAndroid Build Coastguard Worker}; 639*58b9f456SAndroid Build Coastguard Worker#endif 640*58b9f456SAndroid Build Coastguard Worker 641*58b9f456SAndroid Build Coastguard Worker 642*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 643*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 644*58b9f456SAndroid Build Coastguard Worker#else 645*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 646*58b9f456SAndroid Build Coastguard Worker#endif 647*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS negate : unary_function<_Tp, _Tp> 648*58b9f456SAndroid Build Coastguard Worker{ 649*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 650*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x) const 651*58b9f456SAndroid Build Coastguard Worker {return -__x;} 652*58b9f456SAndroid Build Coastguard Worker}; 653*58b9f456SAndroid Build Coastguard Worker 654*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 655*58b9f456SAndroid Build Coastguard Workertemplate <> 656*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS negate<void> 657*58b9f456SAndroid Build Coastguard Worker{ 658*58b9f456SAndroid Build Coastguard Worker template <class _Tp> 659*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 660*58b9f456SAndroid Build Coastguard Worker auto operator()(_Tp&& __x) const 661*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x))) 662*58b9f456SAndroid Build Coastguard Worker -> decltype (- _VSTD::forward<_Tp>(__x)) 663*58b9f456SAndroid Build Coastguard Worker { return - _VSTD::forward<_Tp>(__x); } 664*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 665*58b9f456SAndroid Build Coastguard Worker}; 666*58b9f456SAndroid Build Coastguard Worker#endif 667*58b9f456SAndroid Build Coastguard Worker 668*58b9f456SAndroid Build Coastguard Worker 669*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 670*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 671*58b9f456SAndroid Build Coastguard Worker#else 672*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 673*58b9f456SAndroid Build Coastguard Worker#endif 674*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS equal_to : binary_function<_Tp, _Tp, bool> 675*58b9f456SAndroid Build Coastguard Worker{ 676*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 677*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x, const _Tp& __y) const 678*58b9f456SAndroid Build Coastguard Worker {return __x == __y;} 679*58b9f456SAndroid Build Coastguard Worker}; 680*58b9f456SAndroid Build Coastguard Worker 681*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 682*58b9f456SAndroid Build Coastguard Workertemplate <> 683*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS equal_to<void> 684*58b9f456SAndroid Build Coastguard Worker{ 685*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 686*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 687*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 688*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))) 689*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)) 690*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); } 691*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 692*58b9f456SAndroid Build Coastguard Worker}; 693*58b9f456SAndroid Build Coastguard Worker#endif 694*58b9f456SAndroid Build Coastguard Worker 695*58b9f456SAndroid Build Coastguard Worker 696*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 697*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 698*58b9f456SAndroid Build Coastguard Worker#else 699*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 700*58b9f456SAndroid Build Coastguard Worker#endif 701*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS not_equal_to : binary_function<_Tp, _Tp, bool> 702*58b9f456SAndroid Build Coastguard Worker{ 703*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 704*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x, const _Tp& __y) const 705*58b9f456SAndroid Build Coastguard Worker {return __x != __y;} 706*58b9f456SAndroid Build Coastguard Worker}; 707*58b9f456SAndroid Build Coastguard Worker 708*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 709*58b9f456SAndroid Build Coastguard Workertemplate <> 710*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS not_equal_to<void> 711*58b9f456SAndroid Build Coastguard Worker{ 712*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 713*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 714*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 715*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))) 716*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)) 717*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); } 718*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 719*58b9f456SAndroid Build Coastguard Worker}; 720*58b9f456SAndroid Build Coastguard Worker#endif 721*58b9f456SAndroid Build Coastguard Worker 722*58b9f456SAndroid Build Coastguard Worker 723*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 724*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 725*58b9f456SAndroid Build Coastguard Worker#else 726*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 727*58b9f456SAndroid Build Coastguard Worker#endif 728*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool> 729*58b9f456SAndroid Build Coastguard Worker{ 730*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 731*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x, const _Tp& __y) const 732*58b9f456SAndroid Build Coastguard Worker {return __x > __y;} 733*58b9f456SAndroid Build Coastguard Worker}; 734*58b9f456SAndroid Build Coastguard Worker 735*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 736*58b9f456SAndroid Build Coastguard Workertemplate <> 737*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater<void> 738*58b9f456SAndroid Build Coastguard Worker{ 739*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 740*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 741*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 742*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))) 743*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)) 744*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); } 745*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 746*58b9f456SAndroid Build Coastguard Worker}; 747*58b9f456SAndroid Build Coastguard Worker#endif 748*58b9f456SAndroid Build Coastguard Worker 749*58b9f456SAndroid Build Coastguard Worker 750*58b9f456SAndroid Build Coastguard Worker// less in <__functional_base> 751*58b9f456SAndroid Build Coastguard Worker 752*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 753*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 754*58b9f456SAndroid Build Coastguard Worker#else 755*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 756*58b9f456SAndroid Build Coastguard Worker#endif 757*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater_equal : binary_function<_Tp, _Tp, bool> 758*58b9f456SAndroid Build Coastguard Worker{ 759*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 760*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x, const _Tp& __y) const 761*58b9f456SAndroid Build Coastguard Worker {return __x >= __y;} 762*58b9f456SAndroid Build Coastguard Worker}; 763*58b9f456SAndroid Build Coastguard Worker 764*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 765*58b9f456SAndroid Build Coastguard Workertemplate <> 766*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS greater_equal<void> 767*58b9f456SAndroid Build Coastguard Worker{ 768*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 769*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 770*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 771*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))) 772*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)) 773*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); } 774*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 775*58b9f456SAndroid Build Coastguard Worker}; 776*58b9f456SAndroid Build Coastguard Worker#endif 777*58b9f456SAndroid Build Coastguard Worker 778*58b9f456SAndroid Build Coastguard Worker 779*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 780*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 781*58b9f456SAndroid Build Coastguard Worker#else 782*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 783*58b9f456SAndroid Build Coastguard Worker#endif 784*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS less_equal : binary_function<_Tp, _Tp, bool> 785*58b9f456SAndroid Build Coastguard Worker{ 786*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 787*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x, const _Tp& __y) const 788*58b9f456SAndroid Build Coastguard Worker {return __x <= __y;} 789*58b9f456SAndroid Build Coastguard Worker}; 790*58b9f456SAndroid Build Coastguard Worker 791*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 792*58b9f456SAndroid Build Coastguard Workertemplate <> 793*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS less_equal<void> 794*58b9f456SAndroid Build Coastguard Worker{ 795*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 796*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 797*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 798*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))) 799*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)) 800*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); } 801*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 802*58b9f456SAndroid Build Coastguard Worker}; 803*58b9f456SAndroid Build Coastguard Worker#endif 804*58b9f456SAndroid Build Coastguard Worker 805*58b9f456SAndroid Build Coastguard Worker 806*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 807*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 808*58b9f456SAndroid Build Coastguard Worker#else 809*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 810*58b9f456SAndroid Build Coastguard Worker#endif 811*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_and : binary_function<_Tp, _Tp, bool> 812*58b9f456SAndroid Build Coastguard Worker{ 813*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 814*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x, const _Tp& __y) const 815*58b9f456SAndroid Build Coastguard Worker {return __x && __y;} 816*58b9f456SAndroid Build Coastguard Worker}; 817*58b9f456SAndroid Build Coastguard Worker 818*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 819*58b9f456SAndroid Build Coastguard Workertemplate <> 820*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_and<void> 821*58b9f456SAndroid Build Coastguard Worker{ 822*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 823*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 824*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 825*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))) 826*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)) 827*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); } 828*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 829*58b9f456SAndroid Build Coastguard Worker}; 830*58b9f456SAndroid Build Coastguard Worker#endif 831*58b9f456SAndroid Build Coastguard Worker 832*58b9f456SAndroid Build Coastguard Worker 833*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 834*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 835*58b9f456SAndroid Build Coastguard Worker#else 836*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 837*58b9f456SAndroid Build Coastguard Worker#endif 838*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_or : binary_function<_Tp, _Tp, bool> 839*58b9f456SAndroid Build Coastguard Worker{ 840*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 841*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x, const _Tp& __y) const 842*58b9f456SAndroid Build Coastguard Worker {return __x || __y;} 843*58b9f456SAndroid Build Coastguard Worker}; 844*58b9f456SAndroid Build Coastguard Worker 845*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 846*58b9f456SAndroid Build Coastguard Workertemplate <> 847*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_or<void> 848*58b9f456SAndroid Build Coastguard Worker{ 849*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 850*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 851*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 852*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))) 853*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)) 854*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); } 855*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 856*58b9f456SAndroid Build Coastguard Worker}; 857*58b9f456SAndroid Build Coastguard Worker#endif 858*58b9f456SAndroid Build Coastguard Worker 859*58b9f456SAndroid Build Coastguard Worker 860*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 861*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 862*58b9f456SAndroid Build Coastguard Worker#else 863*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 864*58b9f456SAndroid Build Coastguard Worker#endif 865*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_not : unary_function<_Tp, bool> 866*58b9f456SAndroid Build Coastguard Worker{ 867*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 868*58b9f456SAndroid Build Coastguard Worker bool operator()(const _Tp& __x) const 869*58b9f456SAndroid Build Coastguard Worker {return !__x;} 870*58b9f456SAndroid Build Coastguard Worker}; 871*58b9f456SAndroid Build Coastguard Worker 872*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 873*58b9f456SAndroid Build Coastguard Workertemplate <> 874*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS logical_not<void> 875*58b9f456SAndroid Build Coastguard Worker{ 876*58b9f456SAndroid Build Coastguard Worker template <class _Tp> 877*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 878*58b9f456SAndroid Build Coastguard Worker auto operator()(_Tp&& __x) const 879*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x))) 880*58b9f456SAndroid Build Coastguard Worker -> decltype (!_VSTD::forward<_Tp>(__x)) 881*58b9f456SAndroid Build Coastguard Worker { return !_VSTD::forward<_Tp>(__x); } 882*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 883*58b9f456SAndroid Build Coastguard Worker}; 884*58b9f456SAndroid Build Coastguard Worker#endif 885*58b9f456SAndroid Build Coastguard Worker 886*58b9f456SAndroid Build Coastguard Worker 887*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 888*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 889*58b9f456SAndroid Build Coastguard Worker#else 890*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 891*58b9f456SAndroid Build Coastguard Worker#endif 892*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_and : binary_function<_Tp, _Tp, _Tp> 893*58b9f456SAndroid Build Coastguard Worker{ 894*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 895*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 896*58b9f456SAndroid Build Coastguard Worker {return __x & __y;} 897*58b9f456SAndroid Build Coastguard Worker}; 898*58b9f456SAndroid Build Coastguard Worker 899*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 900*58b9f456SAndroid Build Coastguard Workertemplate <> 901*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_and<void> 902*58b9f456SAndroid Build Coastguard Worker{ 903*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 904*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 905*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 906*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))) 907*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)) 908*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); } 909*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 910*58b9f456SAndroid Build Coastguard Worker}; 911*58b9f456SAndroid Build Coastguard Worker#endif 912*58b9f456SAndroid Build Coastguard Worker 913*58b9f456SAndroid Build Coastguard Worker 914*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 915*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 916*58b9f456SAndroid Build Coastguard Worker#else 917*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 918*58b9f456SAndroid Build Coastguard Worker#endif 919*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_or : binary_function<_Tp, _Tp, _Tp> 920*58b9f456SAndroid Build Coastguard Worker{ 921*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 922*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 923*58b9f456SAndroid Build Coastguard Worker {return __x | __y;} 924*58b9f456SAndroid Build Coastguard Worker}; 925*58b9f456SAndroid Build Coastguard Worker 926*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 927*58b9f456SAndroid Build Coastguard Workertemplate <> 928*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_or<void> 929*58b9f456SAndroid Build Coastguard Worker{ 930*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 931*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 932*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 933*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))) 934*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)) 935*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); } 936*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 937*58b9f456SAndroid Build Coastguard Worker}; 938*58b9f456SAndroid Build Coastguard Worker#endif 939*58b9f456SAndroid Build Coastguard Worker 940*58b9f456SAndroid Build Coastguard Worker 941*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 942*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 943*58b9f456SAndroid Build Coastguard Worker#else 944*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 945*58b9f456SAndroid Build Coastguard Worker#endif 946*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_xor : binary_function<_Tp, _Tp, _Tp> 947*58b9f456SAndroid Build Coastguard Worker{ 948*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 949*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x, const _Tp& __y) const 950*58b9f456SAndroid Build Coastguard Worker {return __x ^ __y;} 951*58b9f456SAndroid Build Coastguard Worker}; 952*58b9f456SAndroid Build Coastguard Worker 953*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 954*58b9f456SAndroid Build Coastguard Workertemplate <> 955*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_xor<void> 956*58b9f456SAndroid Build Coastguard Worker{ 957*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 958*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 959*58b9f456SAndroid Build Coastguard Worker auto operator()(_T1&& __t, _T2&& __u) const 960*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))) 961*58b9f456SAndroid Build Coastguard Worker -> decltype (_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)) 962*58b9f456SAndroid Build Coastguard Worker { return _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); } 963*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 964*58b9f456SAndroid Build Coastguard Worker}; 965*58b9f456SAndroid Build Coastguard Worker#endif 966*58b9f456SAndroid Build Coastguard Worker 967*58b9f456SAndroid Build Coastguard Worker 968*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 969*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void> 970*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_not : unary_function<_Tp, _Tp> 971*58b9f456SAndroid Build Coastguard Worker{ 972*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 973*58b9f456SAndroid Build Coastguard Worker _Tp operator()(const _Tp& __x) const 974*58b9f456SAndroid Build Coastguard Worker {return ~__x;} 975*58b9f456SAndroid Build Coastguard Worker}; 976*58b9f456SAndroid Build Coastguard Worker 977*58b9f456SAndroid Build Coastguard Workertemplate <> 978*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS bit_not<void> 979*58b9f456SAndroid Build Coastguard Worker{ 980*58b9f456SAndroid Build Coastguard Worker template <class _Tp> 981*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 982*58b9f456SAndroid Build Coastguard Worker auto operator()(_Tp&& __x) const 983*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x))) 984*58b9f456SAndroid Build Coastguard Worker -> decltype (~_VSTD::forward<_Tp>(__x)) 985*58b9f456SAndroid Build Coastguard Worker { return ~_VSTD::forward<_Tp>(__x); } 986*58b9f456SAndroid Build Coastguard Worker typedef void is_transparent; 987*58b9f456SAndroid Build Coastguard Worker}; 988*58b9f456SAndroid Build Coastguard Worker#endif 989*58b9f456SAndroid Build Coastguard Worker 990*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate> 991*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 unary_negate 992*58b9f456SAndroid Build Coastguard Worker : public unary_function<typename _Predicate::argument_type, bool> 993*58b9f456SAndroid Build Coastguard Worker{ 994*58b9f456SAndroid Build Coastguard Worker _Predicate __pred_; 995*58b9f456SAndroid Build Coastguard Workerpublic: 996*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 997*58b9f456SAndroid Build Coastguard Worker explicit unary_negate(const _Predicate& __pred) 998*58b9f456SAndroid Build Coastguard Worker : __pred_(__pred) {} 999*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 1000*58b9f456SAndroid Build Coastguard Worker bool operator()(const typename _Predicate::argument_type& __x) const 1001*58b9f456SAndroid Build Coastguard Worker {return !__pred_(__x);} 1002*58b9f456SAndroid Build Coastguard Worker}; 1003*58b9f456SAndroid Build Coastguard Worker 1004*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate> 1005*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 1006*58b9f456SAndroid Build Coastguard Workerunary_negate<_Predicate> 1007*58b9f456SAndroid Build Coastguard Workernot1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);} 1008*58b9f456SAndroid Build Coastguard Worker 1009*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate> 1010*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 binary_negate 1011*58b9f456SAndroid Build Coastguard Worker : public binary_function<typename _Predicate::first_argument_type, 1012*58b9f456SAndroid Build Coastguard Worker typename _Predicate::second_argument_type, 1013*58b9f456SAndroid Build Coastguard Worker bool> 1014*58b9f456SAndroid Build Coastguard Worker{ 1015*58b9f456SAndroid Build Coastguard Worker _Predicate __pred_; 1016*58b9f456SAndroid Build Coastguard Workerpublic: 1017*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11 1018*58b9f456SAndroid Build Coastguard Worker binary_negate(const _Predicate& __pred) : __pred_(__pred) {} 1019*58b9f456SAndroid Build Coastguard Worker 1020*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 1021*58b9f456SAndroid Build Coastguard Worker bool operator()(const typename _Predicate::first_argument_type& __x, 1022*58b9f456SAndroid Build Coastguard Worker const typename _Predicate::second_argument_type& __y) const 1023*58b9f456SAndroid Build Coastguard Worker {return !__pred_(__x, __y);} 1024*58b9f456SAndroid Build Coastguard Worker}; 1025*58b9f456SAndroid Build Coastguard Worker 1026*58b9f456SAndroid Build Coastguard Workertemplate <class _Predicate> 1027*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 1028*58b9f456SAndroid Build Coastguard Workerbinary_negate<_Predicate> 1029*58b9f456SAndroid Build Coastguard Workernot2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);} 1030*58b9f456SAndroid Build Coastguard Worker 1031*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) 1032*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation> 1033*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder1st 1034*58b9f456SAndroid Build Coastguard Worker : public unary_function<typename __Operation::second_argument_type, 1035*58b9f456SAndroid Build Coastguard Worker typename __Operation::result_type> 1036*58b9f456SAndroid Build Coastguard Worker{ 1037*58b9f456SAndroid Build Coastguard Workerprotected: 1038*58b9f456SAndroid Build Coastguard Worker __Operation op; 1039*58b9f456SAndroid Build Coastguard Worker typename __Operation::first_argument_type value; 1040*58b9f456SAndroid Build Coastguard Workerpublic: 1041*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x, 1042*58b9f456SAndroid Build Coastguard Worker const typename __Operation::first_argument_type __y) 1043*58b9f456SAndroid Build Coastguard Worker : op(__x), value(__y) {} 1044*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() 1045*58b9f456SAndroid Build Coastguard Worker (typename __Operation::second_argument_type& __x) const 1046*58b9f456SAndroid Build Coastguard Worker {return op(value, __x);} 1047*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() 1048*58b9f456SAndroid Build Coastguard Worker (const typename __Operation::second_argument_type& __x) const 1049*58b9f456SAndroid Build Coastguard Worker {return op(value, __x);} 1050*58b9f456SAndroid Build Coastguard Worker}; 1051*58b9f456SAndroid Build Coastguard Worker 1052*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation, class _Tp> 1053*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1054*58b9f456SAndroid Build Coastguard Workerbinder1st<__Operation> 1055*58b9f456SAndroid Build Coastguard Workerbind1st(const __Operation& __op, const _Tp& __x) 1056*58b9f456SAndroid Build Coastguard Worker {return binder1st<__Operation>(__op, __x);} 1057*58b9f456SAndroid Build Coastguard Worker 1058*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation> 1059*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder2nd 1060*58b9f456SAndroid Build Coastguard Worker : public unary_function<typename __Operation::first_argument_type, 1061*58b9f456SAndroid Build Coastguard Worker typename __Operation::result_type> 1062*58b9f456SAndroid Build Coastguard Worker{ 1063*58b9f456SAndroid Build Coastguard Workerprotected: 1064*58b9f456SAndroid Build Coastguard Worker __Operation op; 1065*58b9f456SAndroid Build Coastguard Worker typename __Operation::second_argument_type value; 1066*58b9f456SAndroid Build Coastguard Workerpublic: 1067*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1068*58b9f456SAndroid Build Coastguard Worker binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y) 1069*58b9f456SAndroid Build Coastguard Worker : op(__x), value(__y) {} 1070*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() 1071*58b9f456SAndroid Build Coastguard Worker ( typename __Operation::first_argument_type& __x) const 1072*58b9f456SAndroid Build Coastguard Worker {return op(__x, value);} 1073*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() 1074*58b9f456SAndroid Build Coastguard Worker (const typename __Operation::first_argument_type& __x) const 1075*58b9f456SAndroid Build Coastguard Worker {return op(__x, value);} 1076*58b9f456SAndroid Build Coastguard Worker}; 1077*58b9f456SAndroid Build Coastguard Worker 1078*58b9f456SAndroid Build Coastguard Workertemplate <class __Operation, class _Tp> 1079*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1080*58b9f456SAndroid Build Coastguard Workerbinder2nd<__Operation> 1081*58b9f456SAndroid Build Coastguard Workerbind2nd(const __Operation& __op, const _Tp& __x) 1082*58b9f456SAndroid Build Coastguard Worker {return binder2nd<__Operation>(__op, __x);} 1083*58b9f456SAndroid Build Coastguard Worker 1084*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg, class _Result> 1085*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_unary_function 1086*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Arg, _Result> 1087*58b9f456SAndroid Build Coastguard Worker{ 1088*58b9f456SAndroid Build Coastguard Worker _Result (*__f_)(_Arg); 1089*58b9f456SAndroid Build Coastguard Workerpublic: 1090*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg)) 1091*58b9f456SAndroid Build Coastguard Worker : __f_(__f) {} 1092*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const 1093*58b9f456SAndroid Build Coastguard Worker {return __f_(__x);} 1094*58b9f456SAndroid Build Coastguard Worker}; 1095*58b9f456SAndroid Build Coastguard Worker 1096*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg, class _Result> 1097*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1098*58b9f456SAndroid Build Coastguard Workerpointer_to_unary_function<_Arg,_Result> 1099*58b9f456SAndroid Build Coastguard Workerptr_fun(_Result (*__f)(_Arg)) 1100*58b9f456SAndroid Build Coastguard Worker {return pointer_to_unary_function<_Arg,_Result>(__f);} 1101*58b9f456SAndroid Build Coastguard Worker 1102*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg1, class _Arg2, class _Result> 1103*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_binary_function 1104*58b9f456SAndroid Build Coastguard Worker : public binary_function<_Arg1, _Arg2, _Result> 1105*58b9f456SAndroid Build Coastguard Worker{ 1106*58b9f456SAndroid Build Coastguard Worker _Result (*__f_)(_Arg1, _Arg2); 1107*58b9f456SAndroid Build Coastguard Workerpublic: 1108*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2)) 1109*58b9f456SAndroid Build Coastguard Worker : __f_(__f) {} 1110*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const 1111*58b9f456SAndroid Build Coastguard Worker {return __f_(__x, __y);} 1112*58b9f456SAndroid Build Coastguard Worker}; 1113*58b9f456SAndroid Build Coastguard Worker 1114*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg1, class _Arg2, class _Result> 1115*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1116*58b9f456SAndroid Build Coastguard Workerpointer_to_binary_function<_Arg1,_Arg2,_Result> 1117*58b9f456SAndroid Build Coastguard Workerptr_fun(_Result (*__f)(_Arg1,_Arg2)) 1118*58b9f456SAndroid Build Coastguard Worker {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);} 1119*58b9f456SAndroid Build Coastguard Worker 1120*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp> 1121*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_t 1122*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp*, _Sp> 1123*58b9f456SAndroid Build Coastguard Worker{ 1124*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)(); 1125*58b9f456SAndroid Build Coastguard Workerpublic: 1126*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)()) 1127*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1128*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const 1129*58b9f456SAndroid Build Coastguard Worker {return (__p->*__p_)();} 1130*58b9f456SAndroid Build Coastguard Worker}; 1131*58b9f456SAndroid Build Coastguard Worker 1132*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap> 1133*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_t 1134*58b9f456SAndroid Build Coastguard Worker : public binary_function<_Tp*, _Ap, _Sp> 1135*58b9f456SAndroid Build Coastguard Worker{ 1136*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)(_Ap); 1137*58b9f456SAndroid Build Coastguard Workerpublic: 1138*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap)) 1139*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1140*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const 1141*58b9f456SAndroid Build Coastguard Worker {return (__p->*__p_)(__x);} 1142*58b9f456SAndroid Build Coastguard Worker}; 1143*58b9f456SAndroid Build Coastguard Worker 1144*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp> 1145*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1146*58b9f456SAndroid Build Coastguard Workermem_fun_t<_Sp,_Tp> 1147*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)()) 1148*58b9f456SAndroid Build Coastguard Worker {return mem_fun_t<_Sp,_Tp>(__f);} 1149*58b9f456SAndroid Build Coastguard Worker 1150*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap> 1151*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1152*58b9f456SAndroid Build Coastguard Workermem_fun1_t<_Sp,_Tp,_Ap> 1153*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)(_Ap)) 1154*58b9f456SAndroid Build Coastguard Worker {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);} 1155*58b9f456SAndroid Build Coastguard Worker 1156*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp> 1157*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_ref_t 1158*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, _Sp> 1159*58b9f456SAndroid Build Coastguard Worker{ 1160*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)(); 1161*58b9f456SAndroid Build Coastguard Workerpublic: 1162*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)()) 1163*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1164*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const 1165*58b9f456SAndroid Build Coastguard Worker {return (__p.*__p_)();} 1166*58b9f456SAndroid Build Coastguard Worker}; 1167*58b9f456SAndroid Build Coastguard Worker 1168*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap> 1169*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_ref_t 1170*58b9f456SAndroid Build Coastguard Worker : public binary_function<_Tp, _Ap, _Sp> 1171*58b9f456SAndroid Build Coastguard Worker{ 1172*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)(_Ap); 1173*58b9f456SAndroid Build Coastguard Workerpublic: 1174*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap)) 1175*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1176*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const 1177*58b9f456SAndroid Build Coastguard Worker {return (__p.*__p_)(__x);} 1178*58b9f456SAndroid Build Coastguard Worker}; 1179*58b9f456SAndroid Build Coastguard Worker 1180*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp> 1181*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1182*58b9f456SAndroid Build Coastguard Workermem_fun_ref_t<_Sp,_Tp> 1183*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)()) 1184*58b9f456SAndroid Build Coastguard Worker {return mem_fun_ref_t<_Sp,_Tp>(__f);} 1185*58b9f456SAndroid Build Coastguard Worker 1186*58b9f456SAndroid Build Coastguard Workertemplate<class _Sp, class _Tp, class _Ap> 1187*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1188*58b9f456SAndroid Build Coastguard Workermem_fun1_ref_t<_Sp,_Tp,_Ap> 1189*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)(_Ap)) 1190*58b9f456SAndroid Build Coastguard Worker {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);} 1191*58b9f456SAndroid Build Coastguard Worker 1192*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp> 1193*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_t 1194*58b9f456SAndroid Build Coastguard Worker : public unary_function<const _Tp*, _Sp> 1195*58b9f456SAndroid Build Coastguard Worker{ 1196*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)() const; 1197*58b9f456SAndroid Build Coastguard Workerpublic: 1198*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const) 1199*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1200*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const 1201*58b9f456SAndroid Build Coastguard Worker {return (__p->*__p_)();} 1202*58b9f456SAndroid Build Coastguard Worker}; 1203*58b9f456SAndroid Build Coastguard Worker 1204*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap> 1205*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_t 1206*58b9f456SAndroid Build Coastguard Worker : public binary_function<const _Tp*, _Ap, _Sp> 1207*58b9f456SAndroid Build Coastguard Worker{ 1208*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)(_Ap) const; 1209*58b9f456SAndroid Build Coastguard Workerpublic: 1210*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const) 1211*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1212*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const 1213*58b9f456SAndroid Build Coastguard Worker {return (__p->*__p_)(__x);} 1214*58b9f456SAndroid Build Coastguard Worker}; 1215*58b9f456SAndroid Build Coastguard Worker 1216*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp> 1217*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1218*58b9f456SAndroid Build Coastguard Workerconst_mem_fun_t<_Sp,_Tp> 1219*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)() const) 1220*58b9f456SAndroid Build Coastguard Worker {return const_mem_fun_t<_Sp,_Tp>(__f);} 1221*58b9f456SAndroid Build Coastguard Worker 1222*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap> 1223*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1224*58b9f456SAndroid Build Coastguard Workerconst_mem_fun1_t<_Sp,_Tp,_Ap> 1225*58b9f456SAndroid Build Coastguard Workermem_fun(_Sp (_Tp::*__f)(_Ap) const) 1226*58b9f456SAndroid Build Coastguard Worker {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);} 1227*58b9f456SAndroid Build Coastguard Worker 1228*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp> 1229*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_ref_t 1230*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, _Sp> 1231*58b9f456SAndroid Build Coastguard Worker{ 1232*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)() const; 1233*58b9f456SAndroid Build Coastguard Workerpublic: 1234*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const) 1235*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1236*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const 1237*58b9f456SAndroid Build Coastguard Worker {return (__p.*__p_)();} 1238*58b9f456SAndroid Build Coastguard Worker}; 1239*58b9f456SAndroid Build Coastguard Worker 1240*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap> 1241*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_ref_t 1242*58b9f456SAndroid Build Coastguard Worker : public binary_function<_Tp, _Ap, _Sp> 1243*58b9f456SAndroid Build Coastguard Worker{ 1244*58b9f456SAndroid Build Coastguard Worker _Sp (_Tp::*__p_)(_Ap) const; 1245*58b9f456SAndroid Build Coastguard Workerpublic: 1246*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const) 1247*58b9f456SAndroid Build Coastguard Worker : __p_(__p) {} 1248*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const 1249*58b9f456SAndroid Build Coastguard Worker {return (__p.*__p_)(__x);} 1250*58b9f456SAndroid Build Coastguard Worker}; 1251*58b9f456SAndroid Build Coastguard Worker 1252*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp> 1253*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1254*58b9f456SAndroid Build Coastguard Workerconst_mem_fun_ref_t<_Sp,_Tp> 1255*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)() const) 1256*58b9f456SAndroid Build Coastguard Worker {return const_mem_fun_ref_t<_Sp,_Tp>(__f);} 1257*58b9f456SAndroid Build Coastguard Worker 1258*58b9f456SAndroid Build Coastguard Workertemplate <class _Sp, class _Tp, class _Ap> 1259*58b9f456SAndroid Build Coastguard Worker_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY 1260*58b9f456SAndroid Build Coastguard Workerconst_mem_fun1_ref_t<_Sp,_Tp,_Ap> 1261*58b9f456SAndroid Build Coastguard Workermem_fun_ref(_Sp (_Tp::*__f)(_Ap) const) 1262*58b9f456SAndroid Build Coastguard Worker {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);} 1263*58b9f456SAndroid Build Coastguard Worker#endif 1264*58b9f456SAndroid Build Coastguard Worker 1265*58b9f456SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 1266*58b9f456SAndroid Build Coastguard Worker// MEMFUN 1267*58b9f456SAndroid Build Coastguard Worker//============================================================================== 1268*58b9f456SAndroid Build Coastguard Worker 1269*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1270*58b9f456SAndroid Build Coastguard Workerclass __mem_fn 1271*58b9f456SAndroid Build Coastguard Worker : public __weak_result_type<_Tp> 1272*58b9f456SAndroid Build Coastguard Worker{ 1273*58b9f456SAndroid Build Coastguard Workerpublic: 1274*58b9f456SAndroid Build Coastguard Worker // types 1275*58b9f456SAndroid Build Coastguard Worker typedef _Tp type; 1276*58b9f456SAndroid Build Coastguard Workerprivate: 1277*58b9f456SAndroid Build Coastguard Worker type __f_; 1278*58b9f456SAndroid Build Coastguard Worker 1279*58b9f456SAndroid Build Coastguard Workerpublic: 1280*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {} 1281*58b9f456SAndroid Build Coastguard Worker 1282*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 1283*58b9f456SAndroid Build Coastguard Worker // invoke 1284*58b9f456SAndroid Build Coastguard Worker template <class... _ArgTypes> 1285*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1286*58b9f456SAndroid Build Coastguard Worker typename __invoke_return<type, _ArgTypes...>::type 1287*58b9f456SAndroid Build Coastguard Worker operator() (_ArgTypes&&... __args) const { 1288*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...); 1289*58b9f456SAndroid Build Coastguard Worker } 1290*58b9f456SAndroid Build Coastguard Worker#else 1291*58b9f456SAndroid Build Coastguard Worker 1292*58b9f456SAndroid Build Coastguard Worker template <class _A0> 1293*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1294*58b9f456SAndroid Build Coastguard Worker typename __invoke_return0<type, _A0>::type 1295*58b9f456SAndroid Build Coastguard Worker operator() (_A0& __a0) const { 1296*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0); 1297*58b9f456SAndroid Build Coastguard Worker } 1298*58b9f456SAndroid Build Coastguard Worker 1299*58b9f456SAndroid Build Coastguard Worker template <class _A0> 1300*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1301*58b9f456SAndroid Build Coastguard Worker typename __invoke_return0<type, _A0 const>::type 1302*58b9f456SAndroid Build Coastguard Worker operator() (_A0 const& __a0) const { 1303*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0); 1304*58b9f456SAndroid Build Coastguard Worker } 1305*58b9f456SAndroid Build Coastguard Worker 1306*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1> 1307*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1308*58b9f456SAndroid Build Coastguard Worker typename __invoke_return1<type, _A0, _A1>::type 1309*58b9f456SAndroid Build Coastguard Worker operator() (_A0& __a0, _A1& __a1) const { 1310*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1); 1311*58b9f456SAndroid Build Coastguard Worker } 1312*58b9f456SAndroid Build Coastguard Worker 1313*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1> 1314*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1315*58b9f456SAndroid Build Coastguard Worker typename __invoke_return1<type, _A0 const, _A1>::type 1316*58b9f456SAndroid Build Coastguard Worker operator() (_A0 const& __a0, _A1& __a1) const { 1317*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1); 1318*58b9f456SAndroid Build Coastguard Worker } 1319*58b9f456SAndroid Build Coastguard Worker 1320*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1> 1321*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1322*58b9f456SAndroid Build Coastguard Worker typename __invoke_return1<type, _A0, _A1 const>::type 1323*58b9f456SAndroid Build Coastguard Worker operator() (_A0& __a0, _A1 const& __a1) const { 1324*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1); 1325*58b9f456SAndroid Build Coastguard Worker } 1326*58b9f456SAndroid Build Coastguard Worker 1327*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1> 1328*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1329*58b9f456SAndroid Build Coastguard Worker typename __invoke_return1<type, _A0 const, _A1 const>::type 1330*58b9f456SAndroid Build Coastguard Worker operator() (_A0 const& __a0, _A1 const& __a1) const { 1331*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1); 1332*58b9f456SAndroid Build Coastguard Worker } 1333*58b9f456SAndroid Build Coastguard Worker 1334*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1335*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1336*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0, _A1, _A2>::type 1337*58b9f456SAndroid Build Coastguard Worker operator() (_A0& __a0, _A1& __a1, _A2& __a2) const { 1338*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1339*58b9f456SAndroid Build Coastguard Worker } 1340*58b9f456SAndroid Build Coastguard Worker 1341*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1342*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1343*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0 const, _A1, _A2>::type 1344*58b9f456SAndroid Build Coastguard Worker operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const { 1345*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1346*58b9f456SAndroid Build Coastguard Worker } 1347*58b9f456SAndroid Build Coastguard Worker 1348*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1349*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1350*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0, _A1 const, _A2>::type 1351*58b9f456SAndroid Build Coastguard Worker operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const { 1352*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1353*58b9f456SAndroid Build Coastguard Worker } 1354*58b9f456SAndroid Build Coastguard Worker 1355*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1356*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1357*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0, _A1, _A2 const>::type 1358*58b9f456SAndroid Build Coastguard Worker operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const { 1359*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1360*58b9f456SAndroid Build Coastguard Worker } 1361*58b9f456SAndroid Build Coastguard Worker 1362*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1363*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1364*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type 1365*58b9f456SAndroid Build Coastguard Worker operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const { 1366*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1367*58b9f456SAndroid Build Coastguard Worker } 1368*58b9f456SAndroid Build Coastguard Worker 1369*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1370*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1371*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type 1372*58b9f456SAndroid Build Coastguard Worker operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const { 1373*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1374*58b9f456SAndroid Build Coastguard Worker } 1375*58b9f456SAndroid Build Coastguard Worker 1376*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1377*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1378*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type 1379*58b9f456SAndroid Build Coastguard Worker operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const { 1380*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1381*58b9f456SAndroid Build Coastguard Worker } 1382*58b9f456SAndroid Build Coastguard Worker 1383*58b9f456SAndroid Build Coastguard Worker template <class _A0, class _A1, class _A2> 1384*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1385*58b9f456SAndroid Build Coastguard Worker typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type 1386*58b9f456SAndroid Build Coastguard Worker operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const { 1387*58b9f456SAndroid Build Coastguard Worker return __invoke(__f_, __a0, __a1, __a2); 1388*58b9f456SAndroid Build Coastguard Worker } 1389*58b9f456SAndroid Build Coastguard Worker#endif 1390*58b9f456SAndroid Build Coastguard Worker}; 1391*58b9f456SAndroid Build Coastguard Worker 1392*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Tp> 1393*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1394*58b9f456SAndroid Build Coastguard Worker__mem_fn<_Rp _Tp::*> 1395*58b9f456SAndroid Build Coastguard Workermem_fn(_Rp _Tp::* __pm) _NOEXCEPT 1396*58b9f456SAndroid Build Coastguard Worker{ 1397*58b9f456SAndroid Build Coastguard Worker return __mem_fn<_Rp _Tp::*>(__pm); 1398*58b9f456SAndroid Build Coastguard Worker} 1399*58b9f456SAndroid Build Coastguard Worker 1400*58b9f456SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 1401*58b9f456SAndroid Build Coastguard Worker// FUNCTION 1402*58b9f456SAndroid Build Coastguard Worker//============================================================================== 1403*58b9f456SAndroid Build Coastguard Worker 1404*58b9f456SAndroid Build Coastguard Worker// bad_function_call 1405*58b9f456SAndroid Build Coastguard Worker 1406*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_EXCEPTION_ABI bad_function_call 1407*58b9f456SAndroid Build Coastguard Worker : public exception 1408*58b9f456SAndroid Build Coastguard Worker{ 1409*58b9f456SAndroid Build Coastguard Worker#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION 1410*58b9f456SAndroid Build Coastguard Workerpublic: 1411*58b9f456SAndroid Build Coastguard Worker virtual ~bad_function_call() _NOEXCEPT; 1412*58b9f456SAndroid Build Coastguard Worker 1413*58b9f456SAndroid Build Coastguard Worker virtual const char* what() const _NOEXCEPT; 1414*58b9f456SAndroid Build Coastguard Worker#endif 1415*58b9f456SAndroid Build Coastguard Worker}; 1416*58b9f456SAndroid Build Coastguard Worker 1417*58b9f456SAndroid Build Coastguard Worker_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 1418*58b9f456SAndroid Build Coastguard Workervoid __throw_bad_function_call() 1419*58b9f456SAndroid Build Coastguard Worker{ 1420*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_EXCEPTIONS 1421*58b9f456SAndroid Build Coastguard Worker throw bad_function_call(); 1422*58b9f456SAndroid Build Coastguard Worker#else 1423*58b9f456SAndroid Build Coastguard Worker _VSTD::abort(); 1424*58b9f456SAndroid Build Coastguard Worker#endif 1425*58b9f456SAndroid Build Coastguard Worker} 1426*58b9f456SAndroid Build Coastguard Worker 1427*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp> class _LIBCPP_TEMPLATE_VIS function; // undefined 1428*58b9f456SAndroid Build Coastguard Worker 1429*58b9f456SAndroid Build Coastguard Workernamespace __function 1430*58b9f456SAndroid Build Coastguard Worker{ 1431*58b9f456SAndroid Build Coastguard Worker 1432*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp> 1433*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_unary_function 1434*58b9f456SAndroid Build Coastguard Worker{ 1435*58b9f456SAndroid Build Coastguard Worker}; 1436*58b9f456SAndroid Build Coastguard Worker 1437*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _A1> 1438*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_unary_function<_Rp(_A1)> 1439*58b9f456SAndroid Build Coastguard Worker : public unary_function<_A1, _Rp> 1440*58b9f456SAndroid Build Coastguard Worker{ 1441*58b9f456SAndroid Build Coastguard Worker}; 1442*58b9f456SAndroid Build Coastguard Worker 1443*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp> 1444*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_binary_function 1445*58b9f456SAndroid Build Coastguard Worker{ 1446*58b9f456SAndroid Build Coastguard Worker}; 1447*58b9f456SAndroid Build Coastguard Worker 1448*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _A1, class _A2> 1449*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_binary_function<_Rp(_A1, _A2)> 1450*58b9f456SAndroid Build Coastguard Worker : public binary_function<_A1, _A2, _Rp> 1451*58b9f456SAndroid Build Coastguard Worker{ 1452*58b9f456SAndroid Build Coastguard Worker}; 1453*58b9f456SAndroid Build Coastguard Worker 1454*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> 1455*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 1456*58b9f456SAndroid Build Coastguard Workerbool __not_null(_Fp const&) { return true; } 1457*58b9f456SAndroid Build Coastguard Worker 1458*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> 1459*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 1460*58b9f456SAndroid Build Coastguard Workerbool __not_null(_Fp* __ptr) { return __ptr; } 1461*58b9f456SAndroid Build Coastguard Worker 1462*58b9f456SAndroid Build Coastguard Workertemplate <class _Ret, class _Class> 1463*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 1464*58b9f456SAndroid Build Coastguard Workerbool __not_null(_Ret _Class::*__ptr) { return __ptr; } 1465*58b9f456SAndroid Build Coastguard Worker 1466*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> 1467*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 1468*58b9f456SAndroid Build Coastguard Workerbool __not_null(function<_Fp> const& __f) { return !!__f; } 1469*58b9f456SAndroid Build Coastguard Worker 1470*58b9f456SAndroid Build Coastguard Worker} // namespace __function 1471*58b9f456SAndroid Build Coastguard Worker 1472*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 1473*58b9f456SAndroid Build Coastguard Worker 1474*58b9f456SAndroid Build Coastguard Workernamespace __function { 1475*58b9f456SAndroid Build Coastguard Worker 1476*58b9f456SAndroid Build Coastguard Worker// __alloc_func holds a functor and an allocator. 1477*58b9f456SAndroid Build Coastguard Worker 1478*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _Ap, class _FB> class __alloc_func; 1479*58b9f456SAndroid Build Coastguard Worker 1480*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _Ap, class _Rp, class... _ArgTypes> 1481*58b9f456SAndroid Build Coastguard Workerclass __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)> 1482*58b9f456SAndroid Build Coastguard Worker{ 1483*58b9f456SAndroid Build Coastguard Worker __compressed_pair<_Fp, _Ap> __f_; 1484*58b9f456SAndroid Build Coastguard Worker 1485*58b9f456SAndroid Build Coastguard Worker public: 1486*58b9f456SAndroid Build Coastguard Worker typedef _Fp _Target; 1487*58b9f456SAndroid Build Coastguard Worker typedef _Ap _Alloc; 1488*58b9f456SAndroid Build Coastguard Worker 1489*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1490*58b9f456SAndroid Build Coastguard Worker const _Target& __target() const { return __f_.first(); } 1491*58b9f456SAndroid Build Coastguard Worker 1492*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1493*58b9f456SAndroid Build Coastguard Worker const _Alloc& __allocator() const { return __f_.second(); } 1494*58b9f456SAndroid Build Coastguard Worker 1495*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1496*58b9f456SAndroid Build Coastguard Worker explicit __alloc_func(_Target&& __f) 1497*58b9f456SAndroid Build Coastguard Worker : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)), 1498*58b9f456SAndroid Build Coastguard Worker _VSTD::forward_as_tuple()) 1499*58b9f456SAndroid Build Coastguard Worker { 1500*58b9f456SAndroid Build Coastguard Worker } 1501*58b9f456SAndroid Build Coastguard Worker 1502*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1503*58b9f456SAndroid Build Coastguard Worker explicit __alloc_func(const _Target& __f, const _Alloc& __a) 1504*58b9f456SAndroid Build Coastguard Worker : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f), 1505*58b9f456SAndroid Build Coastguard Worker _VSTD::forward_as_tuple(__a)) 1506*58b9f456SAndroid Build Coastguard Worker { 1507*58b9f456SAndroid Build Coastguard Worker } 1508*58b9f456SAndroid Build Coastguard Worker 1509*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1510*58b9f456SAndroid Build Coastguard Worker explicit __alloc_func(const _Target& __f, _Alloc&& __a) 1511*58b9f456SAndroid Build Coastguard Worker : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f), 1512*58b9f456SAndroid Build Coastguard Worker _VSTD::forward_as_tuple(_VSTD::move(__a))) 1513*58b9f456SAndroid Build Coastguard Worker { 1514*58b9f456SAndroid Build Coastguard Worker } 1515*58b9f456SAndroid Build Coastguard Worker 1516*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1517*58b9f456SAndroid Build Coastguard Worker explicit __alloc_func(_Target&& __f, _Alloc&& __a) 1518*58b9f456SAndroid Build Coastguard Worker : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)), 1519*58b9f456SAndroid Build Coastguard Worker _VSTD::forward_as_tuple(_VSTD::move(__a))) 1520*58b9f456SAndroid Build Coastguard Worker { 1521*58b9f456SAndroid Build Coastguard Worker } 1522*58b9f456SAndroid Build Coastguard Worker 1523*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1524*58b9f456SAndroid Build Coastguard Worker _Rp operator()(_ArgTypes&&... __arg) 1525*58b9f456SAndroid Build Coastguard Worker { 1526*58b9f456SAndroid Build Coastguard Worker typedef __invoke_void_return_wrapper<_Rp> _Invoker; 1527*58b9f456SAndroid Build Coastguard Worker return _Invoker::__call(__f_.first(), 1528*58b9f456SAndroid Build Coastguard Worker _VSTD::forward<_ArgTypes>(__arg)...); 1529*58b9f456SAndroid Build Coastguard Worker } 1530*58b9f456SAndroid Build Coastguard Worker 1531*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1532*58b9f456SAndroid Build Coastguard Worker __alloc_func* __clone() const 1533*58b9f456SAndroid Build Coastguard Worker { 1534*58b9f456SAndroid Build Coastguard Worker typedef allocator_traits<_Alloc> __alloc_traits; 1535*58b9f456SAndroid Build Coastguard Worker typedef 1536*58b9f456SAndroid Build Coastguard Worker typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type 1537*58b9f456SAndroid Build Coastguard Worker _AA; 1538*58b9f456SAndroid Build Coastguard Worker _AA __a(__f_.second()); 1539*58b9f456SAndroid Build Coastguard Worker typedef __allocator_destructor<_AA> _Dp; 1540*58b9f456SAndroid Build Coastguard Worker unique_ptr<__alloc_func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); 1541*58b9f456SAndroid Build Coastguard Worker ::new ((void*)__hold.get()) __alloc_func(__f_.first(), _Alloc(__a)); 1542*58b9f456SAndroid Build Coastguard Worker return __hold.release(); 1543*58b9f456SAndroid Build Coastguard Worker } 1544*58b9f456SAndroid Build Coastguard Worker 1545*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1546*58b9f456SAndroid Build Coastguard Worker void destroy() _NOEXCEPT { __f_.~__compressed_pair<_Target, _Alloc>(); } 1547*58b9f456SAndroid Build Coastguard Worker}; 1548*58b9f456SAndroid Build Coastguard Worker 1549*58b9f456SAndroid Build Coastguard Worker// __base provides an abstract interface for copyable functors. 1550*58b9f456SAndroid Build Coastguard Worker 1551*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp> class __base; 1552*58b9f456SAndroid Build Coastguard Worker 1553*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 1554*58b9f456SAndroid Build Coastguard Workerclass __base<_Rp(_ArgTypes...)> 1555*58b9f456SAndroid Build Coastguard Worker{ 1556*58b9f456SAndroid Build Coastguard Worker __base(const __base&); 1557*58b9f456SAndroid Build Coastguard Worker __base& operator=(const __base&); 1558*58b9f456SAndroid Build Coastguard Workerpublic: 1559*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY __base() {} 1560*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY virtual ~__base() {} 1561*58b9f456SAndroid Build Coastguard Worker virtual __base* __clone() const = 0; 1562*58b9f456SAndroid Build Coastguard Worker virtual void __clone(__base*) const = 0; 1563*58b9f456SAndroid Build Coastguard Worker virtual void destroy() _NOEXCEPT = 0; 1564*58b9f456SAndroid Build Coastguard Worker virtual void destroy_deallocate() _NOEXCEPT = 0; 1565*58b9f456SAndroid Build Coastguard Worker virtual _Rp operator()(_ArgTypes&& ...) = 0; 1566*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 1567*58b9f456SAndroid Build Coastguard Worker virtual const void* target(const type_info&) const _NOEXCEPT = 0; 1568*58b9f456SAndroid Build Coastguard Worker virtual const std::type_info& target_type() const _NOEXCEPT = 0; 1569*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI 1570*58b9f456SAndroid Build Coastguard Worker}; 1571*58b9f456SAndroid Build Coastguard Worker 1572*58b9f456SAndroid Build Coastguard Worker// __func implements __base for a given functor type. 1573*58b9f456SAndroid Build Coastguard Worker 1574*58b9f456SAndroid Build Coastguard Workertemplate<class _FD, class _Alloc, class _FB> class __func; 1575*58b9f456SAndroid Build Coastguard Worker 1576*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1577*58b9f456SAndroid Build Coastguard Workerclass __func<_Fp, _Alloc, _Rp(_ArgTypes...)> 1578*58b9f456SAndroid Build Coastguard Worker : public __base<_Rp(_ArgTypes...)> 1579*58b9f456SAndroid Build Coastguard Worker{ 1580*58b9f456SAndroid Build Coastguard Worker __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> __f_; 1581*58b9f456SAndroid Build Coastguard Workerpublic: 1582*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1583*58b9f456SAndroid Build Coastguard Worker explicit __func(_Fp&& __f) 1584*58b9f456SAndroid Build Coastguard Worker : __f_(_VSTD::move(__f)) {} 1585*58b9f456SAndroid Build Coastguard Worker 1586*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1587*58b9f456SAndroid Build Coastguard Worker explicit __func(const _Fp& __f, const _Alloc& __a) 1588*58b9f456SAndroid Build Coastguard Worker : __f_(__f, __a) {} 1589*58b9f456SAndroid Build Coastguard Worker 1590*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1591*58b9f456SAndroid Build Coastguard Worker explicit __func(const _Fp& __f, _Alloc&& __a) 1592*58b9f456SAndroid Build Coastguard Worker : __f_(__f, _VSTD::move(__a)) {} 1593*58b9f456SAndroid Build Coastguard Worker 1594*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1595*58b9f456SAndroid Build Coastguard Worker explicit __func(_Fp&& __f, _Alloc&& __a) 1596*58b9f456SAndroid Build Coastguard Worker : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} 1597*58b9f456SAndroid Build Coastguard Worker 1598*58b9f456SAndroid Build Coastguard Worker virtual __base<_Rp(_ArgTypes...)>* __clone() const; 1599*58b9f456SAndroid Build Coastguard Worker virtual void __clone(__base<_Rp(_ArgTypes...)>*) const; 1600*58b9f456SAndroid Build Coastguard Worker virtual void destroy() _NOEXCEPT; 1601*58b9f456SAndroid Build Coastguard Worker virtual void destroy_deallocate() _NOEXCEPT; 1602*58b9f456SAndroid Build Coastguard Worker virtual _Rp operator()(_ArgTypes&&... __arg); 1603*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 1604*58b9f456SAndroid Build Coastguard Worker virtual const void* target(const type_info&) const _NOEXCEPT; 1605*58b9f456SAndroid Build Coastguard Worker virtual const std::type_info& target_type() const _NOEXCEPT; 1606*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI 1607*58b9f456SAndroid Build Coastguard Worker}; 1608*58b9f456SAndroid Build Coastguard Worker 1609*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1610*58b9f456SAndroid Build Coastguard Worker__base<_Rp(_ArgTypes...)>* 1611*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const 1612*58b9f456SAndroid Build Coastguard Worker{ 1613*58b9f456SAndroid Build Coastguard Worker typedef allocator_traits<_Alloc> __alloc_traits; 1614*58b9f456SAndroid Build Coastguard Worker typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; 1615*58b9f456SAndroid Build Coastguard Worker _Ap __a(__f_.__allocator()); 1616*58b9f456SAndroid Build Coastguard Worker typedef __allocator_destructor<_Ap> _Dp; 1617*58b9f456SAndroid Build Coastguard Worker unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); 1618*58b9f456SAndroid Build Coastguard Worker ::new ((void*)__hold.get()) __func(__f_.__target(), _Alloc(__a)); 1619*58b9f456SAndroid Build Coastguard Worker return __hold.release(); 1620*58b9f456SAndroid Build Coastguard Worker} 1621*58b9f456SAndroid Build Coastguard Worker 1622*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1623*58b9f456SAndroid Build Coastguard Workervoid 1624*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const 1625*58b9f456SAndroid Build Coastguard Worker{ 1626*58b9f456SAndroid Build Coastguard Worker ::new (__p) __func(__f_.__target(), __f_.__allocator()); 1627*58b9f456SAndroid Build Coastguard Worker} 1628*58b9f456SAndroid Build Coastguard Worker 1629*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1630*58b9f456SAndroid Build Coastguard Workervoid 1631*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT 1632*58b9f456SAndroid Build Coastguard Worker{ 1633*58b9f456SAndroid Build Coastguard Worker __f_.destroy(); 1634*58b9f456SAndroid Build Coastguard Worker} 1635*58b9f456SAndroid Build Coastguard Worker 1636*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1637*58b9f456SAndroid Build Coastguard Workervoid 1638*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT 1639*58b9f456SAndroid Build Coastguard Worker{ 1640*58b9f456SAndroid Build Coastguard Worker typedef allocator_traits<_Alloc> __alloc_traits; 1641*58b9f456SAndroid Build Coastguard Worker typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap; 1642*58b9f456SAndroid Build Coastguard Worker _Ap __a(__f_.__allocator()); 1643*58b9f456SAndroid Build Coastguard Worker __f_.destroy(); 1644*58b9f456SAndroid Build Coastguard Worker __a.deallocate(this, 1); 1645*58b9f456SAndroid Build Coastguard Worker} 1646*58b9f456SAndroid Build Coastguard Worker 1647*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1648*58b9f456SAndroid Build Coastguard Worker_Rp 1649*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg) 1650*58b9f456SAndroid Build Coastguard Worker{ 1651*58b9f456SAndroid Build Coastguard Worker return __f_(_VSTD::forward<_ArgTypes>(__arg)...); 1652*58b9f456SAndroid Build Coastguard Worker} 1653*58b9f456SAndroid Build Coastguard Worker 1654*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 1655*58b9f456SAndroid Build Coastguard Worker 1656*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1657*58b9f456SAndroid Build Coastguard Workerconst void* 1658*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT 1659*58b9f456SAndroid Build Coastguard Worker{ 1660*58b9f456SAndroid Build Coastguard Worker if (__ti == typeid(_Fp)) 1661*58b9f456SAndroid Build Coastguard Worker return &__f_.__target(); 1662*58b9f456SAndroid Build Coastguard Worker return (const void*)0; 1663*58b9f456SAndroid Build Coastguard Worker} 1664*58b9f456SAndroid Build Coastguard Worker 1665*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1666*58b9f456SAndroid Build Coastguard Workerconst std::type_info& 1667*58b9f456SAndroid Build Coastguard Worker__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT 1668*58b9f456SAndroid Build Coastguard Worker{ 1669*58b9f456SAndroid Build Coastguard Worker return typeid(_Fp); 1670*58b9f456SAndroid Build Coastguard Worker} 1671*58b9f456SAndroid Build Coastguard Worker 1672*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI 1673*58b9f456SAndroid Build Coastguard Worker 1674*58b9f456SAndroid Build Coastguard Worker// __value_func creates a value-type from a __func. 1675*58b9f456SAndroid Build Coastguard Worker 1676*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> class __value_func; 1677*58b9f456SAndroid Build Coastguard Worker 1678*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)> 1679*58b9f456SAndroid Build Coastguard Worker{ 1680*58b9f456SAndroid Build Coastguard Worker typename aligned_storage<3 * sizeof(void*)>::type __buf_; 1681*58b9f456SAndroid Build Coastguard Worker 1682*58b9f456SAndroid Build Coastguard Worker typedef __base<_Rp(_ArgTypes...)> __func; 1683*58b9f456SAndroid Build Coastguard Worker __func* __f_; 1684*58b9f456SAndroid Build Coastguard Worker 1685*58b9f456SAndroid Build Coastguard Worker _LIBCPP_NO_CFI static __func* __as_base(void* p) 1686*58b9f456SAndroid Build Coastguard Worker { 1687*58b9f456SAndroid Build Coastguard Worker return reinterpret_cast<__func*>(p); 1688*58b9f456SAndroid Build Coastguard Worker } 1689*58b9f456SAndroid Build Coastguard Worker 1690*58b9f456SAndroid Build Coastguard Worker public: 1691*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1692*58b9f456SAndroid Build Coastguard Worker __value_func() _NOEXCEPT : __f_(0) {} 1693*58b9f456SAndroid Build Coastguard Worker 1694*58b9f456SAndroid Build Coastguard Worker template <class _Fp, class _Alloc> 1695*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY __value_func(_Fp&& __f, const _Alloc __a) 1696*58b9f456SAndroid Build Coastguard Worker : __f_(0) 1697*58b9f456SAndroid Build Coastguard Worker { 1698*58b9f456SAndroid Build Coastguard Worker typedef allocator_traits<_Alloc> __alloc_traits; 1699*58b9f456SAndroid Build Coastguard Worker typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun; 1700*58b9f456SAndroid Build Coastguard Worker typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type 1701*58b9f456SAndroid Build Coastguard Worker _FunAlloc; 1702*58b9f456SAndroid Build Coastguard Worker 1703*58b9f456SAndroid Build Coastguard Worker if (__function::__not_null(__f)) 1704*58b9f456SAndroid Build Coastguard Worker { 1705*58b9f456SAndroid Build Coastguard Worker _FunAlloc __af(__a); 1706*58b9f456SAndroid Build Coastguard Worker if (sizeof(_Fun) <= sizeof(__buf_) && 1707*58b9f456SAndroid Build Coastguard Worker is_nothrow_copy_constructible<_Fp>::value && 1708*58b9f456SAndroid Build Coastguard Worker is_nothrow_copy_constructible<_FunAlloc>::value) 1709*58b9f456SAndroid Build Coastguard Worker { 1710*58b9f456SAndroid Build Coastguard Worker __f_ = 1711*58b9f456SAndroid Build Coastguard Worker ::new ((void*)&__buf_) _Fun(_VSTD::move(__f), _Alloc(__af)); 1712*58b9f456SAndroid Build Coastguard Worker } 1713*58b9f456SAndroid Build Coastguard Worker else 1714*58b9f456SAndroid Build Coastguard Worker { 1715*58b9f456SAndroid Build Coastguard Worker typedef __allocator_destructor<_FunAlloc> _Dp; 1716*58b9f456SAndroid Build Coastguard Worker unique_ptr<__func, _Dp> __hold(__af.allocate(1), _Dp(__af, 1)); 1717*58b9f456SAndroid Build Coastguard Worker ::new ((void*)__hold.get()) _Fun(_VSTD::move(__f), _Alloc(__a)); 1718*58b9f456SAndroid Build Coastguard Worker __f_ = __hold.release(); 1719*58b9f456SAndroid Build Coastguard Worker } 1720*58b9f456SAndroid Build Coastguard Worker } 1721*58b9f456SAndroid Build Coastguard Worker } 1722*58b9f456SAndroid Build Coastguard Worker 1723*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1724*58b9f456SAndroid Build Coastguard Worker __value_func(const __value_func& __f) 1725*58b9f456SAndroid Build Coastguard Worker { 1726*58b9f456SAndroid Build Coastguard Worker if (__f.__f_ == 0) 1727*58b9f456SAndroid Build Coastguard Worker __f_ = 0; 1728*58b9f456SAndroid Build Coastguard Worker else if ((void*)__f.__f_ == &__f.__buf_) 1729*58b9f456SAndroid Build Coastguard Worker { 1730*58b9f456SAndroid Build Coastguard Worker __f_ = __as_base(&__buf_); 1731*58b9f456SAndroid Build Coastguard Worker __f.__f_->__clone(__f_); 1732*58b9f456SAndroid Build Coastguard Worker } 1733*58b9f456SAndroid Build Coastguard Worker else 1734*58b9f456SAndroid Build Coastguard Worker __f_ = __f.__f_->__clone(); 1735*58b9f456SAndroid Build Coastguard Worker } 1736*58b9f456SAndroid Build Coastguard Worker 1737*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1738*58b9f456SAndroid Build Coastguard Worker __value_func(__value_func&& __f) _NOEXCEPT 1739*58b9f456SAndroid Build Coastguard Worker { 1740*58b9f456SAndroid Build Coastguard Worker if (__f.__f_ == 0) 1741*58b9f456SAndroid Build Coastguard Worker __f_ = 0; 1742*58b9f456SAndroid Build Coastguard Worker else if ((void*)__f.__f_ == &__f.__buf_) 1743*58b9f456SAndroid Build Coastguard Worker { 1744*58b9f456SAndroid Build Coastguard Worker __f_ = __as_base(&__buf_); 1745*58b9f456SAndroid Build Coastguard Worker __f.__f_->__clone(__f_); 1746*58b9f456SAndroid Build Coastguard Worker } 1747*58b9f456SAndroid Build Coastguard Worker else 1748*58b9f456SAndroid Build Coastguard Worker { 1749*58b9f456SAndroid Build Coastguard Worker __f_ = __f.__f_; 1750*58b9f456SAndroid Build Coastguard Worker __f.__f_ = 0; 1751*58b9f456SAndroid Build Coastguard Worker } 1752*58b9f456SAndroid Build Coastguard Worker } 1753*58b9f456SAndroid Build Coastguard Worker 1754*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1755*58b9f456SAndroid Build Coastguard Worker ~__value_func() 1756*58b9f456SAndroid Build Coastguard Worker { 1757*58b9f456SAndroid Build Coastguard Worker if ((void*)__f_ == &__buf_) 1758*58b9f456SAndroid Build Coastguard Worker __f_->destroy(); 1759*58b9f456SAndroid Build Coastguard Worker else if (__f_) 1760*58b9f456SAndroid Build Coastguard Worker __f_->destroy_deallocate(); 1761*58b9f456SAndroid Build Coastguard Worker } 1762*58b9f456SAndroid Build Coastguard Worker 1763*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1764*58b9f456SAndroid Build Coastguard Worker __value_func& operator=(__value_func&& __f) 1765*58b9f456SAndroid Build Coastguard Worker { 1766*58b9f456SAndroid Build Coastguard Worker *this = nullptr; 1767*58b9f456SAndroid Build Coastguard Worker if (__f.__f_ == 0) 1768*58b9f456SAndroid Build Coastguard Worker __f_ = 0; 1769*58b9f456SAndroid Build Coastguard Worker else if ((void*)__f.__f_ == &__f.__buf_) 1770*58b9f456SAndroid Build Coastguard Worker { 1771*58b9f456SAndroid Build Coastguard Worker __f_ = __as_base(&__buf_); 1772*58b9f456SAndroid Build Coastguard Worker __f.__f_->__clone(__f_); 1773*58b9f456SAndroid Build Coastguard Worker } 1774*58b9f456SAndroid Build Coastguard Worker else 1775*58b9f456SAndroid Build Coastguard Worker { 1776*58b9f456SAndroid Build Coastguard Worker __f_ = __f.__f_; 1777*58b9f456SAndroid Build Coastguard Worker __f.__f_ = 0; 1778*58b9f456SAndroid Build Coastguard Worker } 1779*58b9f456SAndroid Build Coastguard Worker return *this; 1780*58b9f456SAndroid Build Coastguard Worker } 1781*58b9f456SAndroid Build Coastguard Worker 1782*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1783*58b9f456SAndroid Build Coastguard Worker __value_func& operator=(nullptr_t) 1784*58b9f456SAndroid Build Coastguard Worker { 1785*58b9f456SAndroid Build Coastguard Worker __func* __f = __f_; 1786*58b9f456SAndroid Build Coastguard Worker __f_ = 0; 1787*58b9f456SAndroid Build Coastguard Worker if ((void*)__f == &__buf_) 1788*58b9f456SAndroid Build Coastguard Worker __f->destroy(); 1789*58b9f456SAndroid Build Coastguard Worker else if (__f) 1790*58b9f456SAndroid Build Coastguard Worker __f->destroy_deallocate(); 1791*58b9f456SAndroid Build Coastguard Worker return *this; 1792*58b9f456SAndroid Build Coastguard Worker } 1793*58b9f456SAndroid Build Coastguard Worker 1794*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1795*58b9f456SAndroid Build Coastguard Worker _Rp operator()(_ArgTypes&&... __args) const 1796*58b9f456SAndroid Build Coastguard Worker { 1797*58b9f456SAndroid Build Coastguard Worker if (__f_ == 0) 1798*58b9f456SAndroid Build Coastguard Worker __throw_bad_function_call(); 1799*58b9f456SAndroid Build Coastguard Worker return (*__f_)(_VSTD::forward<_ArgTypes>(__args)...); 1800*58b9f456SAndroid Build Coastguard Worker } 1801*58b9f456SAndroid Build Coastguard Worker 1802*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1803*58b9f456SAndroid Build Coastguard Worker void swap(__value_func& __f) _NOEXCEPT 1804*58b9f456SAndroid Build Coastguard Worker { 1805*58b9f456SAndroid Build Coastguard Worker if (&__f == this) 1806*58b9f456SAndroid Build Coastguard Worker return; 1807*58b9f456SAndroid Build Coastguard Worker if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_) 1808*58b9f456SAndroid Build Coastguard Worker { 1809*58b9f456SAndroid Build Coastguard Worker typename aligned_storage<sizeof(__buf_)>::type __tempbuf; 1810*58b9f456SAndroid Build Coastguard Worker __func* __t = __as_base(&__tempbuf); 1811*58b9f456SAndroid Build Coastguard Worker __f_->__clone(__t); 1812*58b9f456SAndroid Build Coastguard Worker __f_->destroy(); 1813*58b9f456SAndroid Build Coastguard Worker __f_ = 0; 1814*58b9f456SAndroid Build Coastguard Worker __f.__f_->__clone(__as_base(&__buf_)); 1815*58b9f456SAndroid Build Coastguard Worker __f.__f_->destroy(); 1816*58b9f456SAndroid Build Coastguard Worker __f.__f_ = 0; 1817*58b9f456SAndroid Build Coastguard Worker __f_ = __as_base(&__buf_); 1818*58b9f456SAndroid Build Coastguard Worker __t->__clone(__as_base(&__f.__buf_)); 1819*58b9f456SAndroid Build Coastguard Worker __t->destroy(); 1820*58b9f456SAndroid Build Coastguard Worker __f.__f_ = __as_base(&__f.__buf_); 1821*58b9f456SAndroid Build Coastguard Worker } 1822*58b9f456SAndroid Build Coastguard Worker else if ((void*)__f_ == &__buf_) 1823*58b9f456SAndroid Build Coastguard Worker { 1824*58b9f456SAndroid Build Coastguard Worker __f_->__clone(__as_base(&__f.__buf_)); 1825*58b9f456SAndroid Build Coastguard Worker __f_->destroy(); 1826*58b9f456SAndroid Build Coastguard Worker __f_ = __f.__f_; 1827*58b9f456SAndroid Build Coastguard Worker __f.__f_ = __as_base(&__f.__buf_); 1828*58b9f456SAndroid Build Coastguard Worker } 1829*58b9f456SAndroid Build Coastguard Worker else if ((void*)__f.__f_ == &__f.__buf_) 1830*58b9f456SAndroid Build Coastguard Worker { 1831*58b9f456SAndroid Build Coastguard Worker __f.__f_->__clone(__as_base(&__buf_)); 1832*58b9f456SAndroid Build Coastguard Worker __f.__f_->destroy(); 1833*58b9f456SAndroid Build Coastguard Worker __f.__f_ = __f_; 1834*58b9f456SAndroid Build Coastguard Worker __f_ = __as_base(&__buf_); 1835*58b9f456SAndroid Build Coastguard Worker } 1836*58b9f456SAndroid Build Coastguard Worker else 1837*58b9f456SAndroid Build Coastguard Worker _VSTD::swap(__f_, __f.__f_); 1838*58b9f456SAndroid Build Coastguard Worker } 1839*58b9f456SAndroid Build Coastguard Worker 1840*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1841*58b9f456SAndroid Build Coastguard Worker _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { return __f_ != 0; } 1842*58b9f456SAndroid Build Coastguard Worker 1843*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 1844*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1845*58b9f456SAndroid Build Coastguard Worker const std::type_info& target_type() const _NOEXCEPT 1846*58b9f456SAndroid Build Coastguard Worker { 1847*58b9f456SAndroid Build Coastguard Worker if (__f_ == 0) 1848*58b9f456SAndroid Build Coastguard Worker return typeid(void); 1849*58b9f456SAndroid Build Coastguard Worker return __f_->target_type(); 1850*58b9f456SAndroid Build Coastguard Worker } 1851*58b9f456SAndroid Build Coastguard Worker 1852*58b9f456SAndroid Build Coastguard Worker template <typename _Tp> 1853*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT 1854*58b9f456SAndroid Build Coastguard Worker { 1855*58b9f456SAndroid Build Coastguard Worker if (__f_ == 0) 1856*58b9f456SAndroid Build Coastguard Worker return 0; 1857*58b9f456SAndroid Build Coastguard Worker return (const _Tp*)__f_->target(typeid(_Tp)); 1858*58b9f456SAndroid Build Coastguard Worker } 1859*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI 1860*58b9f456SAndroid Build Coastguard Worker}; 1861*58b9f456SAndroid Build Coastguard Worker 1862*58b9f456SAndroid Build Coastguard Worker// Storage for a functor object, to be used with __policy to manage copy and 1863*58b9f456SAndroid Build Coastguard Worker// destruction. 1864*58b9f456SAndroid Build Coastguard Workerunion __policy_storage 1865*58b9f456SAndroid Build Coastguard Worker{ 1866*58b9f456SAndroid Build Coastguard Worker mutable char __small[sizeof(void*) * 2]; 1867*58b9f456SAndroid Build Coastguard Worker void* __large; 1868*58b9f456SAndroid Build Coastguard Worker}; 1869*58b9f456SAndroid Build Coastguard Worker 1870*58b9f456SAndroid Build Coastguard Worker// True if _Fun can safely be held in __policy_storage.__small. 1871*58b9f456SAndroid Build Coastguard Workertemplate <typename _Fun> 1872*58b9f456SAndroid Build Coastguard Workerstruct __use_small_storage 1873*58b9f456SAndroid Build Coastguard Worker : public _VSTD::integral_constant< 1874*58b9f456SAndroid Build Coastguard Worker bool, sizeof(_Fun) <= sizeof(__policy_storage) && 1875*58b9f456SAndroid Build Coastguard Worker alignof(_Fun) <= alignof(__policy_storage) && 1876*58b9f456SAndroid Build Coastguard Worker _VSTD::is_trivially_copy_constructible<_Fun>::value && 1877*58b9f456SAndroid Build Coastguard Worker _VSTD::is_trivially_destructible<_Fun>::value> {}; 1878*58b9f456SAndroid Build Coastguard Worker 1879*58b9f456SAndroid Build Coastguard Worker// Policy contains information about how to copy, destroy, and move the 1880*58b9f456SAndroid Build Coastguard Worker// underlying functor. You can think of it as a vtable of sorts. 1881*58b9f456SAndroid Build Coastguard Workerstruct __policy 1882*58b9f456SAndroid Build Coastguard Worker{ 1883*58b9f456SAndroid Build Coastguard Worker // Used to copy or destroy __large values. null for trivial objects. 1884*58b9f456SAndroid Build Coastguard Worker void* (*const __clone)(const void*); 1885*58b9f456SAndroid Build Coastguard Worker void (*const __destroy)(void*); 1886*58b9f456SAndroid Build Coastguard Worker 1887*58b9f456SAndroid Build Coastguard Worker // True if this is the null policy (no value). 1888*58b9f456SAndroid Build Coastguard Worker const bool __is_null; 1889*58b9f456SAndroid Build Coastguard Worker 1890*58b9f456SAndroid Build Coastguard Worker // The target type. May be null if RTTI is disabled. 1891*58b9f456SAndroid Build Coastguard Worker const std::type_info* const __type_info; 1892*58b9f456SAndroid Build Coastguard Worker 1893*58b9f456SAndroid Build Coastguard Worker // Returns a pointer to a static policy object suitable for the functor 1894*58b9f456SAndroid Build Coastguard Worker // type. 1895*58b9f456SAndroid Build Coastguard Worker template <typename _Fun> 1896*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY static const __policy* __create() 1897*58b9f456SAndroid Build Coastguard Worker { 1898*58b9f456SAndroid Build Coastguard Worker return __choose_policy<_Fun>(__use_small_storage<_Fun>()); 1899*58b9f456SAndroid Build Coastguard Worker } 1900*58b9f456SAndroid Build Coastguard Worker 1901*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1902*58b9f456SAndroid Build Coastguard Worker static const __policy* __create_empty() 1903*58b9f456SAndroid Build Coastguard Worker { 1904*58b9f456SAndroid Build Coastguard Worker static const _LIBCPP_CONSTEXPR __policy __policy_ = {nullptr, nullptr, 1905*58b9f456SAndroid Build Coastguard Worker true, 1906*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 1907*58b9f456SAndroid Build Coastguard Worker &typeid(void) 1908*58b9f456SAndroid Build Coastguard Worker#else 1909*58b9f456SAndroid Build Coastguard Worker nullptr 1910*58b9f456SAndroid Build Coastguard Worker#endif 1911*58b9f456SAndroid Build Coastguard Worker }; 1912*58b9f456SAndroid Build Coastguard Worker return &__policy_; 1913*58b9f456SAndroid Build Coastguard Worker } 1914*58b9f456SAndroid Build Coastguard Worker 1915*58b9f456SAndroid Build Coastguard Worker private: 1916*58b9f456SAndroid Build Coastguard Worker template <typename _Fun> static void* __large_clone(const void* __s) 1917*58b9f456SAndroid Build Coastguard Worker { 1918*58b9f456SAndroid Build Coastguard Worker const _Fun* __f = static_cast<const _Fun*>(__s); 1919*58b9f456SAndroid Build Coastguard Worker return __f->__clone(); 1920*58b9f456SAndroid Build Coastguard Worker } 1921*58b9f456SAndroid Build Coastguard Worker 1922*58b9f456SAndroid Build Coastguard Worker template <typename _Fun> static void __large_destroy(void* __s) 1923*58b9f456SAndroid Build Coastguard Worker { 1924*58b9f456SAndroid Build Coastguard Worker typedef allocator_traits<typename _Fun::_Alloc> __alloc_traits; 1925*58b9f456SAndroid Build Coastguard Worker typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type 1926*58b9f456SAndroid Build Coastguard Worker _FunAlloc; 1927*58b9f456SAndroid Build Coastguard Worker _Fun* __f = static_cast<_Fun*>(__s); 1928*58b9f456SAndroid Build Coastguard Worker _FunAlloc __a(__f->__allocator()); 1929*58b9f456SAndroid Build Coastguard Worker __f->destroy(); 1930*58b9f456SAndroid Build Coastguard Worker __a.deallocate(__f, 1); 1931*58b9f456SAndroid Build Coastguard Worker } 1932*58b9f456SAndroid Build Coastguard Worker 1933*58b9f456SAndroid Build Coastguard Worker template <typename _Fun> 1934*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY static const __policy* 1935*58b9f456SAndroid Build Coastguard Worker __choose_policy(/* is_small = */ false_type) 1936*58b9f456SAndroid Build Coastguard Worker { 1937*58b9f456SAndroid Build Coastguard Worker static const _LIBCPP_CONSTEXPR __policy __policy_ = { 1938*58b9f456SAndroid Build Coastguard Worker &__large_clone<_Fun>, &__large_destroy<_Fun>, false, 1939*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 1940*58b9f456SAndroid Build Coastguard Worker &typeid(typename _Fun::_Target) 1941*58b9f456SAndroid Build Coastguard Worker#else 1942*58b9f456SAndroid Build Coastguard Worker nullptr 1943*58b9f456SAndroid Build Coastguard Worker#endif 1944*58b9f456SAndroid Build Coastguard Worker }; 1945*58b9f456SAndroid Build Coastguard Worker return &__policy_; 1946*58b9f456SAndroid Build Coastguard Worker } 1947*58b9f456SAndroid Build Coastguard Worker 1948*58b9f456SAndroid Build Coastguard Worker template <typename _Fun> 1949*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY static const __policy* 1950*58b9f456SAndroid Build Coastguard Worker __choose_policy(/* is_small = */ true_type) 1951*58b9f456SAndroid Build Coastguard Worker { 1952*58b9f456SAndroid Build Coastguard Worker static const _LIBCPP_CONSTEXPR __policy __policy_ = { 1953*58b9f456SAndroid Build Coastguard Worker nullptr, nullptr, false, 1954*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 1955*58b9f456SAndroid Build Coastguard Worker &typeid(typename _Fun::_Target) 1956*58b9f456SAndroid Build Coastguard Worker#else 1957*58b9f456SAndroid Build Coastguard Worker nullptr 1958*58b9f456SAndroid Build Coastguard Worker#endif 1959*58b9f456SAndroid Build Coastguard Worker }; 1960*58b9f456SAndroid Build Coastguard Worker return &__policy_; 1961*58b9f456SAndroid Build Coastguard Worker } 1962*58b9f456SAndroid Build Coastguard Worker}; 1963*58b9f456SAndroid Build Coastguard Worker 1964*58b9f456SAndroid Build Coastguard Worker// Used to choose between perfect forwarding or pass-by-value. Pass-by-value is 1965*58b9f456SAndroid Build Coastguard Worker// faster for types that can be passed in registers. 1966*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp> 1967*58b9f456SAndroid Build Coastguard Workerusing __fast_forward = 1968*58b9f456SAndroid Build Coastguard Worker typename _VSTD::conditional<_VSTD::is_scalar<_Tp>::value, _Tp, _Tp&&>::type; 1969*58b9f456SAndroid Build Coastguard Worker 1970*58b9f456SAndroid Build Coastguard Worker// __policy_invoker calls an instance of __alloc_func held in __policy_storage. 1971*58b9f456SAndroid Build Coastguard Worker 1972*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> struct __policy_invoker; 1973*58b9f456SAndroid Build Coastguard Worker 1974*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 1975*58b9f456SAndroid Build Coastguard Workerstruct __policy_invoker<_Rp(_ArgTypes...)> 1976*58b9f456SAndroid Build Coastguard Worker{ 1977*58b9f456SAndroid Build Coastguard Worker typedef _Rp (*__Call)(const __policy_storage*, 1978*58b9f456SAndroid Build Coastguard Worker __fast_forward<_ArgTypes>...); 1979*58b9f456SAndroid Build Coastguard Worker 1980*58b9f456SAndroid Build Coastguard Worker __Call __call_; 1981*58b9f456SAndroid Build Coastguard Worker 1982*58b9f456SAndroid Build Coastguard Worker // Creates an invoker that throws bad_function_call. 1983*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1984*58b9f456SAndroid Build Coastguard Worker __policy_invoker() : __call_(&__call_empty) {} 1985*58b9f456SAndroid Build Coastguard Worker 1986*58b9f456SAndroid Build Coastguard Worker // Creates an invoker that calls the given instance of __func. 1987*58b9f456SAndroid Build Coastguard Worker template <typename _Fun> 1988*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY static __policy_invoker __create() 1989*58b9f456SAndroid Build Coastguard Worker { 1990*58b9f456SAndroid Build Coastguard Worker return __policy_invoker(&__call_impl<_Fun>); 1991*58b9f456SAndroid Build Coastguard Worker } 1992*58b9f456SAndroid Build Coastguard Worker 1993*58b9f456SAndroid Build Coastguard Worker private: 1994*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1995*58b9f456SAndroid Build Coastguard Worker explicit __policy_invoker(__Call __c) : __call_(__c) {} 1996*58b9f456SAndroid Build Coastguard Worker 1997*58b9f456SAndroid Build Coastguard Worker static _Rp __call_empty(const __policy_storage*, 1998*58b9f456SAndroid Build Coastguard Worker __fast_forward<_ArgTypes>...) 1999*58b9f456SAndroid Build Coastguard Worker { 2000*58b9f456SAndroid Build Coastguard Worker __throw_bad_function_call(); 2001*58b9f456SAndroid Build Coastguard Worker } 2002*58b9f456SAndroid Build Coastguard Worker 2003*58b9f456SAndroid Build Coastguard Worker template <typename _Fun> 2004*58b9f456SAndroid Build Coastguard Worker static _Rp __call_impl(const __policy_storage* __buf, 2005*58b9f456SAndroid Build Coastguard Worker __fast_forward<_ArgTypes>... __args) 2006*58b9f456SAndroid Build Coastguard Worker { 2007*58b9f456SAndroid Build Coastguard Worker _Fun* __f = reinterpret_cast<_Fun*>(__use_small_storage<_Fun>::value 2008*58b9f456SAndroid Build Coastguard Worker ? &__buf->__small 2009*58b9f456SAndroid Build Coastguard Worker : __buf->__large); 2010*58b9f456SAndroid Build Coastguard Worker return (*__f)(_VSTD::forward<_ArgTypes>(__args)...); 2011*58b9f456SAndroid Build Coastguard Worker } 2012*58b9f456SAndroid Build Coastguard Worker}; 2013*58b9f456SAndroid Build Coastguard Worker 2014*58b9f456SAndroid Build Coastguard Worker// __policy_func uses a __policy and __policy_invoker to create a type-erased, 2015*58b9f456SAndroid Build Coastguard Worker// copyable functor. 2016*58b9f456SAndroid Build Coastguard Worker 2017*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> class __policy_func; 2018*58b9f456SAndroid Build Coastguard Worker 2019*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> class __policy_func<_Rp(_ArgTypes...)> 2020*58b9f456SAndroid Build Coastguard Worker{ 2021*58b9f456SAndroid Build Coastguard Worker // Inline storage for small objects. 2022*58b9f456SAndroid Build Coastguard Worker __policy_storage __buf_; 2023*58b9f456SAndroid Build Coastguard Worker 2024*58b9f456SAndroid Build Coastguard Worker // Calls the value stored in __buf_. This could technically be part of 2025*58b9f456SAndroid Build Coastguard Worker // policy, but storing it here eliminates a level of indirection inside 2026*58b9f456SAndroid Build Coastguard Worker // operator(). 2027*58b9f456SAndroid Build Coastguard Worker typedef __function::__policy_invoker<_Rp(_ArgTypes...)> __invoker; 2028*58b9f456SAndroid Build Coastguard Worker __invoker __invoker_; 2029*58b9f456SAndroid Build Coastguard Worker 2030*58b9f456SAndroid Build Coastguard Worker // The policy that describes how to move / copy / destroy __buf_. Never 2031*58b9f456SAndroid Build Coastguard Worker // null, even if the function is empty. 2032*58b9f456SAndroid Build Coastguard Worker const __policy* __policy_; 2033*58b9f456SAndroid Build Coastguard Worker 2034*58b9f456SAndroid Build Coastguard Worker public: 2035*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2036*58b9f456SAndroid Build Coastguard Worker __policy_func() : __policy_(__policy::__create_empty()) {} 2037*58b9f456SAndroid Build Coastguard Worker 2038*58b9f456SAndroid Build Coastguard Worker template <class _Fp, class _Alloc> 2039*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY __policy_func(_Fp&& __f, const _Alloc& __a) 2040*58b9f456SAndroid Build Coastguard Worker : __policy_(__policy::__create_empty()) 2041*58b9f456SAndroid Build Coastguard Worker { 2042*58b9f456SAndroid Build Coastguard Worker typedef __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun; 2043*58b9f456SAndroid Build Coastguard Worker typedef allocator_traits<_Alloc> __alloc_traits; 2044*58b9f456SAndroid Build Coastguard Worker typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type 2045*58b9f456SAndroid Build Coastguard Worker _FunAlloc; 2046*58b9f456SAndroid Build Coastguard Worker 2047*58b9f456SAndroid Build Coastguard Worker if (__function::__not_null(__f)) 2048*58b9f456SAndroid Build Coastguard Worker { 2049*58b9f456SAndroid Build Coastguard Worker __invoker_ = __invoker::template __create<_Fun>(); 2050*58b9f456SAndroid Build Coastguard Worker __policy_ = __policy::__create<_Fun>(); 2051*58b9f456SAndroid Build Coastguard Worker 2052*58b9f456SAndroid Build Coastguard Worker _FunAlloc __af(__a); 2053*58b9f456SAndroid Build Coastguard Worker if (__use_small_storage<_Fun>()) 2054*58b9f456SAndroid Build Coastguard Worker { 2055*58b9f456SAndroid Build Coastguard Worker ::new ((void*)&__buf_.__small) 2056*58b9f456SAndroid Build Coastguard Worker _Fun(_VSTD::move(__f), _Alloc(__af)); 2057*58b9f456SAndroid Build Coastguard Worker } 2058*58b9f456SAndroid Build Coastguard Worker else 2059*58b9f456SAndroid Build Coastguard Worker { 2060*58b9f456SAndroid Build Coastguard Worker typedef __allocator_destructor<_FunAlloc> _Dp; 2061*58b9f456SAndroid Build Coastguard Worker unique_ptr<_Fun, _Dp> __hold(__af.allocate(1), _Dp(__af, 1)); 2062*58b9f456SAndroid Build Coastguard Worker ::new ((void*)__hold.get()) 2063*58b9f456SAndroid Build Coastguard Worker _Fun(_VSTD::move(__f), _Alloc(__af)); 2064*58b9f456SAndroid Build Coastguard Worker __buf_.__large = __hold.release(); 2065*58b9f456SAndroid Build Coastguard Worker } 2066*58b9f456SAndroid Build Coastguard Worker } 2067*58b9f456SAndroid Build Coastguard Worker } 2068*58b9f456SAndroid Build Coastguard Worker 2069*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2070*58b9f456SAndroid Build Coastguard Worker __policy_func(const __policy_func& __f) 2071*58b9f456SAndroid Build Coastguard Worker : __buf_(__f.__buf_), __invoker_(__f.__invoker_), 2072*58b9f456SAndroid Build Coastguard Worker __policy_(__f.__policy_) 2073*58b9f456SAndroid Build Coastguard Worker { 2074*58b9f456SAndroid Build Coastguard Worker if (__policy_->__clone) 2075*58b9f456SAndroid Build Coastguard Worker __buf_.__large = __policy_->__clone(__f.__buf_.__large); 2076*58b9f456SAndroid Build Coastguard Worker } 2077*58b9f456SAndroid Build Coastguard Worker 2078*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2079*58b9f456SAndroid Build Coastguard Worker __policy_func(__policy_func&& __f) 2080*58b9f456SAndroid Build Coastguard Worker : __buf_(__f.__buf_), __invoker_(__f.__invoker_), 2081*58b9f456SAndroid Build Coastguard Worker __policy_(__f.__policy_) 2082*58b9f456SAndroid Build Coastguard Worker { 2083*58b9f456SAndroid Build Coastguard Worker if (__policy_->__destroy) 2084*58b9f456SAndroid Build Coastguard Worker { 2085*58b9f456SAndroid Build Coastguard Worker __f.__policy_ = __policy::__create_empty(); 2086*58b9f456SAndroid Build Coastguard Worker __f.__invoker_ = __invoker(); 2087*58b9f456SAndroid Build Coastguard Worker } 2088*58b9f456SAndroid Build Coastguard Worker } 2089*58b9f456SAndroid Build Coastguard Worker 2090*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2091*58b9f456SAndroid Build Coastguard Worker ~__policy_func() 2092*58b9f456SAndroid Build Coastguard Worker { 2093*58b9f456SAndroid Build Coastguard Worker if (__policy_->__destroy) 2094*58b9f456SAndroid Build Coastguard Worker __policy_->__destroy(__buf_.__large); 2095*58b9f456SAndroid Build Coastguard Worker } 2096*58b9f456SAndroid Build Coastguard Worker 2097*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2098*58b9f456SAndroid Build Coastguard Worker __policy_func& operator=(__policy_func&& __f) 2099*58b9f456SAndroid Build Coastguard Worker { 2100*58b9f456SAndroid Build Coastguard Worker *this = nullptr; 2101*58b9f456SAndroid Build Coastguard Worker __buf_ = __f.__buf_; 2102*58b9f456SAndroid Build Coastguard Worker __invoker_ = __f.__invoker_; 2103*58b9f456SAndroid Build Coastguard Worker __policy_ = __f.__policy_; 2104*58b9f456SAndroid Build Coastguard Worker __f.__policy_ = __policy::__create_empty(); 2105*58b9f456SAndroid Build Coastguard Worker __f.__invoker_ = __invoker(); 2106*58b9f456SAndroid Build Coastguard Worker return *this; 2107*58b9f456SAndroid Build Coastguard Worker } 2108*58b9f456SAndroid Build Coastguard Worker 2109*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2110*58b9f456SAndroid Build Coastguard Worker __policy_func& operator=(nullptr_t) 2111*58b9f456SAndroid Build Coastguard Worker { 2112*58b9f456SAndroid Build Coastguard Worker const __policy* __p = __policy_; 2113*58b9f456SAndroid Build Coastguard Worker __policy_ = __policy::__create_empty(); 2114*58b9f456SAndroid Build Coastguard Worker __invoker_ = __invoker(); 2115*58b9f456SAndroid Build Coastguard Worker if (__p->__destroy) 2116*58b9f456SAndroid Build Coastguard Worker __p->__destroy(__buf_.__large); 2117*58b9f456SAndroid Build Coastguard Worker return *this; 2118*58b9f456SAndroid Build Coastguard Worker } 2119*58b9f456SAndroid Build Coastguard Worker 2120*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2121*58b9f456SAndroid Build Coastguard Worker _Rp operator()(_ArgTypes&&... __args) const 2122*58b9f456SAndroid Build Coastguard Worker { 2123*58b9f456SAndroid Build Coastguard Worker return __invoker_.__call_(_VSTD::addressof(__buf_), 2124*58b9f456SAndroid Build Coastguard Worker _VSTD::forward<_ArgTypes>(__args)...); 2125*58b9f456SAndroid Build Coastguard Worker } 2126*58b9f456SAndroid Build Coastguard Worker 2127*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2128*58b9f456SAndroid Build Coastguard Worker void swap(__policy_func& __f) 2129*58b9f456SAndroid Build Coastguard Worker { 2130*58b9f456SAndroid Build Coastguard Worker _VSTD::swap(__invoker_, __f.__invoker_); 2131*58b9f456SAndroid Build Coastguard Worker _VSTD::swap(__policy_, __f.__policy_); 2132*58b9f456SAndroid Build Coastguard Worker _VSTD::swap(__buf_, __f.__buf_); 2133*58b9f456SAndroid Build Coastguard Worker } 2134*58b9f456SAndroid Build Coastguard Worker 2135*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2136*58b9f456SAndroid Build Coastguard Worker explicit operator bool() const _NOEXCEPT 2137*58b9f456SAndroid Build Coastguard Worker { 2138*58b9f456SAndroid Build Coastguard Worker return !__policy_->__is_null; 2139*58b9f456SAndroid Build Coastguard Worker } 2140*58b9f456SAndroid Build Coastguard Worker 2141*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 2142*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2143*58b9f456SAndroid Build Coastguard Worker const std::type_info& target_type() const _NOEXCEPT 2144*58b9f456SAndroid Build Coastguard Worker { 2145*58b9f456SAndroid Build Coastguard Worker return *__policy_->__type_info; 2146*58b9f456SAndroid Build Coastguard Worker } 2147*58b9f456SAndroid Build Coastguard Worker 2148*58b9f456SAndroid Build Coastguard Worker template <typename _Tp> 2149*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT 2150*58b9f456SAndroid Build Coastguard Worker { 2151*58b9f456SAndroid Build Coastguard Worker if (__policy_->__is_null || typeid(_Tp) != *__policy_->__type_info) 2152*58b9f456SAndroid Build Coastguard Worker return nullptr; 2153*58b9f456SAndroid Build Coastguard Worker if (__policy_->__clone) // Out of line storage. 2154*58b9f456SAndroid Build Coastguard Worker return reinterpret_cast<const _Tp*>(__buf_.__large); 2155*58b9f456SAndroid Build Coastguard Worker else 2156*58b9f456SAndroid Build Coastguard Worker return reinterpret_cast<const _Tp*>(&__buf_.__small); 2157*58b9f456SAndroid Build Coastguard Worker } 2158*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI 2159*58b9f456SAndroid Build Coastguard Worker}; 2160*58b9f456SAndroid Build Coastguard Worker 2161*58b9f456SAndroid Build Coastguard Worker} // __function 2162*58b9f456SAndroid Build Coastguard Worker 2163*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2164*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)> 2165*58b9f456SAndroid Build Coastguard Worker : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>, 2166*58b9f456SAndroid Build Coastguard Worker public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)> 2167*58b9f456SAndroid Build Coastguard Worker{ 2168*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_ABI_OPTIMIZED_FUNCTION 2169*58b9f456SAndroid Build Coastguard Worker typedef __function::__value_func<_Rp(_ArgTypes...)> __func; 2170*58b9f456SAndroid Build Coastguard Worker#else 2171*58b9f456SAndroid Build Coastguard Worker typedef __function::__policy_func<_Rp(_ArgTypes...)> __func; 2172*58b9f456SAndroid Build Coastguard Worker#endif 2173*58b9f456SAndroid Build Coastguard Worker 2174*58b9f456SAndroid Build Coastguard Worker __func __f_; 2175*58b9f456SAndroid Build Coastguard Worker 2176*58b9f456SAndroid Build Coastguard Worker template <class _Fp, bool = __lazy_and< 2177*58b9f456SAndroid Build Coastguard Worker integral_constant<bool, !is_same<__uncvref_t<_Fp>, function>::value>, 2178*58b9f456SAndroid Build Coastguard Worker __invokable<_Fp&, _ArgTypes...> 2179*58b9f456SAndroid Build Coastguard Worker >::value> 2180*58b9f456SAndroid Build Coastguard Worker struct __callable; 2181*58b9f456SAndroid Build Coastguard Worker template <class _Fp> 2182*58b9f456SAndroid Build Coastguard Worker struct __callable<_Fp, true> 2183*58b9f456SAndroid Build Coastguard Worker { 2184*58b9f456SAndroid Build Coastguard Worker static const bool value = is_same<void, _Rp>::value || 2185*58b9f456SAndroid Build Coastguard Worker is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type, 2186*58b9f456SAndroid Build Coastguard Worker _Rp>::value; 2187*58b9f456SAndroid Build Coastguard Worker }; 2188*58b9f456SAndroid Build Coastguard Worker template <class _Fp> 2189*58b9f456SAndroid Build Coastguard Worker struct __callable<_Fp, false> 2190*58b9f456SAndroid Build Coastguard Worker { 2191*58b9f456SAndroid Build Coastguard Worker static const bool value = false; 2192*58b9f456SAndroid Build Coastguard Worker }; 2193*58b9f456SAndroid Build Coastguard Worker 2194*58b9f456SAndroid Build Coastguard Worker template <class _Fp> 2195*58b9f456SAndroid Build Coastguard Worker using _EnableIfCallable = typename enable_if<__callable<_Fp>::value>::type; 2196*58b9f456SAndroid Build Coastguard Workerpublic: 2197*58b9f456SAndroid Build Coastguard Worker typedef _Rp result_type; 2198*58b9f456SAndroid Build Coastguard Worker 2199*58b9f456SAndroid Build Coastguard Worker // construct/copy/destroy: 2200*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2201*58b9f456SAndroid Build Coastguard Worker function() _NOEXCEPT { } 2202*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2203*58b9f456SAndroid Build Coastguard Worker function(nullptr_t) _NOEXCEPT {} 2204*58b9f456SAndroid Build Coastguard Worker function(const function&); 2205*58b9f456SAndroid Build Coastguard Worker function(function&&) _NOEXCEPT; 2206*58b9f456SAndroid Build Coastguard Worker template<class _Fp, class = _EnableIfCallable<_Fp>> 2207*58b9f456SAndroid Build Coastguard Worker function(_Fp); 2208*58b9f456SAndroid Build Coastguard Worker 2209*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14 2210*58b9f456SAndroid Build Coastguard Worker template<class _Alloc> 2211*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2212*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const _Alloc&) _NOEXCEPT {} 2213*58b9f456SAndroid Build Coastguard Worker template<class _Alloc> 2214*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2215*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT {} 2216*58b9f456SAndroid Build Coastguard Worker template<class _Alloc> 2217*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const _Alloc&, const function&); 2218*58b9f456SAndroid Build Coastguard Worker template<class _Alloc> 2219*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const _Alloc&, function&&); 2220*58b9f456SAndroid Build Coastguard Worker template<class _Fp, class _Alloc, class = _EnableIfCallable<_Fp>> 2221*58b9f456SAndroid Build Coastguard Worker function(allocator_arg_t, const _Alloc& __a, _Fp __f); 2222*58b9f456SAndroid Build Coastguard Worker#endif 2223*58b9f456SAndroid Build Coastguard Worker 2224*58b9f456SAndroid Build Coastguard Worker function& operator=(const function&); 2225*58b9f456SAndroid Build Coastguard Worker function& operator=(function&&) _NOEXCEPT; 2226*58b9f456SAndroid Build Coastguard Worker function& operator=(nullptr_t) _NOEXCEPT; 2227*58b9f456SAndroid Build Coastguard Worker template<class _Fp, class = _EnableIfCallable<_Fp>> 2228*58b9f456SAndroid Build Coastguard Worker function& operator=(_Fp&&); 2229*58b9f456SAndroid Build Coastguard Worker 2230*58b9f456SAndroid Build Coastguard Worker ~function(); 2231*58b9f456SAndroid Build Coastguard Worker 2232*58b9f456SAndroid Build Coastguard Worker // function modifiers: 2233*58b9f456SAndroid Build Coastguard Worker void swap(function&) _NOEXCEPT; 2234*58b9f456SAndroid Build Coastguard Worker 2235*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14 2236*58b9f456SAndroid Build Coastguard Worker template<class _Fp, class _Alloc> 2237*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2238*58b9f456SAndroid Build Coastguard Worker void assign(_Fp&& __f, const _Alloc& __a) 2239*58b9f456SAndroid Build Coastguard Worker {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);} 2240*58b9f456SAndroid Build Coastguard Worker#endif 2241*58b9f456SAndroid Build Coastguard Worker 2242*58b9f456SAndroid Build Coastguard Worker // function capacity: 2243*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2244*58b9f456SAndroid Build Coastguard Worker _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 2245*58b9f456SAndroid Build Coastguard Worker return static_cast<bool>(__f_); 2246*58b9f456SAndroid Build Coastguard Worker } 2247*58b9f456SAndroid Build Coastguard Worker 2248*58b9f456SAndroid Build Coastguard Worker // deleted overloads close possible hole in the type system 2249*58b9f456SAndroid Build Coastguard Worker template<class _R2, class... _ArgTypes2> 2250*58b9f456SAndroid Build Coastguard Worker bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete; 2251*58b9f456SAndroid Build Coastguard Worker template<class _R2, class... _ArgTypes2> 2252*58b9f456SAndroid Build Coastguard Worker bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete; 2253*58b9f456SAndroid Build Coastguard Workerpublic: 2254*58b9f456SAndroid Build Coastguard Worker // function invocation: 2255*58b9f456SAndroid Build Coastguard Worker _Rp operator()(_ArgTypes...) const; 2256*58b9f456SAndroid Build Coastguard Worker 2257*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 2258*58b9f456SAndroid Build Coastguard Worker // function target access: 2259*58b9f456SAndroid Build Coastguard Worker const std::type_info& target_type() const _NOEXCEPT; 2260*58b9f456SAndroid Build Coastguard Worker template <typename _Tp> _Tp* target() _NOEXCEPT; 2261*58b9f456SAndroid Build Coastguard Worker template <typename _Tp> const _Tp* target() const _NOEXCEPT; 2262*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI 2263*58b9f456SAndroid Build Coastguard Worker}; 2264*58b9f456SAndroid Build Coastguard Worker 2265*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2266*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(const function& __f) : __f_(__f.__f_) {} 2267*58b9f456SAndroid Build Coastguard Worker 2268*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14 2269*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2270*58b9f456SAndroid Build Coastguard Workertemplate <class _Alloc> 2271*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&, 2272*58b9f456SAndroid Build Coastguard Worker const function& __f) : __f_(__f.__f_) {} 2273*58b9f456SAndroid Build Coastguard Worker#endif 2274*58b9f456SAndroid Build Coastguard Worker 2275*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2276*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT 2277*58b9f456SAndroid Build Coastguard Worker : __f_(_VSTD::move(__f.__f_)) {} 2278*58b9f456SAndroid Build Coastguard Worker 2279*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14 2280*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2281*58b9f456SAndroid Build Coastguard Workertemplate <class _Alloc> 2282*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&, 2283*58b9f456SAndroid Build Coastguard Worker function&& __f) 2284*58b9f456SAndroid Build Coastguard Worker : __f_(_VSTD::move(__f.__f_)) {} 2285*58b9f456SAndroid Build Coastguard Worker#endif 2286*58b9f456SAndroid Build Coastguard Worker 2287*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2288*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class> 2289*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(_Fp __f) 2290*58b9f456SAndroid Build Coastguard Worker : __f_(_VSTD::move(__f), allocator<_Fp>()) {} 2291*58b9f456SAndroid Build Coastguard Worker 2292*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER <= 14 2293*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2294*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _Alloc, class> 2295*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a, 2296*58b9f456SAndroid Build Coastguard Worker _Fp __f) 2297*58b9f456SAndroid Build Coastguard Worker : __f_(_VSTD::move(__f), __a) {} 2298*58b9f456SAndroid Build Coastguard Worker#endif 2299*58b9f456SAndroid Build Coastguard Worker 2300*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2301*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>& 2302*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(const function& __f) 2303*58b9f456SAndroid Build Coastguard Worker{ 2304*58b9f456SAndroid Build Coastguard Worker function(__f).swap(*this); 2305*58b9f456SAndroid Build Coastguard Worker return *this; 2306*58b9f456SAndroid Build Coastguard Worker} 2307*58b9f456SAndroid Build Coastguard Worker 2308*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2309*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>& 2310*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT 2311*58b9f456SAndroid Build Coastguard Worker{ 2312*58b9f456SAndroid Build Coastguard Worker __f_ = std::move(__f.__f_); 2313*58b9f456SAndroid Build Coastguard Worker return *this; 2314*58b9f456SAndroid Build Coastguard Worker} 2315*58b9f456SAndroid Build Coastguard Worker 2316*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2317*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>& 2318*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT 2319*58b9f456SAndroid Build Coastguard Worker{ 2320*58b9f456SAndroid Build Coastguard Worker __f_ = nullptr; 2321*58b9f456SAndroid Build Coastguard Worker return *this; 2322*58b9f456SAndroid Build Coastguard Worker} 2323*58b9f456SAndroid Build Coastguard Worker 2324*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2325*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class> 2326*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>& 2327*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator=(_Fp&& __f) 2328*58b9f456SAndroid Build Coastguard Worker{ 2329*58b9f456SAndroid Build Coastguard Worker function(_VSTD::forward<_Fp>(__f)).swap(*this); 2330*58b9f456SAndroid Build Coastguard Worker return *this; 2331*58b9f456SAndroid Build Coastguard Worker} 2332*58b9f456SAndroid Build Coastguard Worker 2333*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2334*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::~function() {} 2335*58b9f456SAndroid Build Coastguard Worker 2336*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2337*58b9f456SAndroid Build Coastguard Workervoid 2338*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT 2339*58b9f456SAndroid Build Coastguard Worker{ 2340*58b9f456SAndroid Build Coastguard Worker __f_.swap(__f.__f_); 2341*58b9f456SAndroid Build Coastguard Worker} 2342*58b9f456SAndroid Build Coastguard Worker 2343*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2344*58b9f456SAndroid Build Coastguard Worker_Rp 2345*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const 2346*58b9f456SAndroid Build Coastguard Worker{ 2347*58b9f456SAndroid Build Coastguard Worker return __f_(_VSTD::forward<_ArgTypes>(__arg)...); 2348*58b9f456SAndroid Build Coastguard Worker} 2349*58b9f456SAndroid Build Coastguard Worker 2350*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_RTTI 2351*58b9f456SAndroid Build Coastguard Worker 2352*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2353*58b9f456SAndroid Build Coastguard Workerconst std::type_info& 2354*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT 2355*58b9f456SAndroid Build Coastguard Worker{ 2356*58b9f456SAndroid Build Coastguard Worker return __f_.target_type(); 2357*58b9f456SAndroid Build Coastguard Worker} 2358*58b9f456SAndroid Build Coastguard Worker 2359*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2360*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp> 2361*58b9f456SAndroid Build Coastguard Worker_Tp* 2362*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::target() _NOEXCEPT 2363*58b9f456SAndroid Build Coastguard Worker{ 2364*58b9f456SAndroid Build Coastguard Worker return (_Tp*)(__f_.template target<_Tp>()); 2365*58b9f456SAndroid Build Coastguard Worker} 2366*58b9f456SAndroid Build Coastguard Worker 2367*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class ..._ArgTypes> 2368*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp> 2369*58b9f456SAndroid Build Coastguard Workerconst _Tp* 2370*58b9f456SAndroid Build Coastguard Workerfunction<_Rp(_ArgTypes...)>::target() const _NOEXCEPT 2371*58b9f456SAndroid Build Coastguard Worker{ 2372*58b9f456SAndroid Build Coastguard Worker return __f_.template target<_Tp>(); 2373*58b9f456SAndroid Build Coastguard Worker} 2374*58b9f456SAndroid Build Coastguard Worker 2375*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_NO_RTTI 2376*58b9f456SAndroid Build Coastguard Worker 2377*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2378*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2379*58b9f456SAndroid Build Coastguard Workerbool 2380*58b9f456SAndroid Build Coastguard Workeroperator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;} 2381*58b9f456SAndroid Build Coastguard Worker 2382*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2383*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2384*58b9f456SAndroid Build Coastguard Workerbool 2385*58b9f456SAndroid Build Coastguard Workeroperator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;} 2386*58b9f456SAndroid Build Coastguard Worker 2387*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2388*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2389*58b9f456SAndroid Build Coastguard Workerbool 2390*58b9f456SAndroid Build Coastguard Workeroperator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;} 2391*58b9f456SAndroid Build Coastguard Worker 2392*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2393*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2394*58b9f456SAndroid Build Coastguard Workerbool 2395*58b9f456SAndroid Build Coastguard Workeroperator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;} 2396*58b9f456SAndroid Build Coastguard Worker 2397*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class... _ArgTypes> 2398*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2399*58b9f456SAndroid Build Coastguard Workervoid 2400*58b9f456SAndroid Build Coastguard Workerswap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT 2401*58b9f456SAndroid Build Coastguard Worker{return __x.swap(__y);} 2402*58b9f456SAndroid Build Coastguard Worker 2403*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_CXX03_LANG 2404*58b9f456SAndroid Build Coastguard Worker 2405*58b9f456SAndroid Build Coastguard Worker#include <__functional_03> 2406*58b9f456SAndroid Build Coastguard Worker 2407*58b9f456SAndroid Build Coastguard Worker#endif 2408*58b9f456SAndroid Build Coastguard Worker 2409*58b9f456SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 2410*58b9f456SAndroid Build Coastguard Worker// BIND 2411*58b9f456SAndroid Build Coastguard Worker//============================================================================== 2412*58b9f456SAndroid Build Coastguard Worker 2413*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct __is_bind_expression : public false_type {}; 2414*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_bind_expression 2415*58b9f456SAndroid Build Coastguard Worker : public __is_bind_expression<typename remove_cv<_Tp>::type> {}; 2416*58b9f456SAndroid Build Coastguard Worker 2417*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 2418*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 2419*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value; 2420*58b9f456SAndroid Build Coastguard Worker#endif 2421*58b9f456SAndroid Build Coastguard Worker 2422*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {}; 2423*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_placeholder 2424*58b9f456SAndroid Build Coastguard Worker : public __is_placeholder<typename remove_cv<_Tp>::type> {}; 2425*58b9f456SAndroid Build Coastguard Worker 2426*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 2427*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 2428*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value; 2429*58b9f456SAndroid Build Coastguard Worker#endif 2430*58b9f456SAndroid Build Coastguard Worker 2431*58b9f456SAndroid Build Coastguard Workernamespace placeholders 2432*58b9f456SAndroid Build Coastguard Worker{ 2433*58b9f456SAndroid Build Coastguard Worker 2434*58b9f456SAndroid Build Coastguard Workertemplate <int _Np> struct __ph {}; 2435*58b9f456SAndroid Build Coastguard Worker 2436*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) 2437*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<1> _1; 2438*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<2> _2; 2439*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<3> _3; 2440*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<4> _4; 2441*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<5> _5; 2442*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<6> _6; 2443*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<7> _7; 2444*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<8> _8; 2445*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<9> _9; 2446*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS extern const __ph<10> _10; 2447*58b9f456SAndroid Build Coastguard Worker#else 2448*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<1> _1{}; 2449*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<2> _2{}; 2450*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<3> _3{}; 2451*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<4> _4{}; 2452*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<5> _5{}; 2453*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<6> _6{}; 2454*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<7> _7{}; 2455*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<8> _8{}; 2456*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<9> _9{}; 2457*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr __ph<10> _10{}; 2458*58b9f456SAndroid Build Coastguard Worker#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) 2459*58b9f456SAndroid Build Coastguard Worker 2460*58b9f456SAndroid Build Coastguard Worker} // placeholders 2461*58b9f456SAndroid Build Coastguard Worker 2462*58b9f456SAndroid Build Coastguard Workertemplate<int _Np> 2463*58b9f456SAndroid Build Coastguard Workerstruct __is_placeholder<placeholders::__ph<_Np> > 2464*58b9f456SAndroid Build Coastguard Worker : public integral_constant<int, _Np> {}; 2465*58b9f456SAndroid Build Coastguard Worker 2466*58b9f456SAndroid Build Coastguard Worker 2467*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 2468*58b9f456SAndroid Build Coastguard Worker 2469*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Uj> 2470*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2471*58b9f456SAndroid Build Coastguard Worker_Tp& 2472*58b9f456SAndroid Build Coastguard Worker__mu(reference_wrapper<_Tp> __t, _Uj&) 2473*58b9f456SAndroid Build Coastguard Worker{ 2474*58b9f456SAndroid Build Coastguard Worker return __t.get(); 2475*58b9f456SAndroid Build Coastguard Worker} 2476*58b9f456SAndroid Build Coastguard Worker 2477*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj, size_t ..._Indx> 2478*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2479*58b9f456SAndroid Build Coastguard Workertypename __invoke_of<_Ti&, _Uj...>::type 2480*58b9f456SAndroid Build Coastguard Worker__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>) 2481*58b9f456SAndroid Build Coastguard Worker{ 2482*58b9f456SAndroid Build Coastguard Worker return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...); 2483*58b9f456SAndroid Build Coastguard Worker} 2484*58b9f456SAndroid Build Coastguard Worker 2485*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj> 2486*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2487*58b9f456SAndroid Build Coastguard Workertypename __lazy_enable_if 2488*58b9f456SAndroid Build Coastguard Worker< 2489*58b9f456SAndroid Build Coastguard Worker is_bind_expression<_Ti>::value, 2490*58b9f456SAndroid Build Coastguard Worker __invoke_of<_Ti&, _Uj...> 2491*58b9f456SAndroid Build Coastguard Worker>::type 2492*58b9f456SAndroid Build Coastguard Worker__mu(_Ti& __ti, tuple<_Uj...>& __uj) 2493*58b9f456SAndroid Build Coastguard Worker{ 2494*58b9f456SAndroid Build Coastguard Worker typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices; 2495*58b9f456SAndroid Build Coastguard Worker return __mu_expand(__ti, __uj, __indices()); 2496*58b9f456SAndroid Build Coastguard Worker} 2497*58b9f456SAndroid Build Coastguard Worker 2498*58b9f456SAndroid Build Coastguard Workertemplate <bool IsPh, class _Ti, class _Uj> 2499*58b9f456SAndroid Build Coastguard Workerstruct __mu_return2 {}; 2500*58b9f456SAndroid Build Coastguard Worker 2501*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _Uj> 2502*58b9f456SAndroid Build Coastguard Workerstruct __mu_return2<true, _Ti, _Uj> 2503*58b9f456SAndroid Build Coastguard Worker{ 2504*58b9f456SAndroid Build Coastguard Worker typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type; 2505*58b9f456SAndroid Build Coastguard Worker}; 2506*58b9f456SAndroid Build Coastguard Worker 2507*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _Uj> 2508*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2509*58b9f456SAndroid Build Coastguard Workertypename enable_if 2510*58b9f456SAndroid Build Coastguard Worker< 2511*58b9f456SAndroid Build Coastguard Worker 0 < is_placeholder<_Ti>::value, 2512*58b9f456SAndroid Build Coastguard Worker typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type 2513*58b9f456SAndroid Build Coastguard Worker>::type 2514*58b9f456SAndroid Build Coastguard Worker__mu(_Ti&, _Uj& __uj) 2515*58b9f456SAndroid Build Coastguard Worker{ 2516*58b9f456SAndroid Build Coastguard Worker const size_t _Indx = is_placeholder<_Ti>::value - 1; 2517*58b9f456SAndroid Build Coastguard Worker return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj)); 2518*58b9f456SAndroid Build Coastguard Worker} 2519*58b9f456SAndroid Build Coastguard Worker 2520*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _Uj> 2521*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2522*58b9f456SAndroid Build Coastguard Workertypename enable_if 2523*58b9f456SAndroid Build Coastguard Worker< 2524*58b9f456SAndroid Build Coastguard Worker !is_bind_expression<_Ti>::value && 2525*58b9f456SAndroid Build Coastguard Worker is_placeholder<_Ti>::value == 0 && 2526*58b9f456SAndroid Build Coastguard Worker !__is_reference_wrapper<_Ti>::value, 2527*58b9f456SAndroid Build Coastguard Worker _Ti& 2528*58b9f456SAndroid Build Coastguard Worker>::type 2529*58b9f456SAndroid Build Coastguard Worker__mu(_Ti& __ti, _Uj&) 2530*58b9f456SAndroid Build Coastguard Worker{ 2531*58b9f456SAndroid Build Coastguard Worker return __ti; 2532*58b9f456SAndroid Build Coastguard Worker} 2533*58b9f456SAndroid Build Coastguard Worker 2534*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh, 2535*58b9f456SAndroid Build Coastguard Worker class _TupleUj> 2536*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl; 2537*58b9f456SAndroid Build Coastguard Worker 2538*58b9f456SAndroid Build Coastguard Workertemplate <bool _Invokable, class _Ti, class ..._Uj> 2539*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_invokable // false 2540*58b9f456SAndroid Build Coastguard Worker{ 2541*58b9f456SAndroid Build Coastguard Worker typedef __nat type; 2542*58b9f456SAndroid Build Coastguard Worker}; 2543*58b9f456SAndroid Build Coastguard Worker 2544*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj> 2545*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_invokable<true, _Ti, _Uj...> 2546*58b9f456SAndroid Build Coastguard Worker{ 2547*58b9f456SAndroid Build Coastguard Worker typedef typename __invoke_of<_Ti&, _Uj...>::type type; 2548*58b9f456SAndroid Build Coastguard Worker}; 2549*58b9f456SAndroid Build Coastguard Worker 2550*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class ..._Uj> 2551*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, false, true, false, tuple<_Uj...> > 2552*58b9f456SAndroid Build Coastguard Worker : public __mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...> 2553*58b9f456SAndroid Build Coastguard Worker{ 2554*58b9f456SAndroid Build Coastguard Worker}; 2555*58b9f456SAndroid Build Coastguard Worker 2556*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj> 2557*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, false, false, true, _TupleUj> 2558*58b9f456SAndroid Build Coastguard Worker{ 2559*58b9f456SAndroid Build Coastguard Worker typedef typename tuple_element<is_placeholder<_Ti>::value - 1, 2560*58b9f456SAndroid Build Coastguard Worker _TupleUj>::type&& type; 2561*58b9f456SAndroid Build Coastguard Worker}; 2562*58b9f456SAndroid Build Coastguard Worker 2563*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj> 2564*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, true, false, false, _TupleUj> 2565*58b9f456SAndroid Build Coastguard Worker{ 2566*58b9f456SAndroid Build Coastguard Worker typedef typename _Ti::type& type; 2567*58b9f456SAndroid Build Coastguard Worker}; 2568*58b9f456SAndroid Build Coastguard Worker 2569*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj> 2570*58b9f456SAndroid Build Coastguard Workerstruct __mu_return_impl<_Ti, false, false, false, _TupleUj> 2571*58b9f456SAndroid Build Coastguard Worker{ 2572*58b9f456SAndroid Build Coastguard Worker typedef _Ti& type; 2573*58b9f456SAndroid Build Coastguard Worker}; 2574*58b9f456SAndroid Build Coastguard Worker 2575*58b9f456SAndroid Build Coastguard Workertemplate <class _Ti, class _TupleUj> 2576*58b9f456SAndroid Build Coastguard Workerstruct __mu_return 2577*58b9f456SAndroid Build Coastguard Worker : public __mu_return_impl<_Ti, 2578*58b9f456SAndroid Build Coastguard Worker __is_reference_wrapper<_Ti>::value, 2579*58b9f456SAndroid Build Coastguard Worker is_bind_expression<_Ti>::value, 2580*58b9f456SAndroid Build Coastguard Worker 0 < is_placeholder<_Ti>::value && 2581*58b9f456SAndroid Build Coastguard Worker is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value, 2582*58b9f456SAndroid Build Coastguard Worker _TupleUj> 2583*58b9f456SAndroid Build Coastguard Worker{ 2584*58b9f456SAndroid Build Coastguard Worker}; 2585*58b9f456SAndroid Build Coastguard Worker 2586*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _BoundArgs, class _TupleUj> 2587*58b9f456SAndroid Build Coastguard Workerstruct __is_valid_bind_return 2588*58b9f456SAndroid Build Coastguard Worker{ 2589*58b9f456SAndroid Build Coastguard Worker static const bool value = false; 2590*58b9f456SAndroid Build Coastguard Worker}; 2591*58b9f456SAndroid Build Coastguard Worker 2592*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj> 2593*58b9f456SAndroid Build Coastguard Workerstruct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj> 2594*58b9f456SAndroid Build Coastguard Worker{ 2595*58b9f456SAndroid Build Coastguard Worker static const bool value = __invokable<_Fp, 2596*58b9f456SAndroid Build Coastguard Worker typename __mu_return<_BoundArgs, _TupleUj>::type...>::value; 2597*58b9f456SAndroid Build Coastguard Worker}; 2598*58b9f456SAndroid Build Coastguard Worker 2599*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj> 2600*58b9f456SAndroid Build Coastguard Workerstruct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj> 2601*58b9f456SAndroid Build Coastguard Worker{ 2602*58b9f456SAndroid Build Coastguard Worker static const bool value = __invokable<_Fp, 2603*58b9f456SAndroid Build Coastguard Worker typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value; 2604*58b9f456SAndroid Build Coastguard Worker}; 2605*58b9f456SAndroid Build Coastguard Worker 2606*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _BoundArgs, class _TupleUj, 2607*58b9f456SAndroid Build Coastguard Worker bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value> 2608*58b9f456SAndroid Build Coastguard Workerstruct __bind_return; 2609*58b9f456SAndroid Build Coastguard Worker 2610*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj> 2611*58b9f456SAndroid Build Coastguard Workerstruct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true> 2612*58b9f456SAndroid Build Coastguard Worker{ 2613*58b9f456SAndroid Build Coastguard Worker typedef typename __invoke_of 2614*58b9f456SAndroid Build Coastguard Worker < 2615*58b9f456SAndroid Build Coastguard Worker _Fp&, 2616*58b9f456SAndroid Build Coastguard Worker typename __mu_return 2617*58b9f456SAndroid Build Coastguard Worker < 2618*58b9f456SAndroid Build Coastguard Worker _BoundArgs, 2619*58b9f456SAndroid Build Coastguard Worker _TupleUj 2620*58b9f456SAndroid Build Coastguard Worker >::type... 2621*58b9f456SAndroid Build Coastguard Worker >::type type; 2622*58b9f456SAndroid Build Coastguard Worker}; 2623*58b9f456SAndroid Build Coastguard Worker 2624*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class ..._BoundArgs, class _TupleUj> 2625*58b9f456SAndroid Build Coastguard Workerstruct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true> 2626*58b9f456SAndroid Build Coastguard Worker{ 2627*58b9f456SAndroid Build Coastguard Worker typedef typename __invoke_of 2628*58b9f456SAndroid Build Coastguard Worker < 2629*58b9f456SAndroid Build Coastguard Worker _Fp&, 2630*58b9f456SAndroid Build Coastguard Worker typename __mu_return 2631*58b9f456SAndroid Build Coastguard Worker < 2632*58b9f456SAndroid Build Coastguard Worker const _BoundArgs, 2633*58b9f456SAndroid Build Coastguard Worker _TupleUj 2634*58b9f456SAndroid Build Coastguard Worker >::type... 2635*58b9f456SAndroid Build Coastguard Worker >::type type; 2636*58b9f456SAndroid Build Coastguard Worker}; 2637*58b9f456SAndroid Build Coastguard Worker 2638*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args> 2639*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2640*58b9f456SAndroid Build Coastguard Workertypename __bind_return<_Fp, _BoundArgs, _Args>::type 2641*58b9f456SAndroid Build Coastguard Worker__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>, 2642*58b9f456SAndroid Build Coastguard Worker _Args&& __args) 2643*58b9f456SAndroid Build Coastguard Worker{ 2644*58b9f456SAndroid Build Coastguard Worker return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...); 2645*58b9f456SAndroid Build Coastguard Worker} 2646*58b9f456SAndroid Build Coastguard Worker 2647*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class ..._BoundArgs> 2648*58b9f456SAndroid Build Coastguard Workerclass __bind 2649*58b9f456SAndroid Build Coastguard Worker : public __weak_result_type<typename decay<_Fp>::type> 2650*58b9f456SAndroid Build Coastguard Worker{ 2651*58b9f456SAndroid Build Coastguard Workerprotected: 2652*58b9f456SAndroid Build Coastguard Worker typedef typename decay<_Fp>::type _Fd; 2653*58b9f456SAndroid Build Coastguard Worker typedef tuple<typename decay<_BoundArgs>::type...> _Td; 2654*58b9f456SAndroid Build Coastguard Workerprivate: 2655*58b9f456SAndroid Build Coastguard Worker _Fd __f_; 2656*58b9f456SAndroid Build Coastguard Worker _Td __bound_args_; 2657*58b9f456SAndroid Build Coastguard Worker 2658*58b9f456SAndroid Build Coastguard Worker typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices; 2659*58b9f456SAndroid Build Coastguard Workerpublic: 2660*58b9f456SAndroid Build Coastguard Worker template <class _Gp, class ..._BA, 2661*58b9f456SAndroid Build Coastguard Worker class = typename enable_if 2662*58b9f456SAndroid Build Coastguard Worker < 2663*58b9f456SAndroid Build Coastguard Worker is_constructible<_Fd, _Gp>::value && 2664*58b9f456SAndroid Build Coastguard Worker !is_same<typename remove_reference<_Gp>::type, 2665*58b9f456SAndroid Build Coastguard Worker __bind>::value 2666*58b9f456SAndroid Build Coastguard Worker >::type> 2667*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2668*58b9f456SAndroid Build Coastguard Worker explicit __bind(_Gp&& __f, _BA&& ...__bound_args) 2669*58b9f456SAndroid Build Coastguard Worker : __f_(_VSTD::forward<_Gp>(__f)), 2670*58b9f456SAndroid Build Coastguard Worker __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {} 2671*58b9f456SAndroid Build Coastguard Worker 2672*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2673*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2674*58b9f456SAndroid Build Coastguard Worker typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type 2675*58b9f456SAndroid Build Coastguard Worker operator()(_Args&& ...__args) 2676*58b9f456SAndroid Build Coastguard Worker { 2677*58b9f456SAndroid Build Coastguard Worker return _VSTD::__apply_functor(__f_, __bound_args_, __indices(), 2678*58b9f456SAndroid Build Coastguard Worker tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); 2679*58b9f456SAndroid Build Coastguard Worker } 2680*58b9f456SAndroid Build Coastguard Worker 2681*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2682*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2683*58b9f456SAndroid Build Coastguard Worker typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type 2684*58b9f456SAndroid Build Coastguard Worker operator()(_Args&& ...__args) const 2685*58b9f456SAndroid Build Coastguard Worker { 2686*58b9f456SAndroid Build Coastguard Worker return _VSTD::__apply_functor(__f_, __bound_args_, __indices(), 2687*58b9f456SAndroid Build Coastguard Worker tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); 2688*58b9f456SAndroid Build Coastguard Worker } 2689*58b9f456SAndroid Build Coastguard Worker}; 2690*58b9f456SAndroid Build Coastguard Worker 2691*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class ..._BoundArgs> 2692*58b9f456SAndroid Build Coastguard Workerstruct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {}; 2693*58b9f456SAndroid Build Coastguard Worker 2694*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Fp, class ..._BoundArgs> 2695*58b9f456SAndroid Build Coastguard Workerclass __bind_r 2696*58b9f456SAndroid Build Coastguard Worker : public __bind<_Fp, _BoundArgs...> 2697*58b9f456SAndroid Build Coastguard Worker{ 2698*58b9f456SAndroid Build Coastguard Worker typedef __bind<_Fp, _BoundArgs...> base; 2699*58b9f456SAndroid Build Coastguard Worker typedef typename base::_Fd _Fd; 2700*58b9f456SAndroid Build Coastguard Worker typedef typename base::_Td _Td; 2701*58b9f456SAndroid Build Coastguard Workerpublic: 2702*58b9f456SAndroid Build Coastguard Worker typedef _Rp result_type; 2703*58b9f456SAndroid Build Coastguard Worker 2704*58b9f456SAndroid Build Coastguard Worker 2705*58b9f456SAndroid Build Coastguard Worker template <class _Gp, class ..._BA, 2706*58b9f456SAndroid Build Coastguard Worker class = typename enable_if 2707*58b9f456SAndroid Build Coastguard Worker < 2708*58b9f456SAndroid Build Coastguard Worker is_constructible<_Fd, _Gp>::value && 2709*58b9f456SAndroid Build Coastguard Worker !is_same<typename remove_reference<_Gp>::type, 2710*58b9f456SAndroid Build Coastguard Worker __bind_r>::value 2711*58b9f456SAndroid Build Coastguard Worker >::type> 2712*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2713*58b9f456SAndroid Build Coastguard Worker explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args) 2714*58b9f456SAndroid Build Coastguard Worker : base(_VSTD::forward<_Gp>(__f), 2715*58b9f456SAndroid Build Coastguard Worker _VSTD::forward<_BA>(__bound_args)...) {} 2716*58b9f456SAndroid Build Coastguard Worker 2717*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2718*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2719*58b9f456SAndroid Build Coastguard Worker typename enable_if 2720*58b9f456SAndroid Build Coastguard Worker < 2721*58b9f456SAndroid Build Coastguard Worker is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type, 2722*58b9f456SAndroid Build Coastguard Worker result_type>::value || is_void<_Rp>::value, 2723*58b9f456SAndroid Build Coastguard Worker result_type 2724*58b9f456SAndroid Build Coastguard Worker >::type 2725*58b9f456SAndroid Build Coastguard Worker operator()(_Args&& ...__args) 2726*58b9f456SAndroid Build Coastguard Worker { 2727*58b9f456SAndroid Build Coastguard Worker typedef __invoke_void_return_wrapper<_Rp> _Invoker; 2728*58b9f456SAndroid Build Coastguard Worker return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...); 2729*58b9f456SAndroid Build Coastguard Worker } 2730*58b9f456SAndroid Build Coastguard Worker 2731*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2732*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2733*58b9f456SAndroid Build Coastguard Worker typename enable_if 2734*58b9f456SAndroid Build Coastguard Worker < 2735*58b9f456SAndroid Build Coastguard Worker is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type, 2736*58b9f456SAndroid Build Coastguard Worker result_type>::value || is_void<_Rp>::value, 2737*58b9f456SAndroid Build Coastguard Worker result_type 2738*58b9f456SAndroid Build Coastguard Worker >::type 2739*58b9f456SAndroid Build Coastguard Worker operator()(_Args&& ...__args) const 2740*58b9f456SAndroid Build Coastguard Worker { 2741*58b9f456SAndroid Build Coastguard Worker typedef __invoke_void_return_wrapper<_Rp> _Invoker; 2742*58b9f456SAndroid Build Coastguard Worker return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...); 2743*58b9f456SAndroid Build Coastguard Worker } 2744*58b9f456SAndroid Build Coastguard Worker}; 2745*58b9f456SAndroid Build Coastguard Worker 2746*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Fp, class ..._BoundArgs> 2747*58b9f456SAndroid Build Coastguard Workerstruct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {}; 2748*58b9f456SAndroid Build Coastguard Worker 2749*58b9f456SAndroid Build Coastguard Workertemplate<class _Fp, class ..._BoundArgs> 2750*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2751*58b9f456SAndroid Build Coastguard Worker__bind<_Fp, _BoundArgs...> 2752*58b9f456SAndroid Build Coastguard Workerbind(_Fp&& __f, _BoundArgs&&... __bound_args) 2753*58b9f456SAndroid Build Coastguard Worker{ 2754*58b9f456SAndroid Build Coastguard Worker typedef __bind<_Fp, _BoundArgs...> type; 2755*58b9f456SAndroid Build Coastguard Worker return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); 2756*58b9f456SAndroid Build Coastguard Worker} 2757*58b9f456SAndroid Build Coastguard Worker 2758*58b9f456SAndroid Build Coastguard Workertemplate<class _Rp, class _Fp, class ..._BoundArgs> 2759*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2760*58b9f456SAndroid Build Coastguard Worker__bind_r<_Rp, _Fp, _BoundArgs...> 2761*58b9f456SAndroid Build Coastguard Workerbind(_Fp&& __f, _BoundArgs&&... __bound_args) 2762*58b9f456SAndroid Build Coastguard Worker{ 2763*58b9f456SAndroid Build Coastguard Worker typedef __bind_r<_Rp, _Fp, _BoundArgs...> type; 2764*58b9f456SAndroid Build Coastguard Worker return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); 2765*58b9f456SAndroid Build Coastguard Worker} 2766*58b9f456SAndroid Build Coastguard Worker 2767*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 2768*58b9f456SAndroid Build Coastguard Worker 2769*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 2770*58b9f456SAndroid Build Coastguard Worker 2771*58b9f456SAndroid Build Coastguard Workertemplate <class _Fn, class ..._Args> 2772*58b9f456SAndroid Build Coastguard Workerresult_of_t<_Fn&&(_Args&&...)> 2773*58b9f456SAndroid Build Coastguard Workerinvoke(_Fn&& __f, _Args&&... __args) 2774*58b9f456SAndroid Build Coastguard Worker noexcept(noexcept(_VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...))) 2775*58b9f456SAndroid Build Coastguard Worker{ 2776*58b9f456SAndroid Build Coastguard Worker return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...); 2777*58b9f456SAndroid Build Coastguard Worker} 2778*58b9f456SAndroid Build Coastguard Worker 2779*58b9f456SAndroid Build Coastguard Workertemplate <class _DecayFunc> 2780*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS __not_fn_imp { 2781*58b9f456SAndroid Build Coastguard Worker _DecayFunc __fd; 2782*58b9f456SAndroid Build Coastguard Worker 2783*58b9f456SAndroid Build Coastguard Workerpublic: 2784*58b9f456SAndroid Build Coastguard Worker __not_fn_imp() = delete; 2785*58b9f456SAndroid Build Coastguard Worker 2786*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2787*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2788*58b9f456SAndroid Build Coastguard Worker auto operator()(_Args&& ...__args) & 2789*58b9f456SAndroid Build Coastguard Worker noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))) 2790*58b9f456SAndroid Build Coastguard Worker -> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)) 2791*58b9f456SAndroid Build Coastguard Worker { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); } 2792*58b9f456SAndroid Build Coastguard Worker 2793*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2794*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2795*58b9f456SAndroid Build Coastguard Worker auto operator()(_Args&& ...__args) && 2796*58b9f456SAndroid Build Coastguard Worker noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))) 2797*58b9f456SAndroid Build Coastguard Worker -> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)) 2798*58b9f456SAndroid Build Coastguard Worker { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); } 2799*58b9f456SAndroid Build Coastguard Worker 2800*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2801*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2802*58b9f456SAndroid Build Coastguard Worker auto operator()(_Args&& ...__args) const& 2803*58b9f456SAndroid Build Coastguard Worker noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))) 2804*58b9f456SAndroid Build Coastguard Worker -> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)) 2805*58b9f456SAndroid Build Coastguard Worker { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); } 2806*58b9f456SAndroid Build Coastguard Worker 2807*58b9f456SAndroid Build Coastguard Worker 2808*58b9f456SAndroid Build Coastguard Worker template <class ..._Args> 2809*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2810*58b9f456SAndroid Build Coastguard Worker auto operator()(_Args&& ...__args) const&& 2811*58b9f456SAndroid Build Coastguard Worker noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))) 2812*58b9f456SAndroid Build Coastguard Worker -> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)) 2813*58b9f456SAndroid Build Coastguard Worker { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); } 2814*58b9f456SAndroid Build Coastguard Worker 2815*58b9f456SAndroid Build Coastguard Workerprivate: 2816*58b9f456SAndroid Build Coastguard Worker template <class _RawFunc, 2817*58b9f456SAndroid Build Coastguard Worker class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>> 2818*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2819*58b9f456SAndroid Build Coastguard Worker explicit __not_fn_imp(_RawFunc&& __rf) 2820*58b9f456SAndroid Build Coastguard Worker : __fd(_VSTD::forward<_RawFunc>(__rf)) {} 2821*58b9f456SAndroid Build Coastguard Worker 2822*58b9f456SAndroid Build Coastguard Worker template <class _RawFunc> 2823*58b9f456SAndroid Build Coastguard Worker friend inline _LIBCPP_INLINE_VISIBILITY 2824*58b9f456SAndroid Build Coastguard Worker __not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&); 2825*58b9f456SAndroid Build Coastguard Worker}; 2826*58b9f456SAndroid Build Coastguard Worker 2827*58b9f456SAndroid Build Coastguard Workertemplate <class _RawFunc> 2828*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 2829*58b9f456SAndroid Build Coastguard Worker__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) { 2830*58b9f456SAndroid Build Coastguard Worker return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn)); 2831*58b9f456SAndroid Build Coastguard Worker} 2832*58b9f456SAndroid Build Coastguard Worker 2833*58b9f456SAndroid Build Coastguard Worker#endif 2834*58b9f456SAndroid Build Coastguard Worker 2835*58b9f456SAndroid Build Coastguard Worker// struct hash<T*> in <memory> 2836*58b9f456SAndroid Build Coastguard Worker 2837*58b9f456SAndroid Build Coastguard Workertemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2> 2838*58b9f456SAndroid Build Coastguard Workerpair<_ForwardIterator1, _ForwardIterator1> _LIBCPP_CONSTEXPR_AFTER_CXX11 2839*58b9f456SAndroid Build Coastguard Worker__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 2840*58b9f456SAndroid Build Coastguard Worker _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred, 2841*58b9f456SAndroid Build Coastguard Worker forward_iterator_tag, forward_iterator_tag) 2842*58b9f456SAndroid Build Coastguard Worker{ 2843*58b9f456SAndroid Build Coastguard Worker if (__first2 == __last2) 2844*58b9f456SAndroid Build Coastguard Worker return make_pair(__first1, __first1); // Everything matches an empty sequence 2845*58b9f456SAndroid Build Coastguard Worker while (true) 2846*58b9f456SAndroid Build Coastguard Worker { 2847*58b9f456SAndroid Build Coastguard Worker // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks 2848*58b9f456SAndroid Build Coastguard Worker while (true) 2849*58b9f456SAndroid Build Coastguard Worker { 2850*58b9f456SAndroid Build Coastguard Worker if (__first1 == __last1) // return __last1 if no element matches *__first2 2851*58b9f456SAndroid Build Coastguard Worker return make_pair(__last1, __last1); 2852*58b9f456SAndroid Build Coastguard Worker if (__pred(*__first1, *__first2)) 2853*58b9f456SAndroid Build Coastguard Worker break; 2854*58b9f456SAndroid Build Coastguard Worker ++__first1; 2855*58b9f456SAndroid Build Coastguard Worker } 2856*58b9f456SAndroid Build Coastguard Worker // *__first1 matches *__first2, now match elements after here 2857*58b9f456SAndroid Build Coastguard Worker _ForwardIterator1 __m1 = __first1; 2858*58b9f456SAndroid Build Coastguard Worker _ForwardIterator2 __m2 = __first2; 2859*58b9f456SAndroid Build Coastguard Worker while (true) 2860*58b9f456SAndroid Build Coastguard Worker { 2861*58b9f456SAndroid Build Coastguard Worker if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern) 2862*58b9f456SAndroid Build Coastguard Worker return make_pair(__first1, __m1); 2863*58b9f456SAndroid Build Coastguard Worker if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found 2864*58b9f456SAndroid Build Coastguard Worker return make_pair(__last1, __last1); 2865*58b9f456SAndroid Build Coastguard Worker if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1 2866*58b9f456SAndroid Build Coastguard Worker { 2867*58b9f456SAndroid Build Coastguard Worker ++__first1; 2868*58b9f456SAndroid Build Coastguard Worker break; 2869*58b9f456SAndroid Build Coastguard Worker } // else there is a match, check next elements 2870*58b9f456SAndroid Build Coastguard Worker } 2871*58b9f456SAndroid Build Coastguard Worker } 2872*58b9f456SAndroid Build Coastguard Worker} 2873*58b9f456SAndroid Build Coastguard Worker 2874*58b9f456SAndroid Build Coastguard Workertemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2> 2875*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR_AFTER_CXX11 2876*58b9f456SAndroid Build Coastguard Workerpair<_RandomAccessIterator1, _RandomAccessIterator1> 2877*58b9f456SAndroid Build Coastguard Worker__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, 2878*58b9f456SAndroid Build Coastguard Worker _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred, 2879*58b9f456SAndroid Build Coastguard Worker random_access_iterator_tag, random_access_iterator_tag) 2880*58b9f456SAndroid Build Coastguard Worker{ 2881*58b9f456SAndroid Build Coastguard Worker typedef typename iterator_traits<_RandomAccessIterator1>::difference_type _D1; 2882*58b9f456SAndroid Build Coastguard Worker typedef typename iterator_traits<_RandomAccessIterator2>::difference_type _D2; 2883*58b9f456SAndroid Build Coastguard Worker // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern 2884*58b9f456SAndroid Build Coastguard Worker const _D2 __len2 = __last2 - __first2; 2885*58b9f456SAndroid Build Coastguard Worker if (__len2 == 0) 2886*58b9f456SAndroid Build Coastguard Worker return make_pair(__first1, __first1); 2887*58b9f456SAndroid Build Coastguard Worker const _D1 __len1 = __last1 - __first1; 2888*58b9f456SAndroid Build Coastguard Worker if (__len1 < __len2) 2889*58b9f456SAndroid Build Coastguard Worker return make_pair(__last1, __last1); 2890*58b9f456SAndroid Build Coastguard Worker const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here 2891*58b9f456SAndroid Build Coastguard Worker 2892*58b9f456SAndroid Build Coastguard Worker while (true) 2893*58b9f456SAndroid Build Coastguard Worker { 2894*58b9f456SAndroid Build Coastguard Worker while (true) 2895*58b9f456SAndroid Build Coastguard Worker { 2896*58b9f456SAndroid Build Coastguard Worker if (__first1 == __s) 2897*58b9f456SAndroid Build Coastguard Worker return make_pair(__last1, __last1); 2898*58b9f456SAndroid Build Coastguard Worker if (__pred(*__first1, *__first2)) 2899*58b9f456SAndroid Build Coastguard Worker break; 2900*58b9f456SAndroid Build Coastguard Worker ++__first1; 2901*58b9f456SAndroid Build Coastguard Worker } 2902*58b9f456SAndroid Build Coastguard Worker 2903*58b9f456SAndroid Build Coastguard Worker _RandomAccessIterator1 __m1 = __first1; 2904*58b9f456SAndroid Build Coastguard Worker _RandomAccessIterator2 __m2 = __first2; 2905*58b9f456SAndroid Build Coastguard Worker while (true) 2906*58b9f456SAndroid Build Coastguard Worker { 2907*58b9f456SAndroid Build Coastguard Worker if (++__m2 == __last2) 2908*58b9f456SAndroid Build Coastguard Worker return make_pair(__first1, __first1 + __len2); 2909*58b9f456SAndroid Build Coastguard Worker ++__m1; // no need to check range on __m1 because __s guarantees we have enough source 2910*58b9f456SAndroid Build Coastguard Worker if (!__pred(*__m1, *__m2)) 2911*58b9f456SAndroid Build Coastguard Worker { 2912*58b9f456SAndroid Build Coastguard Worker ++__first1; 2913*58b9f456SAndroid Build Coastguard Worker break; 2914*58b9f456SAndroid Build Coastguard Worker } 2915*58b9f456SAndroid Build Coastguard Worker } 2916*58b9f456SAndroid Build Coastguard Worker } 2917*58b9f456SAndroid Build Coastguard Worker} 2918*58b9f456SAndroid Build Coastguard Worker 2919*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 2920*58b9f456SAndroid Build Coastguard Worker 2921*58b9f456SAndroid Build Coastguard Worker// default searcher 2922*58b9f456SAndroid Build Coastguard Workertemplate<class _ForwardIterator, class _BinaryPredicate = equal_to<>> 2923*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TYPE_VIS default_searcher { 2924*58b9f456SAndroid Build Coastguard Workerpublic: 2925*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2926*58b9f456SAndroid Build Coastguard Worker default_searcher(_ForwardIterator __f, _ForwardIterator __l, 2927*58b9f456SAndroid Build Coastguard Worker _BinaryPredicate __p = _BinaryPredicate()) 2928*58b9f456SAndroid Build Coastguard Worker : __first_(__f), __last_(__l), __pred_(__p) {} 2929*58b9f456SAndroid Build Coastguard Worker 2930*58b9f456SAndroid Build Coastguard Worker template <typename _ForwardIterator2> 2931*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 2932*58b9f456SAndroid Build Coastguard Worker pair<_ForwardIterator2, _ForwardIterator2> 2933*58b9f456SAndroid Build Coastguard Worker operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const 2934*58b9f456SAndroid Build Coastguard Worker { 2935*58b9f456SAndroid Build Coastguard Worker return _VSTD::__search(__f, __l, __first_, __last_, __pred_, 2936*58b9f456SAndroid Build Coastguard Worker typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category(), 2937*58b9f456SAndroid Build Coastguard Worker typename _VSTD::iterator_traits<_ForwardIterator2>::iterator_category()); 2938*58b9f456SAndroid Build Coastguard Worker } 2939*58b9f456SAndroid Build Coastguard Worker 2940*58b9f456SAndroid Build Coastguard Workerprivate: 2941*58b9f456SAndroid Build Coastguard Worker _ForwardIterator __first_; 2942*58b9f456SAndroid Build Coastguard Worker _ForwardIterator __last_; 2943*58b9f456SAndroid Build Coastguard Worker _BinaryPredicate __pred_; 2944*58b9f456SAndroid Build Coastguard Worker }; 2945*58b9f456SAndroid Build Coastguard Worker 2946*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_STD_VER > 14 2947*58b9f456SAndroid Build Coastguard Worker 2948*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 17 2949*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 2950*58b9f456SAndroid Build Coastguard Workerusing unwrap_reference_t = typename unwrap_reference<_Tp>::type; 2951*58b9f456SAndroid Build Coastguard Worker 2952*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 2953*58b9f456SAndroid Build Coastguard Workerusing unwrap_ref_decay_t = typename unwrap_ref_decay<_Tp>::type; 2954*58b9f456SAndroid Build Coastguard Worker#endif // > C++17 2955*58b9f456SAndroid Build Coastguard Worker 2956*58b9f456SAndroid Build Coastguard Workertemplate <class _Container, class _Predicate> 2957*58b9f456SAndroid Build Coastguard Workerinline void __libcpp_erase_if_container( _Container& __c, _Predicate __pred) 2958*58b9f456SAndroid Build Coastguard Worker{ 2959*58b9f456SAndroid Build Coastguard Worker for (typename _Container::iterator __iter = __c.begin(), __last = __c.end(); __iter != __last;) 2960*58b9f456SAndroid Build Coastguard Worker { 2961*58b9f456SAndroid Build Coastguard Worker if (__pred(*__iter)) 2962*58b9f456SAndroid Build Coastguard Worker __iter = __c.erase(__iter); 2963*58b9f456SAndroid Build Coastguard Worker else 2964*58b9f456SAndroid Build Coastguard Worker ++__iter; 2965*58b9f456SAndroid Build Coastguard Worker } 2966*58b9f456SAndroid Build Coastguard Worker} 2967*58b9f456SAndroid Build Coastguard Worker 2968*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD 2969*58b9f456SAndroid Build Coastguard Worker 2970*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_FUNCTIONAL 2971