12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672 |
- // -*- C++ -*-
- //===------------------------ functional ----------------------------------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is dual licensed under the MIT and the University of Illinois Open
- // Source Licenses. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- #ifndef _LIBCPP_FUNCTIONAL
- #define _LIBCPP_FUNCTIONAL
- /*
- functional synopsis
- namespace std
- {
- template <class Arg, class Result>
- struct unary_function
- {
- typedef Arg argument_type;
- typedef Result result_type;
- };
- template <class Arg1, class Arg2, class Result>
- struct binary_function
- {
- typedef Arg1 first_argument_type;
- typedef Arg2 second_argument_type;
- typedef Result result_type;
- };
- template <class T>
- class reference_wrapper
- : public unary_function<T1, R> // if wrapping a unary functor
- : public binary_function<T1, T2, R> // if wraping a binary functor
- {
- public:
- // types
- typedef T type;
- typedef see below result_type; // Not always defined
- // construct/copy/destroy
- reference_wrapper(T&) noexcept;
- reference_wrapper(T&&) = delete; // do not bind to temps
- reference_wrapper(const reference_wrapper<T>& x) noexcept;
- // assignment
- reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
- // access
- operator T& () const noexcept;
- T& get() const noexcept;
- // invoke
- template <class... ArgTypes>
- typename result_of<T&(ArgTypes&&...)>::type
- operator() (ArgTypes&&...) const;
- };
- template <class T> reference_wrapper<T> ref(T& t) noexcept;
- template <class T> void ref(const T&& t) = delete;
- template <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
- template <class T> reference_wrapper<const T> cref(const T& t) noexcept;
- template <class T> void cref(const T&& t) = delete;
- template <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
- template <class T> // <class T=void> in C++14
- struct plus : binary_function<T, T, T>
- {
- T operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct minus : binary_function<T, T, T>
- {
- T operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct multiplies : binary_function<T, T, T>
- {
- T operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct divides : binary_function<T, T, T>
- {
- T operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct modulus : binary_function<T, T, T>
- {
- T operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct negate : unary_function<T, T>
- {
- T operator()(const T& x) const;
- };
- template <class T> // <class T=void> in C++14
- struct equal_to : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct not_equal_to : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct greater : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct less : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct greater_equal : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct less_equal : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct logical_and : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct logical_or : binary_function<T, T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct logical_not : unary_function<T, bool>
- {
- bool operator()(const T& x) const;
- };
- template <class T> // <class T=void> in C++14
- struct bit_and : unary_function<T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct bit_or : unary_function<T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T> // <class T=void> in C++14
- struct bit_xor : unary_function<T, bool>
- {
- bool operator()(const T& x, const T& y) const;
- };
- template <class T=void> // C++14
- struct bit_xor : unary_function<T, bool>
- {
- bool operator()(const T& x) const;
- };
- template <class Predicate>
- class unary_negate
- : public unary_function<typename Predicate::argument_type, bool>
- {
- public:
- explicit unary_negate(const Predicate& pred);
- bool operator()(const typename Predicate::argument_type& x) const;
- };
- template <class Predicate> unary_negate<Predicate> not1(const Predicate& pred);
- template <class Predicate>
- class binary_negate
- : public binary_function<typename Predicate::first_argument_type,
- typename Predicate::second_argument_type,
- bool>
- {
- public:
- explicit binary_negate(const Predicate& pred);
- bool operator()(const typename Predicate::first_argument_type& x,
- const typename Predicate::second_argument_type& y) const;
- };
- template <class Predicate> binary_negate<Predicate> not2(const Predicate& pred);
- template <class F> unspecified not_fn(F&& f); // C++17
- template<class T> struct is_bind_expression;
- template<class T> struct is_placeholder;
- template<class Fn, class... BoundArgs>
- unspecified bind(Fn&&, BoundArgs&&...);
- template<class R, class Fn, class... BoundArgs>
- unspecified bind(Fn&&, BoundArgs&&...);
- namespace placeholders {
- // M is the implementation-defined number of placeholders
- extern unspecified _1;
- extern unspecified _2;
- .
- .
- .
- extern unspecified _Mp;
- }
- template <class Operation>
- class binder1st
- : public unary_function<typename Operation::second_argument_type,
- typename Operation::result_type>
- {
- protected:
- Operation op;
- typename Operation::first_argument_type value;
- public:
- binder1st(const Operation& x, const typename Operation::first_argument_type y);
- typename Operation::result_type operator()( typename Operation::second_argument_type& x) const;
- typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const;
- };
- template <class Operation, class T>
- binder1st<Operation> bind1st(const Operation& op, const T& x);
- template <class Operation>
- class binder2nd
- : public unary_function<typename Operation::first_argument_type,
- typename Operation::result_type>
- {
- protected:
- Operation op;
- typename Operation::second_argument_type value;
- public:
- binder2nd(const Operation& x, const typename Operation::second_argument_type y);
- typename Operation::result_type operator()( typename Operation::first_argument_type& x) const;
- typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const;
- };
- template <class Operation, class T>
- binder2nd<Operation> bind2nd(const Operation& op, const T& x);
- template <class Arg, class Result>
- class pointer_to_unary_function : public unary_function<Arg, Result>
- {
- public:
- explicit pointer_to_unary_function(Result (*f)(Arg));
- Result operator()(Arg x) const;
- };
- template <class Arg, class Result>
- pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg));
- template <class Arg1, class Arg2, class Result>
- class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result>
- {
- public:
- explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
- Result operator()(Arg1 x, Arg2 y) const;
- };
- template <class Arg1, class Arg2, class Result>
- pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2));
- template<class S, class T>
- class mem_fun_t : public unary_function<T*, S>
- {
- public:
- explicit mem_fun_t(S (T::*p)());
- S operator()(T* p) const;
- };
- template<class S, class T, class A>
- class mem_fun1_t : public binary_function<T*, A, S>
- {
- public:
- explicit mem_fun1_t(S (T::*p)(A));
- S operator()(T* p, A x) const;
- };
- template<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)());
- template<class S, class T, class A> mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A));
- template<class S, class T>
- class mem_fun_ref_t : public unary_function<T, S>
- {
- public:
- explicit mem_fun_ref_t(S (T::*p)());
- S operator()(T& p) const;
- };
- template<class S, class T, class A>
- class mem_fun1_ref_t : public binary_function<T, A, S>
- {
- public:
- explicit mem_fun1_ref_t(S (T::*p)(A));
- S operator()(T& p, A x) const;
- };
- template<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)());
- template<class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A));
- template <class S, class T>
- class const_mem_fun_t : public unary_function<const T*, S>
- {
- public:
- explicit const_mem_fun_t(S (T::*p)() const);
- S operator()(const T* p) const;
- };
- template <class S, class T, class A>
- class const_mem_fun1_t : public binary_function<const T*, A, S>
- {
- public:
- explicit const_mem_fun1_t(S (T::*p)(A) const);
- S operator()(const T* p, A x) const;
- };
- template <class S, class T> const_mem_fun_t<S,T> mem_fun(S (T::*f)() const);
- template <class S, class T, class A> const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const);
- template <class S, class T>
- class const_mem_fun_ref_t : public unary_function<T, S>
- {
- public:
- explicit const_mem_fun_ref_t(S (T::*p)() const);
- S operator()(const T& p) const;
- };
- template <class S, class T, class A>
- class const_mem_fun1_ref_t : public binary_function<T, A, S>
- {
- public:
- explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
- S operator()(const T& p, A x) const;
- };
- template <class S, class T> const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const);
- template <class S, class T, class A> const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const);
- template<class R, class T> unspecified mem_fn(R T::*);
- class bad_function_call
- : public exception
- {
- };
- template<class> class function; // undefined
- template<class R, class... ArgTypes>
- class function<R(ArgTypes...)>
- : public unary_function<T1, R> // iff sizeof...(ArgTypes) == 1 and
- // ArgTypes contains T1
- : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and
- // ArgTypes contains T1 and T2
- {
- public:
- typedef R result_type;
- // construct/copy/destroy:
- function() noexcept;
- function(nullptr_t) noexcept;
- function(const function&);
- function(function&&) noexcept;
- template<class F>
- function(F);
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&) noexcept;
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&, nullptr_t) noexcept;
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&, const function&);
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&, function&&);
- template<class F, Allocator Alloc>
- function(allocator_arg_t, const Alloc&, F);
- function& operator=(const function&);
- function& operator=(function&&) noexcept;
- function& operator=(nullptr_t) noexcept;
- template<class F>
- function& operator=(F&&);
- template<class F>
- function& operator=(reference_wrapper<F>) noexcept;
- ~function();
- // function modifiers:
- void swap(function&) noexcept;
- template<class F, class Alloc>
- void assign(F&&, const Alloc&); // Removed in C++17
- // function capacity:
- explicit operator bool() const noexcept;
- // function invocation:
- R operator()(ArgTypes...) const;
- // function target access:
- const std::type_info& target_type() const noexcept;
- template <typename T> T* target() noexcept;
- template <typename T> const T* target() const noexcept;
- };
- // Null pointer comparisons:
- template <class R, class ... ArgTypes>
- bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
- template <class R, class ... ArgTypes>
- bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
- template <class R, class ... ArgTypes>
- bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
- template <class R, class ... ArgTypes>
- bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
- // specialized algorithms:
- template <class R, class ... ArgTypes>
- void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
- template <class T> struct hash;
- template <> struct hash<bool>;
- template <> struct hash<char>;
- template <> struct hash<signed char>;
- template <> struct hash<unsigned char>;
- template <> struct hash<char16_t>;
- template <> struct hash<char32_t>;
- template <> struct hash<wchar_t>;
- template <> struct hash<short>;
- template <> struct hash<unsigned short>;
- template <> struct hash<int>;
- template <> struct hash<unsigned int>;
- template <> struct hash<long>;
- template <> struct hash<long long>;
- template <> struct hash<unsigned long>;
- template <> struct hash<unsigned long long>;
- template <> struct hash<float>;
- template <> struct hash<double>;
- template <> struct hash<long double>;
- template<class T> struct hash<T*>;
- } // std
- POLICY: For non-variadic implementations, the number of arguments is limited
- to 3. It is hoped that the need for non-variadic implementations
- will be minimal.
- */
- #include <__config>
- #include <type_traits>
- #include <typeinfo>
- #include <exception>
- #include <memory>
- #include <tuple>
- #include <__functional_base>
- #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
- #pragma GCC system_header
- #endif
- _LIBCPP_BEGIN_NAMESPACE_STD
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY plus : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x + __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY plus<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY minus : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x - __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY minus<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY multiplies : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x * __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY multiplies<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY divides : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x / __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY divides<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY modulus : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x % __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY modulus<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY negate : unary_function<_Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return -__x;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY negate<void>
- {
- template <class _Tp>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Tp&& __x) const
- _NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x)))
- -> decltype (- _VSTD::forward<_Tp>(__x))
- { return - _VSTD::forward<_Tp>(__x); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY equal_to : binary_function<_Tp, _Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x == __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY equal_to<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY not_equal_to : binary_function<_Tp, _Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x != __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY not_equal_to<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY greater : binary_function<_Tp, _Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x > __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY greater<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- // less in <__functional_base>
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY greater_equal : binary_function<_Tp, _Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x >= __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY greater_equal<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY less_equal : binary_function<_Tp, _Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x <= __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY less_equal<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY logical_and : binary_function<_Tp, _Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x && __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY logical_and<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY logical_or : binary_function<_Tp, _Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x || __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY logical_or<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY logical_not : unary_function<_Tp, bool>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x) const
- {return !__x;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY logical_not<void>
- {
- template <class _Tp>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Tp&& __x) const
- _NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x)))
- -> decltype (!_VSTD::forward<_Tp>(__x))
- { return !_VSTD::forward<_Tp>(__x); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY bit_and : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x & __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY bit_and<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY bit_or : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x | __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY bit_or<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- #else
- template <class _Tp>
- #endif
- struct _LIBCPP_TYPE_VIS_ONLY bit_xor : binary_function<_Tp, _Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x ^ __y;}
- };
- #if _LIBCPP_STD_VER > 11
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY bit_xor<void>
- {
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
- };
- #endif
- #if _LIBCPP_STD_VER > 11
- template <class _Tp = void>
- struct _LIBCPP_TYPE_VIS_ONLY bit_not : unary_function<_Tp, _Tp>
- {
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return ~__x;}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY bit_not<void>
- {
- template <class _Tp>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Tp&& __x) const
- _NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x)))
- -> decltype (~_VSTD::forward<_Tp>(__x))
- { return ~_VSTD::forward<_Tp>(__x); }
- typedef void is_transparent;
- };
- #endif
- template <class _Predicate>
- class _LIBCPP_TYPE_VIS_ONLY unary_negate
- : public unary_function<typename _Predicate::argument_type, bool>
- {
- _Predicate __pred_;
- public:
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- explicit unary_negate(const _Predicate& __pred)
- : __pred_(__pred) {}
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Predicate::argument_type& __x) const
- {return !__pred_(__x);}
- };
- template <class _Predicate>
- inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- unary_negate<_Predicate>
- not1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);}
- template <class _Predicate>
- class _LIBCPP_TYPE_VIS_ONLY binary_negate
- : public binary_function<typename _Predicate::first_argument_type,
- typename _Predicate::second_argument_type,
- bool>
- {
- _Predicate __pred_;
- public:
- _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11
- binary_negate(const _Predicate& __pred) : __pred_(__pred) {}
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Predicate::first_argument_type& __x,
- const typename _Predicate::second_argument_type& __y) const
- {return !__pred_(__x, __y);}
- };
- template <class _Predicate>
- inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- binary_negate<_Predicate>
- not2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);}
- template <class __Operation>
- class _LIBCPP_TYPE_VIS_ONLY binder1st
- : public unary_function<typename __Operation::second_argument_type,
- typename __Operation::result_type>
- {
- protected:
- __Operation op;
- typename __Operation::first_argument_type value;
- public:
- _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x,
- const typename __Operation::first_argument_type __y)
- : op(__x), value(__y) {}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- (typename __Operation::second_argument_type& __x) const
- {return op(value, __x);}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- (const typename __Operation::second_argument_type& __x) const
- {return op(value, __x);}
- };
- template <class __Operation, class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- binder1st<__Operation>
- bind1st(const __Operation& __op, const _Tp& __x)
- {return binder1st<__Operation>(__op, __x);}
- template <class __Operation>
- class _LIBCPP_TYPE_VIS_ONLY binder2nd
- : public unary_function<typename __Operation::first_argument_type,
- typename __Operation::result_type>
- {
- protected:
- __Operation op;
- typename __Operation::second_argument_type value;
- public:
- _LIBCPP_INLINE_VISIBILITY
- binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y)
- : op(__x), value(__y) {}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- ( typename __Operation::first_argument_type& __x) const
- {return op(__x, value);}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- (const typename __Operation::first_argument_type& __x) const
- {return op(__x, value);}
- };
- template <class __Operation, class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- binder2nd<__Operation>
- bind2nd(const __Operation& __op, const _Tp& __x)
- {return binder2nd<__Operation>(__op, __x);}
- template <class _Arg, class _Result>
- class _LIBCPP_TYPE_VIS_ONLY pointer_to_unary_function
- : public unary_function<_Arg, _Result>
- {
- _Result (*__f_)(_Arg);
- public:
- _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg))
- : __f_(__f) {}
- _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const
- {return __f_(__x);}
- };
- template <class _Arg, class _Result>
- inline _LIBCPP_INLINE_VISIBILITY
- pointer_to_unary_function<_Arg,_Result>
- ptr_fun(_Result (*__f)(_Arg))
- {return pointer_to_unary_function<_Arg,_Result>(__f);}
- template <class _Arg1, class _Arg2, class _Result>
- class _LIBCPP_TYPE_VIS_ONLY pointer_to_binary_function
- : public binary_function<_Arg1, _Arg2, _Result>
- {
- _Result (*__f_)(_Arg1, _Arg2);
- public:
- _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2))
- : __f_(__f) {}
- _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const
- {return __f_(__x, __y);}
- };
- template <class _Arg1, class _Arg2, class _Result>
- inline _LIBCPP_INLINE_VISIBILITY
- pointer_to_binary_function<_Arg1,_Arg2,_Result>
- ptr_fun(_Result (*__f)(_Arg1,_Arg2))
- {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);}
- template<class _Sp, class _Tp>
- class _LIBCPP_TYPE_VIS_ONLY mem_fun_t : public unary_function<_Tp*, _Sp>
- {
- _Sp (_Tp::*__p_)();
- public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)())
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const
- {return (__p->*__p_)();}
- };
- template<class _Sp, class _Tp, class _Ap>
- class _LIBCPP_TYPE_VIS_ONLY mem_fun1_t : public binary_function<_Tp*, _Ap, _Sp>
- {
- _Sp (_Tp::*__p_)(_Ap);
- public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap))
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const
- {return (__p->*__p_)(__x);}
- };
- template<class _Sp, class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- mem_fun_t<_Sp,_Tp>
- mem_fun(_Sp (_Tp::*__f)())
- {return mem_fun_t<_Sp,_Tp>(__f);}
- template<class _Sp, class _Tp, class _Ap>
- inline _LIBCPP_INLINE_VISIBILITY
- mem_fun1_t<_Sp,_Tp,_Ap>
- mem_fun(_Sp (_Tp::*__f)(_Ap))
- {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
- template<class _Sp, class _Tp>
- class _LIBCPP_TYPE_VIS_ONLY mem_fun_ref_t : public unary_function<_Tp, _Sp>
- {
- _Sp (_Tp::*__p_)();
- public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)())
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const
- {return (__p.*__p_)();}
- };
- template<class _Sp, class _Tp, class _Ap>
- class _LIBCPP_TYPE_VIS_ONLY mem_fun1_ref_t : public binary_function<_Tp, _Ap, _Sp>
- {
- _Sp (_Tp::*__p_)(_Ap);
- public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap))
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const
- {return (__p.*__p_)(__x);}
- };
- template<class _Sp, class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- mem_fun_ref_t<_Sp,_Tp>
- mem_fun_ref(_Sp (_Tp::*__f)())
- {return mem_fun_ref_t<_Sp,_Tp>(__f);}
- template<class _Sp, class _Tp, class _Ap>
- inline _LIBCPP_INLINE_VISIBILITY
- mem_fun1_ref_t<_Sp,_Tp,_Ap>
- mem_fun_ref(_Sp (_Tp::*__f)(_Ap))
- {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
- template <class _Sp, class _Tp>
- class _LIBCPP_TYPE_VIS_ONLY const_mem_fun_t : public unary_function<const _Tp*, _Sp>
- {
- _Sp (_Tp::*__p_)() const;
- public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const
- {return (__p->*__p_)();}
- };
- template <class _Sp, class _Tp, class _Ap>
- class _LIBCPP_TYPE_VIS_ONLY const_mem_fun1_t : public binary_function<const _Tp*, _Ap, _Sp>
- {
- _Sp (_Tp::*__p_)(_Ap) const;
- public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const
- {return (__p->*__p_)(__x);}
- };
- template <class _Sp, class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- const_mem_fun_t<_Sp,_Tp>
- mem_fun(_Sp (_Tp::*__f)() const)
- {return const_mem_fun_t<_Sp,_Tp>(__f);}
- template <class _Sp, class _Tp, class _Ap>
- inline _LIBCPP_INLINE_VISIBILITY
- const_mem_fun1_t<_Sp,_Tp,_Ap>
- mem_fun(_Sp (_Tp::*__f)(_Ap) const)
- {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
- template <class _Sp, class _Tp>
- class _LIBCPP_TYPE_VIS_ONLY const_mem_fun_ref_t : public unary_function<_Tp, _Sp>
- {
- _Sp (_Tp::*__p_)() const;
- public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const
- {return (__p.*__p_)();}
- };
- template <class _Sp, class _Tp, class _Ap>
- class _LIBCPP_TYPE_VIS_ONLY const_mem_fun1_ref_t
- : public binary_function<_Tp, _Ap, _Sp>
- {
- _Sp (_Tp::*__p_)(_Ap) const;
- public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const
- {return (__p.*__p_)(__x);}
- };
- template <class _Sp, class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- const_mem_fun_ref_t<_Sp,_Tp>
- mem_fun_ref(_Sp (_Tp::*__f)() const)
- {return const_mem_fun_ref_t<_Sp,_Tp>(__f);}
- template <class _Sp, class _Tp, class _Ap>
- inline _LIBCPP_INLINE_VISIBILITY
- const_mem_fun1_ref_t<_Sp,_Tp,_Ap>
- mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const)
- {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
- ////////////////////////////////////////////////////////////////////////////////
- // MEMFUN
- //==============================================================================
- template <class _Tp>
- class __mem_fn
- : public __weak_result_type<_Tp>
- {
- public:
- // types
- typedef _Tp type;
- private:
- type __f_;
- public:
- _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
- #ifndef _LIBCPP_HAS_NO_VARIADICS
- // invoke
- template <class... _ArgTypes>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return<type, _ArgTypes...>::type
- operator() (_ArgTypes&&... __args) const {
- return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
- }
- #else
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0>::type
- operator() (_A0& __a0) const {
- return __invoke(__f_, __a0);
- }
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0 const>::type
- operator() (_A0 const& __a0) const {
- return __invoke(__f_, __a0);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1>::type
- operator() (_A0& __a0, _A1& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1>::type
- operator() (_A0 const& __a0, _A1& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1 const>::type
- operator() (_A0& __a0, _A1 const& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2>::type
- operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2 const>::type
- operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
- #endif
- };
- template<class _Rp, class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- __mem_fn<_Rp _Tp::*>
- mem_fn(_Rp _Tp::* __pm) _NOEXCEPT
- {
- return __mem_fn<_Rp _Tp::*>(__pm);
- }
- ////////////////////////////////////////////////////////////////////////////////
- // FUNCTION
- //==============================================================================
- // bad_function_call
- class _LIBCPP_EXCEPTION_ABI bad_function_call
- : public exception
- {
- };
- template<class _Fp> class _LIBCPP_TYPE_VIS_ONLY function; // undefined
- namespace __function
- {
- template<class _Rp>
- struct __maybe_derive_from_unary_function
- {
- };
- template<class _Rp, class _A1>
- struct __maybe_derive_from_unary_function<_Rp(_A1)>
- : public unary_function<_A1, _Rp>
- {
- };
- template<class _Rp>
- struct __maybe_derive_from_binary_function
- {
- };
- template<class _Rp, class _A1, class _A2>
- struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
- {
- };
- template <class _Fp>
- _LIBCPP_INLINE_VISIBILITY
- bool __not_null(_Fp const&) { return true; }
- template <class _Fp>
- _LIBCPP_INLINE_VISIBILITY
- bool __not_null(_Fp* __ptr) { return __ptr; }
- template <class _Ret, class _Class>
- _LIBCPP_INLINE_VISIBILITY
- bool __not_null(_Ret _Class::*__ptr) { return __ptr; }
- template <class _Fp>
- _LIBCPP_INLINE_VISIBILITY
- bool __not_null(function<_Fp> const& __f) { return !!__f; }
- } // namespace __function
- #ifndef _LIBCPP_HAS_NO_VARIADICS
- namespace __function {
- template<class _Fp> class __base;
- template<class _Rp, class ..._ArgTypes>
- class __base<_Rp(_ArgTypes...)>
- {
- __base(const __base&);
- __base& operator=(const __base&);
- public:
- _LIBCPP_INLINE_VISIBILITY __base() {}
- _LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() _NOEXCEPT = 0;
- virtual void destroy_deallocate() _NOEXCEPT = 0;
- virtual _Rp operator()(_ArgTypes&& ...) = 0;
- #ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const _NOEXCEPT = 0;
- virtual const std::type_info& target_type() const _NOEXCEPT = 0;
- #endif // _LIBCPP_NO_RTTI
- };
- template<class _FD, class _Alloc, class _FB> class __func;
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- class __func<_Fp, _Alloc, _Rp(_ArgTypes...)>
- : public __base<_Rp(_ArgTypes...)>
- {
- __compressed_pair<_Fp, _Alloc> __f_;
- public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(_Fp&& __f)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
- _VSTD::forward_as_tuple()) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(const _Fp& __f, const _Alloc& __a)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
- _VSTD::forward_as_tuple(__a)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(const _Fp& __f, _Alloc&& __a)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
- _VSTD::forward_as_tuple(_VSTD::move(__a))) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(_Fp&& __f, _Alloc&& __a)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
- _VSTD::forward_as_tuple(_VSTD::move(__a))) {}
- virtual __base<_Rp(_ArgTypes...)>* __clone() const;
- virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;
- virtual void destroy() _NOEXCEPT;
- virtual void destroy_deallocate() _NOEXCEPT;
- virtual _Rp operator()(_ArgTypes&& ... __arg);
- #ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const _NOEXCEPT;
- virtual const std::type_info& target_type() const _NOEXCEPT;
- #endif // _LIBCPP_NO_RTTI
- };
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- __base<_Rp(_ArgTypes...)>*
- __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const
- {
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
- }
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- void
- __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const
- {
- ::new (__p) __func(__f_.first(), __f_.second());
- }
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- void
- __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT
- {
- __f_.~__compressed_pair<_Fp, _Alloc>();
- }
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- void
- __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
- {
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
- }
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- _Rp
- __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
- {
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
- }
- #ifndef _LIBCPP_NO_RTTI
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- const void*
- __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
- {
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
- }
- template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
- const std::type_info&
- __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
- {
- return typeid(_Fp);
- }
- #endif // _LIBCPP_NO_RTTI
- } // __function
- template<class _Rp, class ..._ArgTypes>
- class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_ArgTypes...)>
- : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,
- public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>
- {
- typedef __function::__base<_Rp(_ArgTypes...)> __base;
- typename aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
- _LIBCPP_NO_CFI static __base *__as_base(void *p) {
- return reinterpret_cast<__base*>(p);
- }
- template <class _Fp, bool = !is_same<_Fp, function>::value &&
- __invokable<_Fp&, _ArgTypes...>::value>
- struct __callable;
- template <class _Fp>
- struct __callable<_Fp, true>
- {
- static const bool value = is_same<void, _Rp>::value ||
- is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type,
- _Rp>::value;
- };
- template <class _Fp>
- struct __callable<_Fp, false>
- {
- static const bool value = false;
- };
- public:
- typedef _Rp result_type;
- // construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY
- function() _NOEXCEPT : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY
- function(nullptr_t) _NOEXCEPT : __f_(0) {}
- function(const function&);
- function(function&&) _NOEXCEPT;
- template<class _Fp>
- function(_Fp, typename enable_if
- <
- __callable<_Fp>::value &&
- !is_same<_Fp, function>::value
- >::type* = 0);
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, function&&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<__callable<_Fp>::value>::type* = 0);
- function& operator=(const function&);
- function& operator=(function&&) _NOEXCEPT;
- function& operator=(nullptr_t) _NOEXCEPT;
- template<class _Fp>
- typename enable_if
- <
- __callable<typename decay<_Fp>::type>::value &&
- !is_same<typename remove_reference<_Fp>::type, function>::value,
- function&
- >::type
- operator=(_Fp&&);
- ~function();
- // function modifiers:
- void swap(function&) _NOEXCEPT;
- #if _LIBCPP_STD_VER <= 14
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp&& __f, const _Alloc& __a)
- {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
- #endif
- // function capacity:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return __f_;}
- // deleted overloads close possible hole in the type system
- template<class _R2, class... _ArgTypes2>
- bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;
- template<class _R2, class... _ArgTypes2>
- bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;
- public:
- // function invocation:
- _Rp operator()(_ArgTypes...) const;
- #ifndef _LIBCPP_NO_RTTI
- // function target access:
- const std::type_info& target_type() const _NOEXCEPT;
- template <typename _Tp> _Tp* target() _NOEXCEPT;
- template <typename _Tp> const _Tp* target() const _NOEXCEPT;
- #endif // _LIBCPP_NO_RTTI
- };
- template<class _Rp, class ..._ArgTypes>
- function<_Rp(_ArgTypes...)>::function(const function& __f)
- {
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void *)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
- }
- template<class _Rp, class ..._ArgTypes>
- template <class _Alloc>
- function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
- const function& __f)
- {
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void *)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
- }
- template<class _Rp, class ..._ArgTypes>
- function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
- {
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void *)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- {
- __f_ = __f.__f_;
- __f.__f_ = 0;
- }
- }
- template<class _Rp, class ..._ArgTypes>
- template <class _Alloc>
- function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
- function&& __f)
- {
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void *)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- {
- __f_ = __f.__f_;
- __f.__f_ = 0;
- }
- }
- template<class _Rp, class ..._ArgTypes>
- template <class _Fp>
- function<_Rp(_ArgTypes...)>::function(_Fp __f,
- typename enable_if
- <
- __callable<_Fp>::value &&
- !is_same<_Fp, function>::value
- >::type*)
- : __f_(0)
- {
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value)
- {
- __f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f));
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(_VSTD::move(__f), allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
- }
- template<class _Rp, class ..._ArgTypes>
- template <class _Fp, class _Alloc>
- function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<__callable<_Fp>::value>::type*)
- : __f_(0)
- {
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _FF;
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- if (sizeof(_FF) <= sizeof(__buf_) &&
- is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value)
- {
- __f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f), _Alloc(__a));
- }
- else
- {
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(_VSTD::move(__f), _Alloc(__a));
- __f_ = __hold.release();
- }
- }
- }
- template<class _Rp, class ..._ArgTypes>
- function<_Rp(_ArgTypes...)>&
- function<_Rp(_ArgTypes...)>::operator=(const function& __f)
- {
- function(__f).swap(*this);
- return *this;
- }
- template<class _Rp, class ..._ArgTypes>
- function<_Rp(_ArgTypes...)>&
- function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
- {
- if ((void *)__f_ == &__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
- __f_ = 0;
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void *)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- {
- __f_ = __f.__f_;
- __f.__f_ = 0;
- }
- return *this;
- }
- template<class _Rp, class ..._ArgTypes>
- function<_Rp(_ArgTypes...)>&
- function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
- {
- if ((void *)__f_ == &__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
- __f_ = 0;
- return *this;
- }
- template<class _Rp, class ..._ArgTypes>
- template <class _Fp>
- typename enable_if
- <
- function<_Rp(_ArgTypes...)>::template __callable<typename decay<_Fp>::type>::value &&
- !is_same<typename remove_reference<_Fp>::type, function<_Rp(_ArgTypes...)>>::value,
- function<_Rp(_ArgTypes...)>&
- >::type
- function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
- {
- function(_VSTD::forward<_Fp>(__f)).swap(*this);
- return *this;
- }
- template<class _Rp, class ..._ArgTypes>
- function<_Rp(_ArgTypes...)>::~function()
- {
- if ((void *)__f_ == &__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
- }
- template<class _Rp, class ..._ArgTypes>
- void
- function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
- {
- if ((void *)__f_ == &__buf_ && (void *)__f.__f_ == &__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = __as_base(&__tempbuf);
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone(__as_base(&__buf_));
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = __as_base(&__buf_);
- __t->__clone(__as_base(&__f.__buf_));
- __t->destroy();
- __f.__f_ = __as_base(&__f.__buf_);
- }
- else if ((void *)__f_ == &__buf_)
- {
- __f_->__clone(__as_base(&__f.__buf_));
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = __as_base(&__f.__buf_);
- }
- else if ((void *)__f.__f_ == &__f.__buf_)
- {
- __f.__f_->__clone(__as_base(&__buf_));
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = __as_base(&__buf_);
- }
- else
- _VSTD::swap(__f_, __f.__f_);
- }
- template<class _Rp, class ..._ArgTypes>
- _Rp
- function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
- {
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__f_ == 0)
- throw bad_function_call();
- #endif // _LIBCPP_NO_EXCEPTIONS
- return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
- }
- #ifndef _LIBCPP_NO_RTTI
- template<class _Rp, class ..._ArgTypes>
- const std::type_info&
- function<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
- {
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
- }
- template<class _Rp, class ..._ArgTypes>
- template <typename _Tp>
- _Tp*
- function<_Rp(_ArgTypes...)>::target() _NOEXCEPT
- {
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*)__f_->target(typeid(_Tp));
- }
- template<class _Rp, class ..._ArgTypes>
- template <typename _Tp>
- const _Tp*
- function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
- {
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
- }
- #endif // _LIBCPP_NO_RTTI
- template <class _Rp, class... _ArgTypes>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
- template <class _Rp, class... _ArgTypes>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
- template <class _Rp, class... _ArgTypes>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
- template <class _Rp, class... _ArgTypes>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
- template <class _Rp, class... _ArgTypes>
- inline _LIBCPP_INLINE_VISIBILITY
- void
- swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
- {return __x.swap(__y);}
- #else // _LIBCPP_HAS_NO_VARIADICS
- #include <__functional_03>
- #endif
- ////////////////////////////////////////////////////////////////////////////////
- // BIND
- //==============================================================================
- template<class _Tp> struct __is_bind_expression : public false_type {};
- template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_bind_expression
- : public __is_bind_expression<typename remove_cv<_Tp>::type> {};
- template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
- template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_placeholder
- : public __is_placeholder<typename remove_cv<_Tp>::type> {};
- namespace placeholders
- {
- template <int _Np> struct __ph {};
- #if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_BIND)
- _LIBCPP_FUNC_VIS extern const __ph<1> _1;
- _LIBCPP_FUNC_VIS extern const __ph<2> _2;
- _LIBCPP_FUNC_VIS extern const __ph<3> _3;
- _LIBCPP_FUNC_VIS extern const __ph<4> _4;
- _LIBCPP_FUNC_VIS extern const __ph<5> _5;
- _LIBCPP_FUNC_VIS extern const __ph<6> _6;
- _LIBCPP_FUNC_VIS extern const __ph<7> _7;
- _LIBCPP_FUNC_VIS extern const __ph<8> _8;
- _LIBCPP_FUNC_VIS extern const __ph<9> _9;
- _LIBCPP_FUNC_VIS extern const __ph<10> _10;
- #else
- constexpr __ph<1> _1{};
- constexpr __ph<2> _2{};
- constexpr __ph<3> _3{};
- constexpr __ph<4> _4{};
- constexpr __ph<5> _5{};
- constexpr __ph<6> _6{};
- constexpr __ph<7> _7{};
- constexpr __ph<8> _8{};
- constexpr __ph<9> _9{};
- constexpr __ph<10> _10{};
- #endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_BIND)
- } // placeholders
- template<int _Np>
- struct __is_placeholder<placeholders::__ph<_Np> >
- : public integral_constant<int, _Np> {};
- #ifndef _LIBCPP_HAS_NO_VARIADICS
- template <class _Tp, class _Uj>
- inline _LIBCPP_INLINE_VISIBILITY
- _Tp&
- __mu(reference_wrapper<_Tp> __t, _Uj&)
- {
- return __t.get();
- }
- template <class _Ti, class ..._Uj, size_t ..._Indx>
- inline _LIBCPP_INLINE_VISIBILITY
- typename __invoke_of<_Ti&, _Uj...>::type
- __mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>)
- {
- return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...);
- }
- template <class _Ti, class ..._Uj>
- inline _LIBCPP_INLINE_VISIBILITY
- typename __lazy_enable_if
- <
- is_bind_expression<_Ti>::value,
- __invoke_of<_Ti&, _Uj...>
- >::type
- __mu(_Ti& __ti, tuple<_Uj...>& __uj)
- {
- typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
- return __mu_expand(__ti, __uj, __indices());
- }
- template <bool IsPh, class _Ti, class _Uj>
- struct __mu_return2 {};
- template <class _Ti, class _Uj>
- struct __mu_return2<true, _Ti, _Uj>
- {
- typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type;
- };
- template <class _Ti, class _Uj>
- inline _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- 0 < is_placeholder<_Ti>::value,
- typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type
- >::type
- __mu(_Ti&, _Uj& __uj)
- {
- const size_t _Indx = is_placeholder<_Ti>::value - 1;
- return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj));
- }
- template <class _Ti, class _Uj>
- inline _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- !is_bind_expression<_Ti>::value &&
- is_placeholder<_Ti>::value == 0 &&
- !__is_reference_wrapper<_Ti>::value,
- _Ti&
- >::type
- __mu(_Ti& __ti, _Uj&)
- {
- return __ti;
- }
- template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
- class _TupleUj>
- struct ____mu_return;
- template <bool _Invokable, class _Ti, class ..._Uj>
- struct ____mu_return_invokable // false
- {
- typedef __nat type;
- };
- template <class _Ti, class ..._Uj>
- struct ____mu_return_invokable<true, _Ti, _Uj...>
- {
- typedef typename __invoke_of<_Ti&, _Uj...>::type type;
- };
- template <class _Ti, class ..._Uj>
- struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> >
- : public ____mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
- {
- };
- template <class _Ti, class _TupleUj>
- struct ____mu_return<_Ti, false, false, true, _TupleUj>
- {
- typedef typename tuple_element<is_placeholder<_Ti>::value - 1,
- _TupleUj>::type&& type;
- };
- template <class _Ti, class _TupleUj>
- struct ____mu_return<_Ti, true, false, false, _TupleUj>
- {
- typedef typename _Ti::type& type;
- };
- template <class _Ti, class _TupleUj>
- struct ____mu_return<_Ti, false, false, false, _TupleUj>
- {
- typedef _Ti& type;
- };
- template <class _Ti, class _TupleUj>
- struct __mu_return
- : public ____mu_return<_Ti,
- __is_reference_wrapper<_Ti>::value,
- is_bind_expression<_Ti>::value,
- 0 < is_placeholder<_Ti>::value &&
- is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value,
- _TupleUj>
- {
- };
- template <class _Fp, class _BoundArgs, class _TupleUj>
- struct __is_valid_bind_return
- {
- static const bool value = false;
- };
- template <class _Fp, class ..._BoundArgs, class _TupleUj>
- struct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj>
- {
- static const bool value = __invokable<_Fp,
- typename __mu_return<_BoundArgs, _TupleUj>::type...>::value;
- };
- template <class _Fp, class ..._BoundArgs, class _TupleUj>
- struct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj>
- {
- static const bool value = __invokable<_Fp,
- typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value;
- };
- template <class _Fp, class _BoundArgs, class _TupleUj,
- bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
- struct __bind_return;
- template <class _Fp, class ..._BoundArgs, class _TupleUj>
- struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true>
- {
- typedef typename __invoke_of
- <
- _Fp&,
- typename __mu_return
- <
- _BoundArgs,
- _TupleUj
- >::type...
- >::type type;
- };
- template <class _Fp, class ..._BoundArgs, class _TupleUj>
- struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true>
- {
- typedef typename __invoke_of
- <
- _Fp&,
- typename __mu_return
- <
- const _BoundArgs,
- _TupleUj
- >::type...
- >::type type;
- };
- template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- typename __bind_return<_Fp, _BoundArgs, _Args>::type
- __apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
- _Args&& __args)
- {
- return __invoke(__f, __mu(_VSTD::get<_Indx>(__bound_args), __args)...);
- }
- template<class _Fp, class ..._BoundArgs>
- class __bind
- : public __weak_result_type<typename decay<_Fp>::type>
- {
- protected:
- typedef typename decay<_Fp>::type _Fd;
- typedef tuple<typename decay<_BoundArgs>::type...> _Td;
- private:
- _Fd __f_;
- _Td __bound_args_;
- typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
- public:
- #ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
- _LIBCPP_INLINE_VISIBILITY
- __bind(const __bind& __b)
- : __f_(__b.__f_),
- __bound_args_(__b.__bound_args_) {}
- _LIBCPP_INLINE_VISIBILITY
- __bind& operator=(const __bind& __b)
- {
- __f_ = __b.__f_;
- __bound_args_ = __b.__bound_args_;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __bind(__bind&& __b)
- : __f_(_VSTD::move(__b.__f_)),
- __bound_args_(_VSTD::move(__b.__bound_args_)) {}
- _LIBCPP_INLINE_VISIBILITY
- __bind& operator=(__bind&& __b)
- {
- __f_ = _VSTD::move(__b.__f_);
- __bound_args_ = _VSTD::move(__b.__bound_args_);
- return *this;
- }
- #endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
- template <class _Gp, class ..._BA,
- class = typename enable_if
- <
- is_constructible<_Fd, _Gp>::value &&
- !is_same<typename remove_reference<_Gp>::type,
- __bind>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
- : __f_(_VSTD::forward<_Gp>(__f)),
- __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
- operator()(_Args&& ...__args)
- {
- return __apply_functor(__f_, __bound_args_, __indices(),
- tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
- }
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
- operator()(_Args&& ...__args) const
- {
- return __apply_functor(__f_, __bound_args_, __indices(),
- tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
- }
- };
- template<class _Fp, class ..._BoundArgs>
- struct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {};
- template<class _Rp, class _Fp, class ..._BoundArgs>
- class __bind_r
- : public __bind<_Fp, _BoundArgs...>
- {
- typedef __bind<_Fp, _BoundArgs...> base;
- typedef typename base::_Fd _Fd;
- typedef typename base::_Td _Td;
- public:
- typedef _Rp result_type;
- #ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
- _LIBCPP_INLINE_VISIBILITY
- __bind_r(const __bind_r& __b)
- : base(_VSTD::forward<const base&>(__b)) {}
- _LIBCPP_INLINE_VISIBILITY
- __bind_r& operator=(const __bind_r& __b)
- {
- base::operator=(_VSTD::forward<const base&>(__b));
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __bind_r(__bind_r&& __b)
- : base(_VSTD::forward<base>(__b)) {}
- _LIBCPP_INLINE_VISIBILITY
- __bind_r& operator=(__bind_r&& __b)
- {
- base::operator=(_VSTD::forward<base>(__b));
- return *this;
- }
- #endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
- template <class _Gp, class ..._BA,
- class = typename enable_if
- <
- is_constructible<_Fd, _Gp>::value &&
- !is_same<typename remove_reference<_Gp>::type,
- __bind_r>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
- : base(_VSTD::forward<_Gp>(__f),
- _VSTD::forward<_BA>(__bound_args)...) {}
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
- result_type>::value || is_void<_Rp>::value,
- result_type
- >::type
- operator()(_Args&& ...__args)
- {
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);
- }
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
- result_type>::value || is_void<_Rp>::value,
- result_type
- >::type
- operator()(_Args&& ...__args) const
- {
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);
- }
- };
- template<class _Rp, class _Fp, class ..._BoundArgs>
- struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
- template<class _Fp, class ..._BoundArgs>
- inline _LIBCPP_INLINE_VISIBILITY
- __bind<_Fp, _BoundArgs...>
- bind(_Fp&& __f, _BoundArgs&&... __bound_args)
- {
- typedef __bind<_Fp, _BoundArgs...> type;
- return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
- }
- template<class _Rp, class _Fp, class ..._BoundArgs>
- inline _LIBCPP_INLINE_VISIBILITY
- __bind_r<_Rp, _Fp, _BoundArgs...>
- bind(_Fp&& __f, _BoundArgs&&... __bound_args)
- {
- typedef __bind_r<_Rp, _Fp, _BoundArgs...> type;
- return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
- }
- #endif // _LIBCPP_HAS_NO_VARIADICS
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<bool>
- : public unary_function<bool, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(bool __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<char>
- : public unary_function<char, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<signed char>
- : public unary_function<signed char, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(signed char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned char>
- : public unary_function<unsigned char, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<char16_t>
- : public unary_function<char16_t, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char16_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<char32_t>
- : public unary_function<char32_t, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char32_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- #endif // _LIBCPP_HAS_NO_UNICODE_CHARS
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<wchar_t>
- : public unary_function<wchar_t, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(wchar_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<short>
- : public unary_function<short, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(short __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned short>
- : public unary_function<unsigned short, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned short __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<int>
- : public unary_function<int, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(int __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned int>
- : public unary_function<unsigned int, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned int __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<long>
- : public unary_function<long, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(long __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned long>
- : public unary_function<unsigned long, size_t>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned long __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<long long>
- : public __scalar_hash<long long>
- {
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned long long>
- : public __scalar_hash<unsigned long long>
- {
- };
- #ifndef _LIBCPP_HAS_NO_INT128
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<__int128_t>
- : public __scalar_hash<__int128_t>
- {
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<__uint128_t>
- : public __scalar_hash<__uint128_t>
- {
- };
- #endif
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<float>
- : public __scalar_hash<float>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(float __v) const _NOEXCEPT
- {
- // -0.0 and 0.0 should return same hash
- if (__v == 0)
- return 0;
- return __scalar_hash<float>::operator()(__v);
- }
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<double>
- : public __scalar_hash<double>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(double __v) const _NOEXCEPT
- {
- // -0.0 and 0.0 should return same hash
- if (__v == 0)
- return 0;
- return __scalar_hash<double>::operator()(__v);
- }
- };
- template <>
- struct _LIBCPP_TYPE_VIS_ONLY hash<long double>
- : public __scalar_hash<long double>
- {
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(long double __v) const _NOEXCEPT
- {
- // -0.0 and 0.0 should return same hash
- if (__v == 0)
- return 0;
- #if defined(__i386__)
- // Zero out padding bits
- union
- {
- long double __t;
- struct
- {
- size_t __a;
- size_t __b;
- size_t __c;
- size_t __d;
- } __s;
- } __u;
- __u.__s.__a = 0;
- __u.__s.__b = 0;
- __u.__s.__c = 0;
- __u.__s.__d = 0;
- __u.__t = __v;
- return __u.__s.__a ^ __u.__s.__b ^ __u.__s.__c ^ __u.__s.__d;
- #elif defined(__x86_64__)
- // Zero out padding bits
- union
- {
- long double __t;
- struct
- {
- size_t __a;
- size_t __b;
- } __s;
- } __u;
- __u.__s.__a = 0;
- __u.__s.__b = 0;
- __u.__t = __v;
- return __u.__s.__a ^ __u.__s.__b;
- #else
- return __scalar_hash<long double>::operator()(__v);
- #endif
- }
- };
- #if _LIBCPP_STD_VER > 11
- template <class _Tp>
- struct _LIBCPP_TYPE_VIS_ONLY hash
- : public unary_function<_Tp, size_t>
- {
- static_assert(is_enum<_Tp>::value, "This hash only works for enumeration types");
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp __v) const _NOEXCEPT
- {
- typedef typename underlying_type<_Tp>::type type;
- return hash<type>{}(static_cast<type>(__v));
- }
- };
- #endif
- #if _LIBCPP_STD_VER > 14
- template <class _Fn, class ..._Args>
- result_of_t<_Fn&&(_Args&&...)>
- invoke(_Fn&& __f, _Args&&... __args)
- noexcept(noexcept(_VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...)))
- {
- return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
- }
- template <class _DecayFunc>
- class _LIBCPP_TYPE_VIS_ONLY __not_fn_imp {
- _DecayFunc __fd;
- public:
- __not_fn_imp() = delete;
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) &
- noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
- -> decltype(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) &&
- noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
- -> decltype(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) const&
- noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
- -> decltype(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) const&&
- noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
- -> decltype(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
- private:
- template <class _RawFunc,
- class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>>
- _LIBCPP_INLINE_VISIBILITY
- explicit __not_fn_imp(_RawFunc&& __rf)
- : __fd(_VSTD::forward<_RawFunc>(__rf)) {}
- template <class _RawFunc>
- friend inline _LIBCPP_INLINE_VISIBILITY
- __not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&);
- };
- template <class _RawFunc>
- inline _LIBCPP_INLINE_VISIBILITY
- __not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) {
- return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn));
- }
- #endif
- // struct hash<T*> in <memory>
- _LIBCPP_END_NAMESPACE_STD
- #endif // _LIBCPP_FUNCTIONAL
|