2010-05-12 03:42:16 +08:00
|
|
|
// -*- C++ -*-
|
|
|
|
//===------------------------ functional ----------------------------------===//
|
|
|
|
//
|
2019-01-19 18:56:40 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2010-05-12 03:42:16 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#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;
|
|
|
|
};
|
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
template <class T>
|
2010-05-12 03:42:16 +08:00
|
|
|
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
|
2020-12-06 08:37:41 +08:00
|
|
|
template<class U>
|
|
|
|
reference_wrapper(U&&);
|
2011-05-29 01:59:48 +08:00
|
|
|
reference_wrapper(const reference_wrapper<T>& x) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
// assignment
|
2011-05-29 01:59:48 +08:00
|
|
|
reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
// access
|
2011-05-29 01:59:48 +08:00
|
|
|
operator T& () const noexcept;
|
|
|
|
T& get() const noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
// invoke
|
|
|
|
template <class... ArgTypes>
|
2013-09-22 01:58:58 +08:00
|
|
|
typename result_of<T&(ArgTypes&&...)>::type
|
2010-05-12 03:42:16 +08:00
|
|
|
operator() (ArgTypes&&...) const;
|
|
|
|
};
|
|
|
|
|
2020-12-06 08:37:41 +08:00
|
|
|
template <class T>
|
|
|
|
reference_wrapper(T&) -> reference_wrapper<T>;
|
|
|
|
|
2011-05-29 01:59:48 +08:00
|
|
|
template <class T> reference_wrapper<T> ref(T& t) noexcept;
|
2010-08-21 03:36:46 +08:00
|
|
|
template <class T> void ref(const T&& t) = delete;
|
2011-05-29 01:59:48 +08:00
|
|
|
template <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-05-29 01:59:48 +08:00
|
|
|
template <class T> reference_wrapper<const T> cref(const T& t) noexcept;
|
2010-08-21 03:36:46 +08:00
|
|
|
template <class T> void cref(const T&& t) = delete;
|
2011-05-29 01:59:48 +08:00
|
|
|
template <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2018-12-03 22:03:27 +08:00
|
|
|
template <class T> struct unwrap_reference; // since C++20
|
|
|
|
template <class T> struct unwrap_ref_decay : unwrap_reference<decay_t<T>> { }; // since C++20
|
|
|
|
template <class T> using unwrap_reference_t = typename unwrap_reference<T>::type; // since C++20
|
|
|
|
template <class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; // since C++20
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct plus : binary_function<T, T, T>
|
|
|
|
{
|
|
|
|
T operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct minus : binary_function<T, T, T>
|
|
|
|
{
|
|
|
|
T operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct multiplies : binary_function<T, T, T>
|
|
|
|
{
|
|
|
|
T operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct divides : binary_function<T, T, T>
|
|
|
|
{
|
|
|
|
T operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct modulus : binary_function<T, T, T>
|
|
|
|
{
|
|
|
|
T operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct negate : unary_function<T, T>
|
|
|
|
{
|
|
|
|
T operator()(const T& x) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct equal_to : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct not_equal_to : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct greater : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct less : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct greater_equal : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct less_equal : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct logical_and : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct logical_or : binary_function<T, T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x, const T& y) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2010-05-12 03:42:16 +08:00
|
|
|
struct logical_not : unary_function<T, bool>
|
|
|
|
{
|
|
|
|
bool operator()(const T& x) const;
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
template <class T> // <class T=void> in C++14
|
2021-03-08 09:22:03 +08:00
|
|
|
struct bit_and : binary_function<T, T, T>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2021-03-08 09:22:03 +08:00
|
|
|
T operator()(const T& x, const T& y) const;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class T> // <class T=void> in C++14
|
2021-03-08 09:22:03 +08:00
|
|
|
struct bit_or : binary_function<T, T, T>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2021-03-08 09:22:03 +08:00
|
|
|
T operator()(const T& x, const T& y) const;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class T> // <class T=void> in C++14
|
2021-03-08 09:22:03 +08:00
|
|
|
struct bit_xor : binary_function<T, T, T>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2021-03-08 09:22:03 +08:00
|
|
|
T operator()(const T& x, const T& y) const;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class T=void> // C++14
|
2021-03-08 09:22:03 +08:00
|
|
|
struct bit_not : unary_function<T, T>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2021-03-08 09:22:03 +08:00
|
|
|
T operator()(const T& x) const;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
|
2021-03-19 01:21:35 +08:00
|
|
|
struct identity; // C++20
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class Predicate>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class unary_negate // deprecated in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
: public unary_function<typename Predicate::argument_type, bool>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit unary_negate(const Predicate& pred);
|
|
|
|
bool operator()(const typename Predicate::argument_type& x) const;
|
|
|
|
};
|
|
|
|
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
template <class Predicate> // deprecated in C++17
|
|
|
|
unary_negate<Predicate> not1(const Predicate& pred);
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class Predicate>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class binary_negate // deprecated in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
: 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;
|
|
|
|
};
|
|
|
|
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
template <class Predicate> // deprecated in C++17
|
|
|
|
binary_negate<Predicate> not2(const Predicate& pred);
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2020-12-26 03:48:39 +08:00
|
|
|
template <class F>
|
|
|
|
constexpr unspecified not_fn(F&& f); // C++17, constexpr in C++20
|
2016-06-02 09:25:41 +08:00
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class T> struct is_bind_expression;
|
|
|
|
template<class T> struct is_placeholder;
|
|
|
|
|
2016-09-22 08:23:15 +08:00
|
|
|
// See C++14 20.9.9, Function object binders
|
2018-01-03 01:17:01 +08:00
|
|
|
template <class T> inline constexpr bool is_bind_expression_v
|
2016-09-22 08:23:15 +08:00
|
|
|
= is_bind_expression<T>::value; // C++17
|
2018-01-03 01:17:01 +08:00
|
|
|
template <class T> inline constexpr int is_placeholder_v
|
2016-09-22 08:23:15 +08:00
|
|
|
= is_placeholder<T>::value; // C++17
|
|
|
|
|
|
|
|
|
2010-08-22 08:02:43 +08:00
|
|
|
template<class Fn, class... BoundArgs>
|
2020-12-26 03:48:39 +08:00
|
|
|
constexpr unspecified bind(Fn&&, BoundArgs&&...); // constexpr in C++20
|
2010-08-22 08:02:43 +08:00
|
|
|
template<class R, class Fn, class... BoundArgs>
|
2020-12-26 03:48:39 +08:00
|
|
|
constexpr unspecified bind(Fn&&, BoundArgs&&...); // constexpr in C++20
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2019-04-04 01:54:37 +08:00
|
|
|
template<class F, class... Args>
|
2020-12-26 03:48:39 +08:00
|
|
|
constexpr // constexpr in C++20
|
2019-04-04 01:54:37 +08:00
|
|
|
invoke_result_t<F, Args...> invoke(F&& f, Args&&... args) // C++17
|
|
|
|
noexcept(is_nothrow_invocable_v<F, Args...>);
|
|
|
|
|
2010-08-22 08:02:43 +08:00
|
|
|
namespace placeholders {
|
|
|
|
// M is the implementation-defined number of placeholders
|
2010-05-12 03:42:16 +08:00
|
|
|
extern unspecified _1;
|
|
|
|
extern unspecified _2;
|
2010-08-22 08:02:43 +08:00
|
|
|
.
|
|
|
|
.
|
|
|
|
.
|
2011-11-30 02:15:50 +08:00
|
|
|
extern unspecified _Mp;
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Operation>
|
2017-04-14 02:25:32 +08:00
|
|
|
class binder1st // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
: 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>
|
2017-04-14 02:25:32 +08:00
|
|
|
binder1st<Operation> bind1st(const Operation& op, const T& x); // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class Operation>
|
2017-04-14 02:25:32 +08:00
|
|
|
class binder2nd // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
: 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>
|
2017-04-14 02:25:32 +08:00
|
|
|
binder2nd<Operation> bind2nd(const Operation& op, const T& x); // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
template <class Arg, class Result> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
2017-04-14 02:25:32 +08:00
|
|
|
pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg)); // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
template <class Arg1, class Arg2, class Result> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
2017-04-14 02:25:32 +08:00
|
|
|
pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2)); // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
template<class S, class T> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
2017-04-14 02:25:32 +08:00
|
|
|
class mem_fun1_t : public binary_function<T*, A, S> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit mem_fun1_t(S (T::*p)(A));
|
|
|
|
S operator()(T* p, A x) const;
|
|
|
|
};
|
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
template<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)()); // deprecated in C++11, removed in C++17
|
|
|
|
template<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
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template<class S, class T>
|
2017-04-14 02:25:32 +08:00
|
|
|
class mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit mem_fun_ref_t(S (T::*p)());
|
|
|
|
S operator()(T& p) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class S, class T, class A>
|
2017-04-14 02:25:32 +08:00
|
|
|
class mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit mem_fun1_ref_t(S (T::*p)(A));
|
|
|
|
S operator()(T& p, A x) const;
|
|
|
|
};
|
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
template<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()); // deprecated in C++11, removed in C++17
|
|
|
|
template<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
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class S, class T>
|
2017-04-14 02:25:32 +08:00
|
|
|
class const_mem_fun_t : public unary_function<const T*, S> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit const_mem_fun_t(S (T::*p)() const);
|
|
|
|
S operator()(const T* p) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class S, class T, class A>
|
2017-04-14 02:25:32 +08:00
|
|
|
class const_mem_fun1_t : public binary_function<const T*, A, S> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit const_mem_fun1_t(S (T::*p)(A) const);
|
|
|
|
S operator()(const T* p, A x) const;
|
|
|
|
};
|
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
template <class S, class T> const_mem_fun_t<S,T> mem_fun(S (T::*f)() const); // deprecated in C++11, removed in C++17
|
|
|
|
template <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
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class S, class T>
|
2017-04-14 02:25:32 +08:00
|
|
|
class const_mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit const_mem_fun_ref_t(S (T::*p)() const);
|
|
|
|
S operator()(const T& p) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class S, class T, class A>
|
2017-04-14 02:25:32 +08:00
|
|
|
class const_mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
|
|
|
|
S operator()(const T& p, A x) const;
|
|
|
|
};
|
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
template <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
|
|
|
|
template <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
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2020-12-26 03:48:39 +08:00
|
|
|
template<class R, class T>
|
|
|
|
constexpr unspecified mem_fn(R T::*); // constexpr in C++20
|
2010-08-21 03:36:46 +08:00
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
class bad_function_call
|
|
|
|
: public exception
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
template<class> class function; // undefined
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
template<class R, class... ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
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;
|
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// construct/copy/destroy:
|
2011-05-29 01:59:48 +08:00
|
|
|
function() noexcept;
|
|
|
|
function(nullptr_t) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
function(const function&);
|
2011-05-29 01:59:48 +08:00
|
|
|
function(function&&) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class F>
|
|
|
|
function(F);
|
|
|
|
template<Allocator Alloc>
|
2016-10-14 05:06:03 +08:00
|
|
|
function(allocator_arg_t, const Alloc&) noexcept; // removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
template<Allocator Alloc>
|
2016-10-14 05:06:03 +08:00
|
|
|
function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
template<Allocator Alloc>
|
2016-10-14 05:06:03 +08:00
|
|
|
function(allocator_arg_t, const Alloc&, const function&); // removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
template<Allocator Alloc>
|
2016-10-14 05:06:03 +08:00
|
|
|
function(allocator_arg_t, const Alloc&, function&&); // removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class F, Allocator Alloc>
|
2016-10-14 05:06:03 +08:00
|
|
|
function(allocator_arg_t, const Alloc&, F); // removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
function& operator=(const function&);
|
2011-05-29 01:59:48 +08:00
|
|
|
function& operator=(function&&) noexcept;
|
2011-05-29 21:53:56 +08:00
|
|
|
function& operator=(nullptr_t) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class F>
|
2010-08-21 03:36:46 +08:00
|
|
|
function& operator=(F&&);
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class F>
|
2011-05-29 01:59:48 +08:00
|
|
|
function& operator=(reference_wrapper<F>) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
~function();
|
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// function modifiers:
|
2011-05-29 01:59:48 +08:00
|
|
|
void swap(function&) noexcept;
|
2010-08-21 03:36:46 +08:00
|
|
|
template<class F, class Alloc>
|
2016-01-26 01:29:55 +08:00
|
|
|
void assign(F&&, const Alloc&); // Removed in C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// function capacity:
|
2011-05-29 01:59:48 +08:00
|
|
|
explicit operator bool() const noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// function invocation:
|
2010-05-12 03:42:16 +08:00
|
|
|
R operator()(ArgTypes...) const;
|
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// function target access:
|
2011-05-29 01:59:48 +08:00
|
|
|
const std::type_info& target_type() const noexcept;
|
|
|
|
template <typename T> T* target() noexcept;
|
|
|
|
template <typename T> const T* target() const noexcept;
|
2010-08-21 03:36:46 +08:00
|
|
|
};
|
|
|
|
|
2019-07-19 03:50:56 +08:00
|
|
|
// Deduction guides
|
|
|
|
template<class R, class ...Args>
|
|
|
|
function(R(*)(Args...)) -> function<R(Args...)>; // since C++17
|
|
|
|
|
|
|
|
template<class F>
|
|
|
|
function(F) -> function<see-below>; // since C++17
|
|
|
|
|
2010-08-22 08:02:43 +08:00
|
|
|
// Null pointer comparisons:
|
|
|
|
template <class R, class ... ArgTypes>
|
2011-05-29 01:59:48 +08:00
|
|
|
bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-22 08:02:43 +08:00
|
|
|
template <class R, class ... ArgTypes>
|
2011-05-29 01:59:48 +08:00
|
|
|
bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-22 08:02:43 +08:00
|
|
|
template <class R, class ... ArgTypes>
|
2011-05-29 01:59:48 +08:00
|
|
|
bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-22 08:02:43 +08:00
|
|
|
template <class R, class ... ArgTypes>
|
2011-05-29 01:59:48 +08:00
|
|
|
bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-22 08:02:43 +08:00
|
|
|
// specialized algorithms:
|
|
|
|
template <class R, class ... ArgTypes>
|
2011-05-29 01:59:48 +08:00
|
|
|
void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class T> struct hash;
|
|
|
|
|
|
|
|
template <> struct hash<bool>;
|
|
|
|
template <> struct hash<char>;
|
|
|
|
template <> struct hash<signed char>;
|
|
|
|
template <> struct hash<unsigned char>;
|
2020-12-09 02:39:56 +08:00
|
|
|
template <> struct hash<char8_t>; // since C++20
|
2010-05-12 03:42:16 +08:00
|
|
|
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*>;
|
2017-03-23 14:20:18 +08:00
|
|
|
template <> struct hash<nullptr_t>; // C++17
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
} // 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>
|
2017-01-21 08:02:12 +08:00
|
|
|
#include <utility>
|
2018-09-13 03:41:40 +08:00
|
|
|
#include <version>
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
#include <__functional_base>
|
|
|
|
|
2011-10-18 04:05:10 +08:00
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
2010-05-12 03:42:16 +08:00
|
|
|
#pragma GCC system_header
|
2011-10-18 04:05:10 +08:00
|
|
|
#endif
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS plus : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x + __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS plus<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _T1, class _T2>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS minus : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x - __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS minus<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _T1, class _T2>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS multiplies : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x * __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS multiplies<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _T1, class _T2>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS divides : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x / __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS divides<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _T1, class _T2>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS modulus : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x % __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS modulus<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _T1, class _T2>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS negate : unary_function<_Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return -__x;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS negate<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _Tp>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_Tp&& __x) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x)))
|
|
|
|
-> decltype (- _VSTD::forward<_Tp>(__x))
|
|
|
|
{ return - _VSTD::forward<_Tp>(__x); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS equal_to : binary_function<_Tp, _Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x == __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS equal_to<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS not_equal_to : binary_function<_Tp, _Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x != __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS not_equal_to<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x > __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS greater<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2012-02-22 05:02:58 +08:00
|
|
|
// less in <__functional_base>
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS greater_equal : binary_function<_Tp, _Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x >= __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS greater_equal<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS less_equal : binary_function<_Tp, _Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x <= __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS less_equal<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS logical_and : binary_function<_Tp, _Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x && __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS logical_and<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS logical_or : binary_function<_Tp, _Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x || __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS logical_or<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS logical_not : unary_function<_Tp, bool>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const _Tp& __x) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return !__x;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS logical_not<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _Tp>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_Tp&& __x) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x)))
|
|
|
|
-> decltype (!_VSTD::forward<_Tp>(__x))
|
|
|
|
{ return !_VSTD::forward<_Tp>(__x); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_and : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x & __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_and<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_or : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x | __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_or<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
|
|
|
#else
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
#endif
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_xor : binary_function<_Tp, _Tp, _Tp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x, const _Tp& __y) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x ^ __y;}
|
|
|
|
};
|
|
|
|
|
2013-07-29 22:21:53 +08:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_xor<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
template <class _T1, class _T2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2013-07-29 22:21:53 +08:00
|
|
|
auto operator()(_T1&& __t, _T2&& __u) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_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); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _Tp = void>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_not : unary_function<_Tp, _Tp>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Tp operator()(const _Tp& __x) const
|
2013-07-29 22:21:53 +08:00
|
|
|
{return ~__x;}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <>
|
2017-01-05 07:56:00 +08:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS bit_not<void>
|
2013-07-29 22:21:53 +08:00
|
|
|
{
|
|
|
|
template <class _Tp>
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
auto operator()(_Tp&& __x) const
|
2015-02-25 20:20:52 +08:00
|
|
|
_NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x)))
|
|
|
|
-> decltype (~_VSTD::forward<_Tp>(__x))
|
|
|
|
{ return ~_VSTD::forward<_Tp>(__x); }
|
2013-08-13 09:11:06 +08:00
|
|
|
typedef void is_transparent;
|
2013-07-29 22:21:53 +08:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Predicate>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 unary_negate
|
2010-05-12 03:42:16 +08:00
|
|
|
: public unary_function<typename _Predicate::argument_type, bool>
|
|
|
|
{
|
|
|
|
_Predicate __pred_;
|
|
|
|
public:
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit unary_negate(const _Predicate& __pred)
|
2010-05-12 03:42:16 +08:00
|
|
|
: __pred_(__pred) {}
|
2013-09-29 03:06:12 +08:00
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const typename _Predicate::argument_type& __x) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{return !__pred_(__x);}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Predicate>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
unary_negate<_Predicate>
|
|
|
|
not1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);}
|
|
|
|
|
|
|
|
template <class _Predicate>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 binary_negate
|
2010-05-12 03:42:16 +08:00
|
|
|
: public binary_function<typename _Predicate::first_argument_type,
|
|
|
|
typename _Predicate::second_argument_type,
|
|
|
|
bool>
|
|
|
|
{
|
|
|
|
_Predicate __pred_;
|
|
|
|
public:
|
2018-08-04 06:36:53 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11
|
2013-09-29 03:06:12 +08:00
|
|
|
binary_negate(const _Predicate& __pred) : __pred_(__pred) {}
|
|
|
|
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator()(const typename _Predicate::first_argument_type& __x,
|
2010-05-12 03:42:16 +08:00
|
|
|
const typename _Predicate::second_argument_type& __y) const
|
|
|
|
{return !__pred_(__x, __y);}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Predicate>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
binary_negate<_Predicate>
|
|
|
|
not2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);}
|
|
|
|
|
2017-04-14 02:25:32 +08:00
|
|
|
#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class __Operation>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder1st
|
2010-05-12 03:42:16 +08:00
|
|
|
: 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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
binder1st<__Operation>
|
|
|
|
bind1st(const __Operation& __op, const _Tp& __x)
|
|
|
|
{return binder1st<__Operation>(__op, __x);}
|
|
|
|
|
|
|
|
template <class __Operation>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder2nd
|
2010-05-12 03:42:16 +08:00
|
|
|
: public unary_function<typename __Operation::first_argument_type,
|
|
|
|
typename __Operation::result_type>
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
__Operation op;
|
|
|
|
typename __Operation::second_argument_type value;
|
|
|
|
public:
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
binder2nd<__Operation>
|
|
|
|
bind2nd(const __Operation& __op, const _Tp& __x)
|
|
|
|
{return binder2nd<__Operation>(__op, __x);}
|
|
|
|
|
|
|
|
template <class _Arg, class _Result>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_unary_function
|
2010-09-22 06:55:27 +08:00
|
|
|
: public unary_function<_Arg, _Result>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_binary_function
|
2010-09-22 06:55:27 +08:00
|
|
|
: public binary_function<_Arg1, _Arg2, _Result>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_t
|
|
|
|
: public unary_function<_Tp*, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_t
|
|
|
|
: public binary_function<_Tp*, _Ap, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
mem_fun_t<_Sp,_Tp>
|
|
|
|
mem_fun(_Sp (_Tp::*__f)())
|
|
|
|
{return mem_fun_t<_Sp,_Tp>(__f);}
|
|
|
|
|
|
|
|
template<class _Sp, class _Tp, class _Ap>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_ref_t
|
|
|
|
: public unary_function<_Tp, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_ref_t
|
|
|
|
: public binary_function<_Tp, _Ap, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_t
|
|
|
|
: public unary_function<const _Tp*, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_t
|
|
|
|
: public binary_function<const _Tp*, _Ap, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_ref_t
|
|
|
|
: public unary_function<_Tp, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_ref_t
|
2010-09-22 06:55:27 +08:00
|
|
|
: public binary_function<_Tp, _Ap, _Sp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
_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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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>
|
[libc++] Add deprecated attributes to many deprecated components
Summary:
These deprecation warnings are opt-in: they are only enabled when the
_LIBCXX_DEPRECATION_WARNINGS macro is defined, which is not the case
by default. Note that this is a first step in the right direction, but
I wasn't able to get an exhaustive list of all deprecated components
per standard, so there's certainly stuff that's missing. The list of
components this commit marks as deprecated is:
in C++11:
- auto_ptr, auto_ptr_ref
- binder1st, binder2nd, bind1st(), bind2nd()
- pointer_to_unary_function, pointer_to_binary_function, ptr_fun()
- mem_fun_t, mem_fun1_t, const_mem_fun_t, const_mem_fun1_t, mem_fun()
- mem_fun_ref_t, mem_fun1_ref_t, const_mem_fun_ref_t, const_mem_fun1_ref_t, mem_fun_ref()
in C++14:
- random_shuffle()
in C++17:
- unary_negate, binary_negate, not1(), not2()
<rdar://problem/18168350>
Reviewers: mclow.lists, EricWF
Subscribers: christof, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D48912
llvm-svn: 342843
2018-09-24 02:35:00 +08:00
|
|
|
_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
|
2010-05-12 03:42:16 +08:00
|
|
|
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);}
|
2017-04-14 02:25:32 +08:00
|
|
|
#endif
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2015-07-22 12:14:38 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// MEMFUN
|
|
|
|
//==============================================================================
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class _Tp>
|
|
|
|
class __mem_fn
|
|
|
|
: public __weak_result_type<_Tp>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// types
|
|
|
|
typedef _Tp type;
|
|
|
|
private:
|
|
|
|
type __f_;
|
|
|
|
|
|
|
|
public:
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
|
|
|
__mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2017-04-19 09:28:47 +08:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2010-05-12 03:42:16 +08:00
|
|
|
// invoke
|
|
|
|
template <class... _ArgTypes>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2015-07-23 06:43:27 +08:00
|
|
|
typename __invoke_return<type, _ArgTypes...>::type
|
|
|
|
operator() (_ArgTypes&&... __args) const {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
|
2015-07-23 06:43:27 +08:00
|
|
|
}
|
|
|
|
#else
|
|
|
|
|
|
|
|
template <class _A0>
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2015-07-23 06:43:27 +08:00
|
|
|
typename __invoke_return0<type, _A0>::type
|
|
|
|
operator() (_A0& __a0) const {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0);
|
2015-07-23 06:43:27 +08:00
|
|
|
}
|
|
|
|
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
template <class _A0>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
typename __invoke_return0<type, _A0 const>::type
|
|
|
|
operator() (_A0 const& __a0) const {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
2015-07-23 06:43:27 +08:00
|
|
|
template <class _A0, class _A1>
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2015-07-23 06:43:27 +08:00
|
|
|
typename __invoke_return1<type, _A0, _A1>::type
|
|
|
|
operator() (_A0& __a0, _A1& __a1) const {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1);
|
2015-07-23 06:43:27 +08:00
|
|
|
}
|
|
|
|
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
template <class _A0, class _A1>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
typename __invoke_return1<type, _A0 const, _A1>::type
|
|
|
|
operator() (_A0 const& __a0, _A1& __a1) const {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _A0, class _A1>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
typename __invoke_return1<type, _A0, _A1 const>::type
|
|
|
|
operator() (_A0& __a0, _A1 const& __a1) const {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
2015-07-23 06:43:27 +08:00
|
|
|
template <class _A0, class _A1, class _A2>
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2015-07-23 06:43:27 +08:00
|
|
|
typename __invoke_return2<type, _A0, _A1, _A2>::type
|
|
|
|
operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
2015-07-23 06:43:27 +08:00
|
|
|
}
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, __a0, __a1, __a2);
|
[libcxx] Rewrite C++03 __invoke.
Summary:
This patch rewrites the C++03 `__invoke` and related meta-programming. There are a number of major changes.
`__invoke` in C++03 now has a fallback overload for when the invoke expression is ill-formed (similar to C++11). This means that the `__invoke_return` traits will return `__nat` when `__invoke(...)` is ill formed. This would previously cause a compile error.
Bullets 1-4 of `__invoke` have been rewritten. In the old version `__invoke` had 32 overloads for bullets 1 and 2,
one for each possible cv-qualified function signature with arities 0-3. 64 overloads would be needed to support member functions
with varargs. Currently these overloads were fundamentally broken. An example overload looked like:
```
template <class Rp, class Tp, class T1, class A0>
Rp __invoke(Rp (Tp::*pm)(A0) const, T1&, A0&)
```
Because `A0` appeared in two different deducible contexts it would have to deduce to be an exact match or the overload
would be rejected. This is made even worse because `A0` appears without a reference qualifier in the member function signature
and with a reference qualifier as an `__invoke` parameter. This means that only member functions that took all
of their arguments by value could be matched.
One possible fix would be to make the second occurrence of `A0` appear in a non-deducible context. This way
any type convertible to `A0` could be passed as the first parameter. The benefit of this approach is that the
signature of the member function enforces the arity and types taken by the `__invoke` signature it generates. However
nothing in the `INVOKE` specification requires this behavior.
My solution is to use a `__invoke_enable_if<PM_Type, Tp>` metafunction to selectively enable the `__invoke` overloads for bullets 1, 2, 3 and 4. It uses `__member_function_traits` to inspect and extract the return type and class type of the pointer to member. Using `__member_function_traits` to inspect `PM_Type` also allows us to reduce the number of `__invoke` overloads from 32 to 8 and add
varargs support at the same time.
Because `__invoke_enable_if` knows the exact return type of `__invoke` for bullets 1-4 we no longer need to use `decltype(__invoke(...))` to
compute the return type in the `__invoke_return*` traits. This will reduce the problems caused by `#define decltype(X) __typeof__(X)` in C++03.
Tests for this change have already been committed. All tests in `test/std/utilities/function.objects` now pass in C++03, previously there were 20 failures.
Reviewers: K-ballo, howard.hinnant, mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D11553
llvm-svn: 246068
2015-08-27 04:15:02 +08:00
|
|
|
}
|
2015-07-23 06:43:27 +08:00
|
|
|
#endif
|
2010-05-12 03:42:16 +08:00
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class _Tp>
|
2020-12-26 03:48:39 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2011-11-30 02:15:50 +08:00
|
|
|
__mem_fn<_Rp _Tp::*>
|
2015-10-26 04:12:16 +08:00
|
|
|
mem_fn(_Rp _Tp::* __pm) _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-11-30 02:15:50 +08:00
|
|
|
return __mem_fn<_Rp _Tp::*>(__pm);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2015-07-22 12:14:38 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// FUNCTION
|
|
|
|
//==============================================================================
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
// bad_function_call
|
|
|
|
|
2010-09-22 06:55:27 +08:00
|
|
|
class _LIBCPP_EXCEPTION_ABI bad_function_call
|
2010-05-12 03:42:16 +08:00
|
|
|
: public exception
|
|
|
|
{
|
[libc++] Add a key function for bad_function_call
Summary:
bad_function_call is currently an empty class, so any object files using
that class will end up with their own copy of its typeinfo, typeinfo
name and vtable, leading to unnecessary duplication that has to be
resolved by the dynamic linker. Instead, give bad_function_call a key
function and put a definition for that key function in libc++ itself, to
centralize the typeinfo and vtable.
This is consistent with the behavior for other exception classes. The
key functions are defined in libc++ rather than libc++abi since the
class is defined in the libc++ versioning namespace, so ABI
compatibility with libstdc++ is not a concern.
Guard this change behind an ABI macro, since it isn't backwards
compatible (i.e., clients built against the new libc++ headers wouldn't
be able to run against an older libc++ library).
Reviewers: mclow.lists, EricWF
Subscribers: mgorny, cfe-commits
Differential Revision: https://reviews.llvm.org/D27387
llvm-svn: 298937
2017-03-29 03:33:31 +08:00
|
|
|
#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
|
|
|
|
public:
|
|
|
|
virtual ~bad_function_call() _NOEXCEPT;
|
|
|
|
|
|
|
|
virtual const char* what() const _NOEXCEPT;
|
|
|
|
#endif
|
2010-05-12 03:42:16 +08:00
|
|
|
};
|
|
|
|
|
2018-07-12 07:14:33 +08:00
|
|
|
_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
|
2016-08-25 23:09:01 +08:00
|
|
|
void __throw_bad_function_call()
|
|
|
|
{
|
|
|
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
|
|
throw bad_function_call();
|
|
|
|
#else
|
2018-08-04 06:36:53 +08:00
|
|
|
_VSTD::abort();
|
2016-08-25 23:09:01 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2020-03-09 23:16:22 +08:00
|
|
|
#if defined(_LIBCPP_CXX03_LANG) && !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS) && __has_attribute(deprecated)
|
|
|
|
# define _LIBCPP_DEPRECATED_CXX03_FUNCTION \
|
|
|
|
__attribute__((deprecated("Using std::function in C++03 is not supported anymore. Please upgrade to C++11 or later, or use a different type")))
|
|
|
|
#else
|
|
|
|
# define _LIBCPP_DEPRECATED_CXX03_FUNCTION /* nothing */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
template<class _Fp> class _LIBCPP_DEPRECATED_CXX03_FUNCTION _LIBCPP_TEMPLATE_VIS function; // undefined
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
namespace __function
|
|
|
|
{
|
|
|
|
|
2015-07-22 12:14:38 +08:00
|
|
|
template<class _Rp>
|
2010-05-12 03:42:16 +08:00
|
|
|
struct __maybe_derive_from_unary_function
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class _A1>
|
|
|
|
struct __maybe_derive_from_unary_function<_Rp(_A1)>
|
|
|
|
: public unary_function<_A1, _Rp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2015-07-22 12:14:38 +08:00
|
|
|
template<class _Rp>
|
2010-05-12 03:42:16 +08:00
|
|
|
struct __maybe_derive_from_binary_function
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class _A1, class _A2>
|
|
|
|
struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
|
|
|
|
: public binary_function<_A1, _A2, _Rp>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2015-08-19 03:41:51 +08:00
|
|
|
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; }
|
|
|
|
|
2020-04-23 01:58:17 +08:00
|
|
|
#ifdef _LIBCPP_HAS_EXTENSION_BLOCKS
|
|
|
|
template <class _Rp, class ..._Args>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool __not_null(_Rp (^__p)(_Args...)) { return __p; }
|
|
|
|
#endif
|
|
|
|
|
2015-07-22 12:14:38 +08:00
|
|
|
} // namespace __function
|
|
|
|
|
2017-04-19 09:28:47 +08:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2015-07-22 12:14:38 +08:00
|
|
|
|
|
|
|
namespace __function {
|
|
|
|
|
2018-12-11 02:14:09 +08:00
|
|
|
// __alloc_func holds a functor and an allocator.
|
|
|
|
|
|
|
|
template <class _Fp, class _Ap, class _FB> class __alloc_func;
|
2019-06-08 09:31:19 +08:00
|
|
|
template <class _Fp, class _FB>
|
|
|
|
class __default_alloc_func;
|
2018-12-11 02:14:09 +08:00
|
|
|
|
|
|
|
template <class _Fp, class _Ap, class _Rp, class... _ArgTypes>
|
|
|
|
class __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)>
|
|
|
|
{
|
|
|
|
__compressed_pair<_Fp, _Ap> __f_;
|
|
|
|
|
|
|
|
public:
|
2019-06-12 10:03:31 +08:00
|
|
|
typedef _LIBCPP_NODEBUG_TYPE _Fp _Target;
|
|
|
|
typedef _LIBCPP_NODEBUG_TYPE _Ap _Alloc;
|
2018-12-11 02:14:09 +08:00
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
const _Target& __target() const { return __f_.first(); }
|
|
|
|
|
2019-01-30 07:19:45 +08:00
|
|
|
// WIN32 APIs may define __allocator, so use __get_allocator instead.
|
2018-12-11 02:14:09 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2019-01-30 07:19:45 +08:00
|
|
|
const _Alloc& __get_allocator() const { return __f_.second(); }
|
2018-12-11 02:14:09 +08:00
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __alloc_func(_Target&& __f)
|
|
|
|
: __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
|
|
|
|
_VSTD::forward_as_tuple())
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __alloc_func(const _Target& __f, const _Alloc& __a)
|
|
|
|
: __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
|
|
|
|
_VSTD::forward_as_tuple(__a))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __alloc_func(const _Target& __f, _Alloc&& __a)
|
|
|
|
: __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
|
|
|
|
_VSTD::forward_as_tuple(_VSTD::move(__a)))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __alloc_func(_Target&& __f, _Alloc&& __a)
|
|
|
|
: __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
|
|
|
|
_VSTD::forward_as_tuple(_VSTD::move(__a)))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Rp operator()(_ArgTypes&&... __arg)
|
|
|
|
{
|
|
|
|
typedef __invoke_void_return_wrapper<_Rp> _Invoker;
|
|
|
|
return _Invoker::__call(__f_.first(),
|
|
|
|
_VSTD::forward<_ArgTypes>(__arg)...);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__alloc_func* __clone() const
|
|
|
|
{
|
|
|
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
|
|
|
typedef
|
|
|
|
typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type
|
|
|
|
_AA;
|
|
|
|
_AA __a(__f_.second());
|
|
|
|
typedef __allocator_destructor<_AA> _Dp;
|
|
|
|
unique_ptr<__alloc_func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
|
|
|
|
::new ((void*)__hold.get()) __alloc_func(__f_.first(), _Alloc(__a));
|
|
|
|
return __hold.release();
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
void destroy() _NOEXCEPT { __f_.~__compressed_pair<_Target, _Alloc>(); }
|
2019-06-08 09:31:19 +08:00
|
|
|
|
|
|
|
static void __destroy_and_delete(__alloc_func* __f) {
|
|
|
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
|
|
|
typedef typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type
|
|
|
|
_FunAlloc;
|
|
|
|
_FunAlloc __a(__f->__get_allocator());
|
|
|
|
__f->destroy();
|
|
|
|
__a.deallocate(__f, 1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Fp, class _Rp, class... _ArgTypes>
|
|
|
|
class __default_alloc_func<_Fp, _Rp(_ArgTypes...)> {
|
|
|
|
_Fp __f_;
|
|
|
|
|
|
|
|
public:
|
2019-06-12 10:03:31 +08:00
|
|
|
typedef _LIBCPP_NODEBUG_TYPE _Fp _Target;
|
2019-06-08 09:31:19 +08:00
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
const _Target& __target() const { return __f_; }
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-28 00:02:06 +08:00
|
|
|
explicit __default_alloc_func(_Target&& __f) : __f_(_VSTD::move(__f)) {}
|
2019-06-08 09:31:19 +08:00
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __default_alloc_func(const _Target& __f) : __f_(__f) {}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Rp operator()(_ArgTypes&&... __arg) {
|
|
|
|
typedef __invoke_void_return_wrapper<_Rp> _Invoker;
|
|
|
|
return _Invoker::__call(__f_, _VSTD::forward<_ArgTypes>(__arg)...);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__default_alloc_func* __clone() const {
|
|
|
|
__builtin_new_allocator::__holder_t __hold =
|
|
|
|
__builtin_new_allocator::__allocate_type<__default_alloc_func>(1);
|
|
|
|
__default_alloc_func* __res =
|
2020-12-12 09:30:28 +08:00
|
|
|
::new ((void*)__hold.get()) __default_alloc_func(__f_);
|
2019-06-08 09:31:19 +08:00
|
|
|
(void)__hold.release();
|
|
|
|
return __res;
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
void destroy() _NOEXCEPT { __f_.~_Target(); }
|
|
|
|
|
|
|
|
static void __destroy_and_delete(__default_alloc_func* __f) {
|
|
|
|
__f->destroy();
|
|
|
|
__builtin_new_allocator::__deallocate_type<__default_alloc_func>(__f, 1);
|
|
|
|
}
|
2018-12-11 02:14:09 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
// __base provides an abstract interface for copyable functors.
|
|
|
|
|
2020-03-19 05:06:18 +08:00
|
|
|
template<class _Fp> class _LIBCPP_TEMPLATE_VIS __base;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
|
|
|
class __base<_Rp(_ArgTypes...)>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
__base(const __base&);
|
|
|
|
__base& operator=(const __base&);
|
|
|
|
public:
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY __base() {}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
|
2010-05-12 03:42:16 +08:00
|
|
|
virtual __base* __clone() const = 0;
|
|
|
|
virtual void __clone(__base*) const = 0;
|
2011-05-29 01:59:48 +08:00
|
|
|
virtual void destroy() _NOEXCEPT = 0;
|
|
|
|
virtual void destroy_deallocate() _NOEXCEPT = 0;
|
2011-11-30 02:15:50 +08:00
|
|
|
virtual _Rp operator()(_ArgTypes&& ...) = 0;
|
2010-08-12 01:04:31 +08:00
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
2011-05-29 01:59:48 +08:00
|
|
|
virtual const void* target(const type_info&) const _NOEXCEPT = 0;
|
|
|
|
virtual const std::type_info& target_type() const _NOEXCEPT = 0;
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_NO_RTTI
|
2010-05-12 03:42:16 +08:00
|
|
|
};
|
|
|
|
|
2018-12-11 02:14:09 +08:00
|
|
|
// __func implements __base for a given functor type.
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class _FD, class _Alloc, class _FB> class __func;
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
|
|
|
class __func<_Fp, _Alloc, _Rp(_ArgTypes...)>
|
|
|
|
: public __base<_Rp(_ArgTypes...)>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
__alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> __f_;
|
2010-05-12 03:42:16 +08:00
|
|
|
public:
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2012-02-29 03:47:38 +08:00
|
|
|
explicit __func(_Fp&& __f)
|
2018-12-11 02:14:09 +08:00
|
|
|
: __f_(_VSTD::move(__f)) {}
|
|
|
|
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2012-02-29 03:47:38 +08:00
|
|
|
explicit __func(const _Fp& __f, const _Alloc& __a)
|
2018-12-11 02:14:09 +08:00
|
|
|
: __f_(__f, __a) {}
|
2012-02-29 03:47:38 +08:00
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __func(const _Fp& __f, _Alloc&& __a)
|
2018-12-11 02:14:09 +08:00
|
|
|
: __f_(__f, _VSTD::move(__a)) {}
|
2012-02-29 03:47:38 +08:00
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __func(_Fp&& __f, _Alloc&& __a)
|
2018-12-11 02:14:09 +08:00
|
|
|
: __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
virtual __base<_Rp(_ArgTypes...)>* __clone() const;
|
|
|
|
virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;
|
2011-05-29 01:59:48 +08:00
|
|
|
virtual void destroy() _NOEXCEPT;
|
|
|
|
virtual void destroy_deallocate() _NOEXCEPT;
|
2018-12-11 02:14:09 +08:00
|
|
|
virtual _Rp operator()(_ArgTypes&&... __arg);
|
2010-08-12 01:04:31 +08:00
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
2011-05-29 01:59:48 +08:00
|
|
|
virtual const void* target(const type_info&) const _NOEXCEPT;
|
|
|
|
virtual const std::type_info& target_type() const _NOEXCEPT;
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_NO_RTTI
|
2010-05-12 03:42:16 +08:00
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
|
|
|
__base<_Rp(_ArgTypes...)>*
|
|
|
|
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2015-03-19 06:56:50 +08:00
|
|
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
2015-04-07 13:21:38 +08:00
|
|
|
typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
|
2019-01-30 07:19:45 +08:00
|
|
|
_Ap __a(__f_.__get_allocator());
|
2011-11-30 02:15:50 +08:00
|
|
|
typedef __allocator_destructor<_Ap> _Dp;
|
|
|
|
unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
|
2018-12-11 02:14:09 +08:00
|
|
|
::new ((void*)__hold.get()) __func(__f_.__target(), _Alloc(__a));
|
2010-05-12 03:42:16 +08:00
|
|
|
return __hold.release();
|
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
void
|
2011-11-30 02:15:50 +08:00
|
|
|
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2020-12-12 09:30:28 +08:00
|
|
|
::new ((void*)__p) __func(__f_.__target(), __f_.__get_allocator());
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
void
|
2011-11-30 02:15:50 +08:00
|
|
|
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
__f_.destroy();
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
void
|
2011-11-30 02:15:50 +08:00
|
|
|
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2015-03-19 06:56:50 +08:00
|
|
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
2015-04-07 13:21:38 +08:00
|
|
|
typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
|
2019-01-30 07:19:45 +08:00
|
|
|
_Ap __a(__f_.__get_allocator());
|
2018-12-11 02:14:09 +08:00
|
|
|
__f_.destroy();
|
2010-05-12 03:42:16 +08:00
|
|
|
__a.deallocate(this, 1);
|
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
|
|
|
_Rp
|
|
|
|
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2010-08-12 01:04:31 +08:00
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
const void*
|
2011-11-30 02:15:50 +08:00
|
|
|
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-11-30 02:15:50 +08:00
|
|
|
if (__ti == typeid(_Fp))
|
2018-12-11 02:14:09 +08:00
|
|
|
return &__f_.__target();
|
2020-11-25 01:53:53 +08:00
|
|
|
return nullptr;
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
const std::type_info&
|
2011-11-30 02:15:50 +08:00
|
|
|
__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-11-30 02:15:50 +08:00
|
|
|
return typeid(_Fp);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_NO_RTTI
|
2010-08-12 01:04:31 +08:00
|
|
|
|
2018-12-11 02:14:09 +08:00
|
|
|
// __value_func creates a value-type from a __func.
|
|
|
|
|
|
|
|
template <class _Fp> class __value_func;
|
|
|
|
|
|
|
|
template <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)>
|
|
|
|
{
|
|
|
|
typename aligned_storage<3 * sizeof(void*)>::type __buf_;
|
|
|
|
|
|
|
|
typedef __base<_Rp(_ArgTypes...)> __func;
|
|
|
|
__func* __f_;
|
|
|
|
|
|
|
|
_LIBCPP_NO_CFI static __func* __as_base(void* p)
|
|
|
|
{
|
|
|
|
return reinterpret_cast<__func*>(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2020-11-25 01:53:53 +08:00
|
|
|
__value_func() _NOEXCEPT : __f_(nullptr) {}
|
2018-12-11 02:14:09 +08:00
|
|
|
|
|
|
|
template <class _Fp, class _Alloc>
|
2019-06-08 09:31:19 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY __value_func(_Fp&& __f, const _Alloc& __a)
|
2020-11-25 01:53:53 +08:00
|
|
|
: __f_(nullptr)
|
2018-12-11 02:14:09 +08:00
|
|
|
{
|
|
|
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
|
|
|
typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
|
|
|
|
typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
|
|
|
|
_FunAlloc;
|
|
|
|
|
|
|
|
if (__function::__not_null(__f))
|
|
|
|
{
|
|
|
|
_FunAlloc __af(__a);
|
|
|
|
if (sizeof(_Fun) <= sizeof(__buf_) &&
|
|
|
|
is_nothrow_copy_constructible<_Fp>::value &&
|
|
|
|
is_nothrow_copy_constructible<_FunAlloc>::value)
|
|
|
|
{
|
|
|
|
__f_ =
|
|
|
|
::new ((void*)&__buf_) _Fun(_VSTD::move(__f), _Alloc(__af));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
typedef __allocator_destructor<_FunAlloc> _Dp;
|
|
|
|
unique_ptr<__func, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
|
|
|
|
::new ((void*)__hold.get()) _Fun(_VSTD::move(__f), _Alloc(__a));
|
|
|
|
__f_ = __hold.release();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-08 09:31:19 +08:00
|
|
|
template <class _Fp,
|
|
|
|
class = typename enable_if<!is_same<typename decay<_Fp>::type, __value_func>::value>::type>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY explicit __value_func(_Fp&& __f)
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-28 00:02:06 +08:00
|
|
|
: __value_func(_VSTD::forward<_Fp>(__f), allocator<_Fp>()) {}
|
2019-06-08 09:31:19 +08:00
|
|
|
|
2018-12-11 02:14:09 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__value_func(const __value_func& __f)
|
|
|
|
{
|
2020-11-25 01:53:53 +08:00
|
|
|
if (__f.__f_ == nullptr)
|
|
|
|
__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
else if ((void*)__f.__f_ == &__f.__buf_)
|
|
|
|
{
|
|
|
|
__f_ = __as_base(&__buf_);
|
|
|
|
__f.__f_->__clone(__f_);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__f_ = __f.__f_->__clone();
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__value_func(__value_func&& __f) _NOEXCEPT
|
|
|
|
{
|
2020-11-25 01:53:53 +08:00
|
|
|
if (__f.__f_ == nullptr)
|
|
|
|
__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
else if ((void*)__f.__f_ == &__f.__buf_)
|
|
|
|
{
|
|
|
|
__f_ = __as_base(&__buf_);
|
|
|
|
__f.__f_->__clone(__f_);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__f_ = __f.__f_;
|
2020-11-25 01:53:53 +08:00
|
|
|
__f.__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
~__value_func()
|
|
|
|
{
|
|
|
|
if ((void*)__f_ == &__buf_)
|
|
|
|
__f_->destroy();
|
|
|
|
else if (__f_)
|
|
|
|
__f_->destroy_deallocate();
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__value_func& operator=(__value_func&& __f)
|
|
|
|
{
|
|
|
|
*this = nullptr;
|
2020-11-25 01:53:53 +08:00
|
|
|
if (__f.__f_ == nullptr)
|
|
|
|
__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
else if ((void*)__f.__f_ == &__f.__buf_)
|
|
|
|
{
|
|
|
|
__f_ = __as_base(&__buf_);
|
|
|
|
__f.__f_->__clone(__f_);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__f_ = __f.__f_;
|
2020-11-25 01:53:53 +08:00
|
|
|
__f.__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__value_func& operator=(nullptr_t)
|
|
|
|
{
|
|
|
|
__func* __f = __f_;
|
2020-11-25 01:53:53 +08:00
|
|
|
__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
if ((void*)__f == &__buf_)
|
|
|
|
__f->destroy();
|
|
|
|
else if (__f)
|
|
|
|
__f->destroy_deallocate();
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Rp operator()(_ArgTypes&&... __args) const
|
|
|
|
{
|
2020-11-25 01:53:53 +08:00
|
|
|
if (__f_ == nullptr)
|
2018-12-11 02:14:09 +08:00
|
|
|
__throw_bad_function_call();
|
|
|
|
return (*__f_)(_VSTD::forward<_ArgTypes>(__args)...);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
void swap(__value_func& __f) _NOEXCEPT
|
|
|
|
{
|
|
|
|
if (&__f == this)
|
|
|
|
return;
|
|
|
|
if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_)
|
|
|
|
{
|
|
|
|
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
|
|
|
__func* __t = __as_base(&__tempbuf);
|
|
|
|
__f_->__clone(__t);
|
|
|
|
__f_->destroy();
|
2020-11-25 01:53:53 +08:00
|
|
|
__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
__f.__f_->__clone(__as_base(&__buf_));
|
|
|
|
__f.__f_->destroy();
|
2020-11-25 01:53:53 +08:00
|
|
|
__f.__f_ = nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
__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_);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2020-11-25 01:53:53 +08:00
|
|
|
_LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { return __f_ != nullptr; }
|
2018-12-11 02:14:09 +08:00
|
|
|
|
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
const std::type_info& target_type() const _NOEXCEPT
|
|
|
|
{
|
2020-11-25 01:53:53 +08:00
|
|
|
if (__f_ == nullptr)
|
2018-12-11 02:14:09 +08:00
|
|
|
return typeid(void);
|
|
|
|
return __f_->target_type();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename _Tp>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
|
|
|
|
{
|
2020-11-25 01:53:53 +08:00
|
|
|
if (__f_ == nullptr)
|
|
|
|
return nullptr;
|
2018-12-11 02:14:09 +08:00
|
|
|
return (const _Tp*)__f_->target(typeid(_Tp));
|
|
|
|
}
|
|
|
|
#endif // _LIBCPP_NO_RTTI
|
|
|
|
};
|
|
|
|
|
2018-12-11 08:14:34 +08:00
|
|
|
// Storage for a functor object, to be used with __policy to manage copy and
|
|
|
|
// destruction.
|
|
|
|
union __policy_storage
|
|
|
|
{
|
|
|
|
mutable char __small[sizeof(void*) * 2];
|
|
|
|
void* __large;
|
|
|
|
};
|
|
|
|
|
|
|
|
// True if _Fun can safely be held in __policy_storage.__small.
|
|
|
|
template <typename _Fun>
|
|
|
|
struct __use_small_storage
|
|
|
|
: public _VSTD::integral_constant<
|
|
|
|
bool, sizeof(_Fun) <= sizeof(__policy_storage) &&
|
2019-01-16 09:51:12 +08:00
|
|
|
_LIBCPP_ALIGNOF(_Fun) <= _LIBCPP_ALIGNOF(__policy_storage) &&
|
2018-12-11 08:14:34 +08:00
|
|
|
_VSTD::is_trivially_copy_constructible<_Fun>::value &&
|
|
|
|
_VSTD::is_trivially_destructible<_Fun>::value> {};
|
|
|
|
|
|
|
|
// Policy contains information about how to copy, destroy, and move the
|
|
|
|
// underlying functor. You can think of it as a vtable of sorts.
|
|
|
|
struct __policy
|
|
|
|
{
|
|
|
|
// Used to copy or destroy __large values. null for trivial objects.
|
|
|
|
void* (*const __clone)(const void*);
|
|
|
|
void (*const __destroy)(void*);
|
|
|
|
|
|
|
|
// True if this is the null policy (no value).
|
|
|
|
const bool __is_null;
|
|
|
|
|
|
|
|
// The target type. May be null if RTTI is disabled.
|
|
|
|
const std::type_info* const __type_info;
|
|
|
|
|
|
|
|
// Returns a pointer to a static policy object suitable for the functor
|
|
|
|
// type.
|
|
|
|
template <typename _Fun>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY static const __policy* __create()
|
|
|
|
{
|
|
|
|
return __choose_policy<_Fun>(__use_small_storage<_Fun>());
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
static const __policy* __create_empty()
|
|
|
|
{
|
|
|
|
static const _LIBCPP_CONSTEXPR __policy __policy_ = {nullptr, nullptr,
|
|
|
|
true,
|
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
|
|
|
&typeid(void)
|
|
|
|
#else
|
|
|
|
nullptr
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
return &__policy_;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
template <typename _Fun> static void* __large_clone(const void* __s)
|
|
|
|
{
|
|
|
|
const _Fun* __f = static_cast<const _Fun*>(__s);
|
|
|
|
return __f->__clone();
|
|
|
|
}
|
|
|
|
|
2019-06-08 09:31:19 +08:00
|
|
|
template <typename _Fun>
|
|
|
|
static void __large_destroy(void* __s) {
|
|
|
|
_Fun::__destroy_and_delete(static_cast<_Fun*>(__s));
|
2018-12-11 08:14:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename _Fun>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY static const __policy*
|
2019-06-08 09:31:19 +08:00
|
|
|
__choose_policy(/* is_small = */ false_type) {
|
|
|
|
static const _LIBCPP_CONSTEXPR __policy __policy_ = {
|
|
|
|
&__large_clone<_Fun>, &__large_destroy<_Fun>, false,
|
2018-12-11 08:14:34 +08:00
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
2019-06-08 09:31:19 +08:00
|
|
|
&typeid(typename _Fun::_Target)
|
2018-12-11 08:14:34 +08:00
|
|
|
#else
|
2019-06-08 09:31:19 +08:00
|
|
|
nullptr
|
2018-12-11 08:14:34 +08:00
|
|
|
#endif
|
2019-06-08 09:31:19 +08:00
|
|
|
};
|
2018-12-11 08:14:34 +08:00
|
|
|
return &__policy_;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename _Fun>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY static const __policy*
|
|
|
|
__choose_policy(/* is_small = */ true_type)
|
|
|
|
{
|
|
|
|
static const _LIBCPP_CONSTEXPR __policy __policy_ = {
|
|
|
|
nullptr, nullptr, false,
|
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
|
|
|
&typeid(typename _Fun::_Target)
|
|
|
|
#else
|
|
|
|
nullptr
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
return &__policy_;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// Used to choose between perfect forwarding or pass-by-value. Pass-by-value is
|
|
|
|
// faster for types that can be passed in registers.
|
|
|
|
template <typename _Tp>
|
|
|
|
using __fast_forward =
|
|
|
|
typename _VSTD::conditional<_VSTD::is_scalar<_Tp>::value, _Tp, _Tp&&>::type;
|
|
|
|
|
|
|
|
// __policy_invoker calls an instance of __alloc_func held in __policy_storage.
|
|
|
|
|
|
|
|
template <class _Fp> struct __policy_invoker;
|
|
|
|
|
|
|
|
template <class _Rp, class... _ArgTypes>
|
|
|
|
struct __policy_invoker<_Rp(_ArgTypes...)>
|
|
|
|
{
|
|
|
|
typedef _Rp (*__Call)(const __policy_storage*,
|
|
|
|
__fast_forward<_ArgTypes>...);
|
|
|
|
|
|
|
|
__Call __call_;
|
|
|
|
|
|
|
|
// Creates an invoker that throws bad_function_call.
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__policy_invoker() : __call_(&__call_empty) {}
|
|
|
|
|
|
|
|
// Creates an invoker that calls the given instance of __func.
|
|
|
|
template <typename _Fun>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY static __policy_invoker __create()
|
|
|
|
{
|
|
|
|
return __policy_invoker(&__call_impl<_Fun>);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __policy_invoker(__Call __c) : __call_(__c) {}
|
|
|
|
|
|
|
|
static _Rp __call_empty(const __policy_storage*,
|
|
|
|
__fast_forward<_ArgTypes>...)
|
|
|
|
{
|
|
|
|
__throw_bad_function_call();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename _Fun>
|
|
|
|
static _Rp __call_impl(const __policy_storage* __buf,
|
|
|
|
__fast_forward<_ArgTypes>... __args)
|
|
|
|
{
|
|
|
|
_Fun* __f = reinterpret_cast<_Fun*>(__use_small_storage<_Fun>::value
|
|
|
|
? &__buf->__small
|
|
|
|
: __buf->__large);
|
|
|
|
return (*__f)(_VSTD::forward<_ArgTypes>(__args)...);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// __policy_func uses a __policy and __policy_invoker to create a type-erased,
|
|
|
|
// copyable functor.
|
|
|
|
|
|
|
|
template <class _Fp> class __policy_func;
|
|
|
|
|
|
|
|
template <class _Rp, class... _ArgTypes> class __policy_func<_Rp(_ArgTypes...)>
|
|
|
|
{
|
|
|
|
// Inline storage for small objects.
|
|
|
|
__policy_storage __buf_;
|
|
|
|
|
|
|
|
// Calls the value stored in __buf_. This could technically be part of
|
|
|
|
// policy, but storing it here eliminates a level of indirection inside
|
|
|
|
// operator().
|
|
|
|
typedef __function::__policy_invoker<_Rp(_ArgTypes...)> __invoker;
|
|
|
|
__invoker __invoker_;
|
|
|
|
|
|
|
|
// The policy that describes how to move / copy / destroy __buf_. Never
|
|
|
|
// null, even if the function is empty.
|
|
|
|
const __policy* __policy_;
|
|
|
|
|
|
|
|
public:
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__policy_func() : __policy_(__policy::__create_empty()) {}
|
|
|
|
|
|
|
|
template <class _Fp, class _Alloc>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY __policy_func(_Fp&& __f, const _Alloc& __a)
|
|
|
|
: __policy_(__policy::__create_empty())
|
|
|
|
{
|
|
|
|
typedef __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
|
|
|
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
|
|
|
typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
|
|
|
|
_FunAlloc;
|
|
|
|
|
|
|
|
if (__function::__not_null(__f))
|
|
|
|
{
|
|
|
|
__invoker_ = __invoker::template __create<_Fun>();
|
|
|
|
__policy_ = __policy::__create<_Fun>();
|
|
|
|
|
|
|
|
_FunAlloc __af(__a);
|
|
|
|
if (__use_small_storage<_Fun>())
|
|
|
|
{
|
|
|
|
::new ((void*)&__buf_.__small)
|
|
|
|
_Fun(_VSTD::move(__f), _Alloc(__af));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
typedef __allocator_destructor<_FunAlloc> _Dp;
|
|
|
|
unique_ptr<_Fun, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
|
|
|
|
::new ((void*)__hold.get())
|
|
|
|
_Fun(_VSTD::move(__f), _Alloc(__af));
|
|
|
|
__buf_.__large = __hold.release();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-08 09:31:19 +08:00
|
|
|
template <class _Fp, class = typename enable_if<!is_same<typename decay<_Fp>::type, __policy_func>::value>::type>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY explicit __policy_func(_Fp&& __f)
|
|
|
|
: __policy_(__policy::__create_empty()) {
|
|
|
|
typedef __default_alloc_func<_Fp, _Rp(_ArgTypes...)> _Fun;
|
|
|
|
|
|
|
|
if (__function::__not_null(__f)) {
|
|
|
|
__invoker_ = __invoker::template __create<_Fun>();
|
|
|
|
__policy_ = __policy::__create<_Fun>();
|
|
|
|
if (__use_small_storage<_Fun>()) {
|
|
|
|
::new ((void*)&__buf_.__small) _Fun(_VSTD::move(__f));
|
|
|
|
} else {
|
|
|
|
__builtin_new_allocator::__holder_t __hold =
|
|
|
|
__builtin_new_allocator::__allocate_type<_Fun>(1);
|
2020-12-12 09:30:28 +08:00
|
|
|
__buf_.__large = ::new ((void*)__hold.get()) _Fun(_VSTD::move(__f));
|
2019-06-08 09:31:19 +08:00
|
|
|
(void)__hold.release();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-11 08:14:34 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__policy_func(const __policy_func& __f)
|
|
|
|
: __buf_(__f.__buf_), __invoker_(__f.__invoker_),
|
|
|
|
__policy_(__f.__policy_)
|
|
|
|
{
|
|
|
|
if (__policy_->__clone)
|
|
|
|
__buf_.__large = __policy_->__clone(__f.__buf_.__large);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__policy_func(__policy_func&& __f)
|
|
|
|
: __buf_(__f.__buf_), __invoker_(__f.__invoker_),
|
|
|
|
__policy_(__f.__policy_)
|
|
|
|
{
|
|
|
|
if (__policy_->__destroy)
|
|
|
|
{
|
|
|
|
__f.__policy_ = __policy::__create_empty();
|
|
|
|
__f.__invoker_ = __invoker();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
~__policy_func()
|
|
|
|
{
|
|
|
|
if (__policy_->__destroy)
|
|
|
|
__policy_->__destroy(__buf_.__large);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__policy_func& operator=(__policy_func&& __f)
|
|
|
|
{
|
|
|
|
*this = nullptr;
|
|
|
|
__buf_ = __f.__buf_;
|
|
|
|
__invoker_ = __f.__invoker_;
|
|
|
|
__policy_ = __f.__policy_;
|
|
|
|
__f.__policy_ = __policy::__create_empty();
|
|
|
|
__f.__invoker_ = __invoker();
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__policy_func& operator=(nullptr_t)
|
|
|
|
{
|
|
|
|
const __policy* __p = __policy_;
|
|
|
|
__policy_ = __policy::__create_empty();
|
|
|
|
__invoker_ = __invoker();
|
|
|
|
if (__p->__destroy)
|
|
|
|
__p->__destroy(__buf_.__large);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
_Rp operator()(_ArgTypes&&... __args) const
|
|
|
|
{
|
|
|
|
return __invoker_.__call_(_VSTD::addressof(__buf_),
|
|
|
|
_VSTD::forward<_ArgTypes>(__args)...);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
void swap(__policy_func& __f)
|
|
|
|
{
|
|
|
|
_VSTD::swap(__invoker_, __f.__invoker_);
|
|
|
|
_VSTD::swap(__policy_, __f.__policy_);
|
|
|
|
_VSTD::swap(__buf_, __f.__buf_);
|
|
|
|
}
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit operator bool() const _NOEXCEPT
|
|
|
|
{
|
|
|
|
return !__policy_->__is_null;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
const std::type_info& target_type() const _NOEXCEPT
|
|
|
|
{
|
|
|
|
return *__policy_->__type_info;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename _Tp>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
|
|
|
|
{
|
|
|
|
if (__policy_->__is_null || typeid(_Tp) != *__policy_->__type_info)
|
|
|
|
return nullptr;
|
|
|
|
if (__policy_->__clone) // Out of line storage.
|
|
|
|
return reinterpret_cast<const _Tp*>(__buf_.__large);
|
|
|
|
else
|
|
|
|
return reinterpret_cast<const _Tp*>(&__buf_.__small);
|
|
|
|
}
|
|
|
|
#endif // _LIBCPP_NO_RTTI
|
|
|
|
};
|
|
|
|
|
2020-04-24 04:47:52 +08:00
|
|
|
#if defined(_LIBCPP_HAS_BLOCKS_RUNTIME) && !defined(_LIBCPP_HAS_OBJC_ARC)
|
2020-04-23 01:58:17 +08:00
|
|
|
|
2020-08-01 00:56:36 +08:00
|
|
|
extern "C" void *_Block_copy(const void *);
|
|
|
|
extern "C" void _Block_release(const void *);
|
|
|
|
|
2020-04-23 01:58:17 +08:00
|
|
|
template<class _Rp1, class ..._ArgTypes1, class _Alloc, class _Rp, class ..._ArgTypes>
|
|
|
|
class __func<_Rp1(^)(_ArgTypes1...), _Alloc, _Rp(_ArgTypes...)>
|
|
|
|
: public __base<_Rp(_ArgTypes...)>
|
|
|
|
{
|
|
|
|
typedef _Rp1(^__block_type)(_ArgTypes1...);
|
|
|
|
__block_type __f_;
|
|
|
|
|
|
|
|
public:
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __func(__block_type const& __f)
|
2020-08-01 00:56:36 +08:00
|
|
|
: __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr))
|
2020-04-23 01:58:17 +08:00
|
|
|
{ }
|
|
|
|
|
|
|
|
// [TODO] add && to save on a retain
|
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
explicit __func(__block_type __f, const _Alloc& /* unused */)
|
2020-08-01 00:56:36 +08:00
|
|
|
: __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr))
|
2020-04-23 01:58:17 +08:00
|
|
|
{ }
|
|
|
|
|
|
|
|
virtual __base<_Rp(_ArgTypes...)>* __clone() const {
|
|
|
|
_LIBCPP_ASSERT(false,
|
|
|
|
"Block pointers are just pointers, so they should always fit into "
|
|
|
|
"std::function's small buffer optimization. This function should "
|
|
|
|
"never be invoked.");
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void __clone(__base<_Rp(_ArgTypes...)>* __p) const {
|
2020-12-12 09:30:28 +08:00
|
|
|
::new ((void*)__p) __func(__f_);
|
2020-04-23 01:58:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
virtual void destroy() _NOEXCEPT {
|
|
|
|
if (__f_)
|
2020-08-01 00:56:36 +08:00
|
|
|
_Block_release(__f_);
|
2020-04-23 01:58:17 +08:00
|
|
|
__f_ = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void destroy_deallocate() _NOEXCEPT {
|
|
|
|
_LIBCPP_ASSERT(false,
|
|
|
|
"Block pointers are just pointers, so they should always fit into "
|
|
|
|
"std::function's small buffer optimization. This function should "
|
|
|
|
"never be invoked.");
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual _Rp operator()(_ArgTypes&& ... __arg) {
|
2020-12-09 05:15:01 +08:00
|
|
|
return _VSTD::__invoke(__f_, _VSTD::forward<_ArgTypes>(__arg)...);
|
2020-04-23 01:58:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
|
|
|
virtual const void* target(type_info const& __ti) const _NOEXCEPT {
|
|
|
|
if (__ti == typeid(__func::__block_type))
|
|
|
|
return &__f_;
|
|
|
|
return (const void*)nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual const std::type_info& target_type() const _NOEXCEPT {
|
|
|
|
return typeid(__func::__block_type);
|
|
|
|
}
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_NO_RTTI
|
2020-04-23 01:58:17 +08:00
|
|
|
};
|
|
|
|
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_HAS_EXTENSION_BLOCKS && !_LIBCPP_HAS_OBJC_ARC
|
2020-04-23 01:58:17 +08:00
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
} // __function
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2017-01-05 07:56:00 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>
|
2011-11-30 02:15:50 +08:00
|
|
|
: public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,
|
|
|
|
public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 08:14:34 +08:00
|
|
|
#ifndef _LIBCPP_ABI_OPTIMIZED_FUNCTION
|
2018-12-11 02:14:09 +08:00
|
|
|
typedef __function::__value_func<_Rp(_ArgTypes...)> __func;
|
2018-12-11 08:14:34 +08:00
|
|
|
#else
|
|
|
|
typedef __function::__policy_func<_Rp(_ArgTypes...)> __func;
|
|
|
|
#endif
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2018-12-11 02:14:09 +08:00
|
|
|
__func __f_;
|
2016-02-11 05:53:28 +08:00
|
|
|
|
2019-06-24 04:28:29 +08:00
|
|
|
template <class _Fp, bool = _And<
|
|
|
|
_IsNotSame<__uncvref_t<_Fp>, function>,
|
2020-05-20 08:15:28 +08:00
|
|
|
__invokable<_Fp, _ArgTypes...>
|
2017-09-11 07:41:20 +08:00
|
|
|
>::value>
|
|
|
|
struct __callable;
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Fp>
|
|
|
|
struct __callable<_Fp, true>
|
2011-06-01 05:45:26 +08:00
|
|
|
{
|
2021-01-12 05:29:17 +08:00
|
|
|
static const bool value = is_void<_Rp>::value ||
|
|
|
|
__is_core_convertible<typename __invoke_of<_Fp, _ArgTypes...>::type,
|
|
|
|
_Rp>::value;
|
2011-06-01 05:45:26 +08:00
|
|
|
};
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Fp>
|
|
|
|
struct __callable<_Fp, false>
|
2011-06-01 05:45:26 +08:00
|
|
|
{
|
|
|
|
static const bool value = false;
|
|
|
|
};
|
2017-09-11 07:41:20 +08:00
|
|
|
|
|
|
|
template <class _Fp>
|
2020-05-20 08:15:28 +08:00
|
|
|
using _EnableIfLValueCallable = typename enable_if<__callable<_Fp&>::value>::type;
|
2010-05-12 03:42:16 +08:00
|
|
|
public:
|
2011-11-30 02:15:50 +08:00
|
|
|
typedef _Rp result_type;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// construct/copy/destroy:
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2018-12-11 02:14:09 +08:00
|
|
|
function() _NOEXCEPT { }
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2018-12-11 02:14:09 +08:00
|
|
|
function(nullptr_t) _NOEXCEPT {}
|
2010-05-12 03:42:16 +08:00
|
|
|
function(const function&);
|
2011-05-29 01:59:48 +08:00
|
|
|
function(function&&) _NOEXCEPT;
|
2020-05-20 08:15:28 +08:00
|
|
|
template<class _Fp, class = _EnableIfLValueCallable<_Fp>>
|
2016-07-20 13:21:00 +08:00
|
|
|
function(_Fp);
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2016-10-14 05:06:03 +08:00
|
|
|
#if _LIBCPP_STD_VER <= 14
|
2010-08-21 03:36:46 +08:00
|
|
|
template<class _Alloc>
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2018-12-11 02:14:09 +08:00
|
|
|
function(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
|
2010-08-21 03:36:46 +08:00
|
|
|
template<class _Alloc>
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2018-12-11 02:14:09 +08:00
|
|
|
function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT {}
|
2010-08-21 03:36:46 +08:00
|
|
|
template<class _Alloc>
|
|
|
|
function(allocator_arg_t, const _Alloc&, const function&);
|
|
|
|
template<class _Alloc>
|
|
|
|
function(allocator_arg_t, const _Alloc&, function&&);
|
2020-05-20 08:15:28 +08:00
|
|
|
template<class _Fp, class _Alloc, class = _EnableIfLValueCallable<_Fp>>
|
2016-07-20 13:21:00 +08:00
|
|
|
function(allocator_arg_t, const _Alloc& __a, _Fp __f);
|
2016-10-14 05:06:03 +08:00
|
|
|
#endif
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
function& operator=(const function&);
|
2011-05-29 01:59:48 +08:00
|
|
|
function& operator=(function&&) _NOEXCEPT;
|
|
|
|
function& operator=(nullptr_t) _NOEXCEPT;
|
2020-05-20 08:15:28 +08:00
|
|
|
template<class _Fp, class = _EnableIfLValueCallable<typename decay<_Fp>::type>>
|
2017-09-11 07:41:20 +08:00
|
|
|
function& operator=(_Fp&&);
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
~function();
|
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// function modifiers:
|
2011-05-29 01:59:48 +08:00
|
|
|
void swap(function&) _NOEXCEPT;
|
2016-01-26 01:29:55 +08:00
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER <= 14
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class _Alloc>
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2011-11-30 02:15:50 +08:00
|
|
|
void assign(_Fp&& __f, const _Alloc& __a)
|
|
|
|
{function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
|
2016-01-26 01:29:55 +08:00
|
|
|
#endif
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-21 03:36:46 +08:00
|
|
|
// function capacity:
|
2010-09-22 06:55:27 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2018-12-11 02:14:09 +08:00
|
|
|
_LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
|
|
|
|
return static_cast<bool>(__f_);
|
|
|
|
}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
// deleted overloads close possible hole in the type system
|
|
|
|
template<class _R2, class... _ArgTypes2>
|
2010-09-11 23:33:21 +08:00
|
|
|
bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class _R2, class... _ArgTypes2>
|
2010-09-11 23:33:21 +08:00
|
|
|
bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;
|
2010-05-12 03:42:16 +08:00
|
|
|
public:
|
2010-08-21 03:36:46 +08:00
|
|
|
// function invocation:
|
2011-11-30 02:15:50 +08:00
|
|
|
_Rp operator()(_ArgTypes...) const;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2010-08-12 01:04:31 +08:00
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
2010-08-21 03:36:46 +08:00
|
|
|
// function target access:
|
2011-05-29 01:59:48 +08:00
|
|
|
const std::type_info& target_type() const _NOEXCEPT;
|
2011-11-30 02:15:50 +08:00
|
|
|
template <typename _Tp> _Tp* target() _NOEXCEPT;
|
|
|
|
template <typename _Tp> const _Tp* target() const _NOEXCEPT;
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_NO_RTTI
|
2010-05-12 03:42:16 +08:00
|
|
|
};
|
|
|
|
|
2019-07-19 03:50:56 +08:00
|
|
|
#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
|
|
|
|
template<class _Rp, class ..._Ap>
|
|
|
|
function(_Rp(*)(_Ap...)) -> function<_Rp(_Ap...)>;
|
|
|
|
|
|
|
|
template<class _Fp>
|
|
|
|
struct __strip_signature;
|
|
|
|
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...)> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile> { using type = _Rp(_Ap...); };
|
|
|
|
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) &> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const &> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile &> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile &> { using type = _Rp(_Ap...); };
|
|
|
|
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) & noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const & noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) volatile & noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
template<class _Rp, class _Gp, class ..._Ap>
|
|
|
|
struct __strip_signature<_Rp (_Gp::*) (_Ap...) const volatile & noexcept> { using type = _Rp(_Ap...); };
|
|
|
|
|
|
|
|
template<class _Fp, class _Stripped = typename __strip_signature<decltype(&_Fp::operator())>::type>
|
|
|
|
function(_Fp) -> function<_Stripped>;
|
|
|
|
#endif // !_LIBCPP_HAS_NO_DEDUCTION_GUIDES
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2018-12-11 02:14:09 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::function(const function& __f) : __f_(__f.__f_) {}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2016-10-14 05:06:03 +08:00
|
|
|
#if _LIBCPP_STD_VER <= 14
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2010-08-21 03:36:46 +08:00
|
|
|
template <class _Alloc>
|
2011-11-30 02:15:50 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
2018-12-11 02:14:09 +08:00
|
|
|
const function& __f) : __f_(__f.__f_) {}
|
2016-10-14 05:06:03 +08:00
|
|
|
#endif
|
2010-08-21 03:36:46 +08:00
|
|
|
|
2018-12-11 02:14:09 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2011-11-30 02:15:50 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
|
2018-12-11 02:14:09 +08:00
|
|
|
: __f_(_VSTD::move(__f.__f_)) {}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2016-10-14 05:06:03 +08:00
|
|
|
#if _LIBCPP_STD_VER <= 14
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2010-08-21 03:36:46 +08:00
|
|
|
template <class _Alloc>
|
2011-11-30 02:15:50 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
2018-12-11 02:14:09 +08:00
|
|
|
function&& __f)
|
|
|
|
: __f_(_VSTD::move(__f.__f_)) {}
|
2016-10-14 05:06:03 +08:00
|
|
|
#endif
|
2010-08-21 03:36:46 +08:00
|
|
|
|
2018-12-11 02:14:09 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2016-07-20 13:21:00 +08:00
|
|
|
template <class _Fp, class>
|
2019-06-08 09:31:19 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::function(_Fp __f) : __f_(_VSTD::move(__f)) {}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2016-10-14 05:06:03 +08:00
|
|
|
#if _LIBCPP_STD_VER <= 14
|
2018-12-11 02:14:09 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2016-07-20 13:21:00 +08:00
|
|
|
template <class _Fp, class _Alloc, class>
|
2018-12-11 02:14:09 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a,
|
|
|
|
_Fp __f)
|
|
|
|
: __f_(_VSTD::move(__f), __a) {}
|
2016-10-14 05:06:03 +08:00
|
|
|
#endif
|
2010-08-21 03:36:46 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
|
|
|
function<_Rp(_ArgTypes...)>&
|
|
|
|
function<_Rp(_ArgTypes...)>::operator=(const function& __f)
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
function(__f).swap(*this);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
|
|
|
function<_Rp(_ArgTypes...)>&
|
|
|
|
function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-28 00:02:06 +08:00
|
|
|
__f_ = _VSTD::move(__f.__f_);
|
2012-10-13 10:03:45 +08:00
|
|
|
return *this;
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
|
|
|
function<_Rp(_ArgTypes...)>&
|
|
|
|
function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
__f_ = nullptr;
|
2012-10-13 10:03:45 +08:00
|
|
|
return *this;
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2017-09-11 07:41:20 +08:00
|
|
|
template <class _Fp, class>
|
|
|
|
function<_Rp(_ArgTypes...)>&
|
2011-11-30 02:15:50 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-11-30 02:15:50 +08:00
|
|
|
function(_VSTD::forward<_Fp>(__f)).swap(*this);
|
2010-05-12 03:42:16 +08:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2018-12-11 02:14:09 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::~function() {}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
void
|
2011-11-30 02:15:50 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
__f_.swap(__f.__f_);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
|
|
|
_Rp
|
|
|
|
function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2010-08-12 01:04:31 +08:00
|
|
|
#ifndef _LIBCPP_NO_RTTI
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
const std::type_info&
|
2011-11-30 02:15:50 +08:00
|
|
|
function<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
return __f_.target_type();
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
|
|
|
template <typename _Tp>
|
|
|
|
_Tp*
|
|
|
|
function<_Rp(_ArgTypes...)>::target() _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
return (_Tp*)(__f_.template target<_Tp>());
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class ..._ArgTypes>
|
|
|
|
template <typename _Tp>
|
|
|
|
const _Tp*
|
|
|
|
function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2018-12-11 02:14:09 +08:00
|
|
|
return __f_.template target<_Tp>();
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_NO_RTTI
|
2010-08-12 01:04:31 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
2011-11-30 02:15:50 +08:00
|
|
|
operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
2011-11-30 02:15:50 +08:00
|
|
|
operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
2011-11-30 02:15:50 +08:00
|
|
|
operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
2011-11-30 02:15:50 +08:00
|
|
|
operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Rp, class... _ArgTypes>
|
2010-05-12 03:42:16 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
void
|
2011-11-30 02:15:50 +08:00
|
|
|
swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
|
2010-05-12 03:42:16 +08:00
|
|
|
{return __x.swap(__y);}
|
|
|
|
|
2017-04-19 09:28:47 +08:00
|
|
|
#else // _LIBCPP_CXX03_LANG
|
2015-07-23 06:43:27 +08:00
|
|
|
|
|
|
|
#include <__functional_03>
|
|
|
|
|
|
|
|
#endif
|
2015-07-22 12:14:38 +08:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// BIND
|
|
|
|
//==============================================================================
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class _Tp> struct __is_bind_expression : public false_type {};
|
2017-01-05 07:56:00 +08:00
|
|
|
template<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_bind_expression
|
2010-05-12 03:42:16 +08:00
|
|
|
: public __is_bind_expression<typename remove_cv<_Tp>::type> {};
|
|
|
|
|
2016-09-22 08:23:15 +08:00
|
|
|
#if _LIBCPP_STD_VER > 14
|
|
|
|
template <class _Tp>
|
2018-01-03 01:17:01 +08:00
|
|
|
_LIBCPP_INLINE_VAR constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value;
|
2016-09-22 08:23:15 +08:00
|
|
|
#endif
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
|
2017-01-05 07:56:00 +08:00
|
|
|
template<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_placeholder
|
2010-05-12 03:42:16 +08:00
|
|
|
: public __is_placeholder<typename remove_cv<_Tp>::type> {};
|
|
|
|
|
2016-09-22 08:23:15 +08:00
|
|
|
#if _LIBCPP_STD_VER > 14
|
|
|
|
template <class _Tp>
|
2018-01-03 01:17:01 +08:00
|
|
|
_LIBCPP_INLINE_VAR constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value;
|
2016-09-22 08:23:15 +08:00
|
|
|
#endif
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
namespace placeholders
|
|
|
|
{
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <int _Np> struct __ph {};
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2018-08-01 10:08:59 +08:00
|
|
|
#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
|
2016-06-27 05:01:34 +08:00
|
|
|
_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
|
2018-01-03 03:01:45 +08:00
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<1> _1{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<2> _2{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<3> _3{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<4> _4{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<5> _5{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<6> _6{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<7> _7{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<8> _8{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<9> _9{};
|
|
|
|
/* _LIBCPP_INLINE_VAR */ constexpr __ph<10> _10{};
|
2018-08-01 10:08:59 +08:00
|
|
|
#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
} // placeholders
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<int _Np>
|
|
|
|
struct __is_placeholder<placeholders::__ph<_Np> >
|
|
|
|
: public integral_constant<int, _Np> {};
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2015-07-22 12:14:38 +08:00
|
|
|
|
2017-04-19 09:28:47 +08:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2015-07-22 12:14:38 +08:00
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
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
|
2011-05-20 03:41:47 +08:00
|
|
|
typename __invoke_of<_Ti&, _Uj...>::type
|
|
|
|
__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>)
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2014-06-24 08:46:19 +08:00
|
|
|
return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Ti, class ..._Uj>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2019-06-24 04:28:29 +08:00
|
|
|
typename _EnableIf
|
2010-05-12 03:42:16 +08:00
|
|
|
<
|
|
|
|
is_bind_expression<_Ti>::value,
|
2014-12-23 13:54:34 +08:00
|
|
|
__invoke_of<_Ti&, _Uj...>
|
2010-05-12 03:42:16 +08:00
|
|
|
>::type
|
|
|
|
__mu(_Ti& __ti, tuple<_Uj...>& __uj)
|
|
|
|
{
|
|
|
|
typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
|
2020-12-16 08:32:29 +08:00
|
|
|
return _VSTD::__mu_expand(__ti, __uj, __indices());
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2014-06-24 08:46:19 +08:00
|
|
|
return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj));
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2011-12-02 04:21:04 +08:00
|
|
|
__mu(_Ti& __ti, _Uj&)
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
return __ti;
|
|
|
|
}
|
|
|
|
|
2011-05-22 23:07:43 +08:00
|
|
|
template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
|
|
|
|
class _TupleUj>
|
2018-09-24 00:44:50 +08:00
|
|
|
struct __mu_return_impl;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2013-07-01 03:48:15 +08:00
|
|
|
template <bool _Invokable, class _Ti, class ..._Uj>
|
2018-09-24 00:44:50 +08:00
|
|
|
struct __mu_return_invokable // false
|
2013-07-01 03:48:15 +08:00
|
|
|
{
|
|
|
|
typedef __nat type;
|
|
|
|
};
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Ti, class ..._Uj>
|
2018-09-24 00:44:50 +08:00
|
|
|
struct __mu_return_invokable<true, _Ti, _Uj...>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-05-20 03:41:47 +08:00
|
|
|
typedef typename __invoke_of<_Ti&, _Uj...>::type type;
|
2010-05-12 03:42:16 +08:00
|
|
|
};
|
|
|
|
|
2013-07-01 03:48:15 +08:00
|
|
|
template <class _Ti, class ..._Uj>
|
2018-09-24 00:44:50 +08:00
|
|
|
struct __mu_return_impl<_Ti, false, true, false, tuple<_Uj...> >
|
|
|
|
: public __mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
|
2013-07-01 03:48:15 +08:00
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
template <class _Ti, class _TupleUj>
|
2018-09-24 00:44:50 +08:00
|
|
|
struct __mu_return_impl<_Ti, false, false, true, _TupleUj>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
typedef typename tuple_element<is_placeholder<_Ti>::value - 1,
|
|
|
|
_TupleUj>::type&& type;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Ti, class _TupleUj>
|
2018-09-24 00:44:50 +08:00
|
|
|
struct __mu_return_impl<_Ti, true, false, false, _TupleUj>
|
2011-05-22 23:07:43 +08:00
|
|
|
{
|
|
|
|
typedef typename _Ti::type& type;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Ti, class _TupleUj>
|
2018-09-24 00:44:50 +08:00
|
|
|
struct __mu_return_impl<_Ti, false, false, false, _TupleUj>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
typedef _Ti& type;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Ti, class _TupleUj>
|
|
|
|
struct __mu_return
|
2018-09-24 00:44:50 +08:00
|
|
|
: public __mu_return_impl<_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>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Fp, class _BoundArgs, class _TupleUj>
|
2015-05-20 06:27:18 +08:00
|
|
|
struct __is_valid_bind_return
|
2013-02-22 02:16:55 +08:00
|
|
|
{
|
|
|
|
static const bool value = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Fp, class ..._BoundArgs, class _TupleUj>
|
2015-05-20 06:27:18 +08:00
|
|
|
struct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj>
|
2013-02-22 02:16:55 +08:00
|
|
|
{
|
|
|
|
static const bool value = __invokable<_Fp,
|
|
|
|
typename __mu_return<_BoundArgs, _TupleUj>::type...>::value;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Fp, class ..._BoundArgs, class _TupleUj>
|
2015-05-20 06:27:18 +08:00
|
|
|
struct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj>
|
2013-02-22 02:16:55 +08:00
|
|
|
{
|
|
|
|
static const bool value = __invokable<_Fp,
|
|
|
|
typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Fp, class _BoundArgs, class _TupleUj,
|
2015-05-20 06:27:18 +08:00
|
|
|
bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
|
2010-05-12 03:42:16 +08:00
|
|
|
struct __bind_return;
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Fp, class ..._BoundArgs, class _TupleUj>
|
2013-02-22 02:16:55 +08:00
|
|
|
struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-05-20 03:41:47 +08:00
|
|
|
typedef typename __invoke_of
|
2010-05-12 03:42:16 +08:00
|
|
|
<
|
2011-11-30 02:15:50 +08:00
|
|
|
_Fp&,
|
2010-05-12 03:42:16 +08:00
|
|
|
typename __mu_return
|
|
|
|
<
|
|
|
|
_BoundArgs,
|
|
|
|
_TupleUj
|
|
|
|
>::type...
|
|
|
|
>::type type;
|
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Fp, class ..._BoundArgs, class _TupleUj>
|
2013-02-22 02:16:55 +08:00
|
|
|
struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-05-20 03:41:47 +08:00
|
|
|
typedef typename __invoke_of
|
2010-05-12 03:42:16 +08:00
|
|
|
<
|
2011-11-30 02:15:50 +08:00
|
|
|
_Fp&,
|
2010-05-12 03:42:16 +08:00
|
|
|
typename __mu_return
|
|
|
|
<
|
|
|
|
const _BoundArgs,
|
|
|
|
_TupleUj
|
|
|
|
>::type...
|
|
|
|
>::type type;
|
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args>
|
2010-05-12 03:42:16 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2011-11-30 02:15:50 +08:00
|
|
|
typename __bind_return<_Fp, _BoundArgs, _Args>::type
|
|
|
|
__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
|
2010-05-12 03:42:16 +08:00
|
|
|
_Args&& __args)
|
|
|
|
{
|
2017-05-04 05:02:19 +08:00
|
|
|
return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class ..._BoundArgs>
|
2010-05-12 03:42:16 +08:00
|
|
|
class __bind
|
2011-11-30 02:15:50 +08:00
|
|
|
: public __weak_result_type<typename decay<_Fp>::type>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2013-02-22 02:16:55 +08:00
|
|
|
protected:
|
2011-11-30 02:15:50 +08:00
|
|
|
typedef typename decay<_Fp>::type _Fd;
|
2011-05-20 03:41:47 +08:00
|
|
|
typedef tuple<typename decay<_BoundArgs>::type...> _Td;
|
2013-02-22 02:16:55 +08:00
|
|
|
private:
|
2011-05-20 03:41:47 +08:00
|
|
|
_Fd __f_;
|
|
|
|
_Td __bound_args_;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
|
|
|
|
public:
|
2012-05-05 01:21:02 +08:00
|
|
|
template <class _Gp, class ..._BA,
|
|
|
|
class = typename enable_if
|
|
|
|
<
|
2013-07-01 08:01:51 +08:00
|
|
|
is_constructible<_Fd, _Gp>::value &&
|
|
|
|
!is_same<typename remove_reference<_Gp>::type,
|
|
|
|
__bind>::value
|
2012-05-05 01:21:02 +08:00
|
|
|
>::type>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2011-11-30 02:15:50 +08:00
|
|
|
explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
|
|
|
|
: __f_(_VSTD::forward<_Gp>(__f)),
|
2011-07-01 05:18:19 +08:00
|
|
|
__bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class ..._Args>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2011-05-20 03:41:47 +08:00
|
|
|
typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
|
2010-05-12 03:42:16 +08:00
|
|
|
operator()(_Args&& ...__args)
|
|
|
|
{
|
2017-05-04 05:02:19 +08:00
|
|
|
return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
|
2011-07-01 05:18:19 +08:00
|
|
|
tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class ..._Args>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2013-02-22 02:16:55 +08:00
|
|
|
typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
|
2010-05-12 03:42:16 +08:00
|
|
|
operator()(_Args&& ...__args) const
|
|
|
|
{
|
2017-05-04 05:02:19 +08:00
|
|
|
return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
|
2011-07-01 05:18:19 +08:00
|
|
|
tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class ..._BoundArgs>
|
|
|
|
struct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {};
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class _Fp, class ..._BoundArgs>
|
2010-05-12 03:42:16 +08:00
|
|
|
class __bind_r
|
2011-11-30 02:15:50 +08:00
|
|
|
: public __bind<_Fp, _BoundArgs...>
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-11-30 02:15:50 +08:00
|
|
|
typedef __bind<_Fp, _BoundArgs...> base;
|
2013-02-22 02:16:55 +08:00
|
|
|
typedef typename base::_Fd _Fd;
|
|
|
|
typedef typename base::_Td _Td;
|
2010-05-12 03:42:16 +08:00
|
|
|
public:
|
2011-11-30 02:15:50 +08:00
|
|
|
typedef _Rp result_type;
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-07-03 02:22:36 +08:00
|
|
|
|
2013-07-01 08:01:51 +08:00
|
|
|
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>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2011-11-30 02:15:50 +08:00
|
|
|
explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
|
|
|
|
: base(_VSTD::forward<_Gp>(__f),
|
2011-07-01 05:18:19 +08:00
|
|
|
_VSTD::forward<_BA>(__bound_args)...) {}
|
2010-05-12 03:42:16 +08:00
|
|
|
|
|
|
|
template <class ..._Args>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2013-02-22 02:16:55 +08:00
|
|
|
typename enable_if
|
|
|
|
<
|
|
|
|
is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
|
2015-07-11 07:29:18 +08:00
|
|
|
result_type>::value || is_void<_Rp>::value,
|
2013-02-22 02:16:55 +08:00
|
|
|
result_type
|
|
|
|
>::type
|
2010-05-12 03:42:16 +08:00
|
|
|
operator()(_Args&& ...__args)
|
|
|
|
{
|
2015-07-11 07:29:18 +08:00
|
|
|
typedef __invoke_void_return_wrapper<_Rp> _Invoker;
|
|
|
|
return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class ..._Args>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2013-02-22 02:16:55 +08:00
|
|
|
typename enable_if
|
|
|
|
<
|
|
|
|
is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
|
2015-07-11 07:29:18 +08:00
|
|
|
result_type>::value || is_void<_Rp>::value,
|
2013-02-22 02:16:55 +08:00
|
|
|
result_type
|
|
|
|
>::type
|
2010-05-12 03:42:16 +08:00
|
|
|
operator()(_Args&& ...__args) const
|
|
|
|
{
|
2015-07-11 07:29:18 +08:00
|
|
|
typedef __invoke_void_return_wrapper<_Rp> _Invoker;
|
|
|
|
return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class _Fp, class ..._BoundArgs>
|
|
|
|
struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Fp, class ..._BoundArgs>
|
2020-12-26 03:48:39 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2011-11-30 02:15:50 +08:00
|
|
|
__bind<_Fp, _BoundArgs...>
|
|
|
|
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-11-30 02:15:50 +08:00
|
|
|
typedef __bind<_Fp, _BoundArgs...> type;
|
|
|
|
return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2011-11-30 02:15:50 +08:00
|
|
|
template<class _Rp, class _Fp, class ..._BoundArgs>
|
2020-12-26 03:48:39 +08:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2011-11-30 02:15:50 +08:00
|
|
|
__bind_r<_Rp, _Fp, _BoundArgs...>
|
|
|
|
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
|
2010-05-12 03:42:16 +08:00
|
|
|
{
|
2011-11-30 02:15:50 +08:00
|
|
|
typedef __bind_r<_Rp, _Fp, _BoundArgs...> type;
|
|
|
|
return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
|
2010-05-12 03:42:16 +08:00
|
|
|
}
|
|
|
|
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2015-07-15 04:16:15 +08:00
|
|
|
#if _LIBCPP_STD_VER > 14
|
2016-06-02 09:25:41 +08:00
|
|
|
|
2021-03-03 08:17:22 +08:00
|
|
|
template<class _Op, class _Tuple,
|
|
|
|
class _Idxs = typename __make_tuple_indices<tuple_size<_Tuple>::value>::type>
|
|
|
|
struct __perfect_forward_impl;
|
|
|
|
|
|
|
|
template<class _Op, class... _Bound, size_t... _Idxs>
|
|
|
|
struct __perfect_forward_impl<_Op, __tuple_types<_Bound...>, __tuple_indices<_Idxs...>>
|
|
|
|
{
|
|
|
|
tuple<_Bound...> __bound_;
|
|
|
|
|
|
|
|
template<class... _Args>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) &
|
|
|
|
noexcept(noexcept(_Op::__call(_VSTD::get<_Idxs>(__bound_)..., _VSTD::forward<_Args>(__args)...)))
|
|
|
|
-> decltype( _Op::__call(_VSTD::get<_Idxs>(__bound_)..., _VSTD::forward<_Args>(__args)...))
|
|
|
|
{return _Op::__call(_VSTD::get<_Idxs>(__bound_)..., _VSTD::forward<_Args>(__args)...);}
|
|
|
|
|
|
|
|
template<class... _Args>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) const&
|
|
|
|
noexcept(noexcept(_Op::__call(_VSTD::get<_Idxs>(__bound_)..., _VSTD::forward<_Args>(__args)...)))
|
|
|
|
-> decltype( _Op::__call(_VSTD::get<_Idxs>(__bound_)..., _VSTD::forward<_Args>(__args)...))
|
|
|
|
{return _Op::__call(_VSTD::get<_Idxs>(__bound_)..., _VSTD::forward<_Args>(__args)...);}
|
|
|
|
|
|
|
|
template<class... _Args>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) &&
|
|
|
|
noexcept(noexcept(_Op::__call(_VSTD::get<_Idxs>(_VSTD::move(__bound_))...,
|
|
|
|
_VSTD::forward<_Args>(__args)...)))
|
|
|
|
-> decltype( _Op::__call(_VSTD::get<_Idxs>(_VSTD::move(__bound_))...,
|
|
|
|
_VSTD::forward<_Args>(__args)...))
|
|
|
|
{return _Op::__call(_VSTD::get<_Idxs>(_VSTD::move(__bound_))...,
|
|
|
|
_VSTD::forward<_Args>(__args)...);}
|
|
|
|
|
|
|
|
template<class... _Args>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) const&&
|
|
|
|
noexcept(noexcept(_Op::__call(_VSTD::get<_Idxs>(_VSTD::move(__bound_))...,
|
|
|
|
_VSTD::forward<_Args>(__args)...)))
|
|
|
|
-> decltype( _Op::__call(_VSTD::get<_Idxs>(_VSTD::move(__bound_))...,
|
|
|
|
_VSTD::forward<_Args>(__args)...))
|
|
|
|
{return _Op::__call(_VSTD::get<_Idxs>(_VSTD::move(__bound_))...,
|
|
|
|
_VSTD::forward<_Args>(__args)...);}
|
|
|
|
|
|
|
|
template<class _Fn = typename tuple_element<0, tuple<_Bound...>>::type,
|
|
|
|
class = _EnableIf<is_copy_constructible_v<_Fn>>>
|
|
|
|
constexpr __perfect_forward_impl(__perfect_forward_impl const& __other)
|
|
|
|
: __bound_(__other.__bound_) {}
|
|
|
|
|
|
|
|
template<class _Fn = typename tuple_element<0, tuple<_Bound...>>::type,
|
|
|
|
class = _EnableIf<is_move_constructible_v<_Fn>>>
|
|
|
|
constexpr __perfect_forward_impl(__perfect_forward_impl && __other)
|
|
|
|
: __bound_(_VSTD::move(__other.__bound_)) {}
|
|
|
|
|
|
|
|
template<class... _BoundArgs>
|
|
|
|
explicit constexpr __perfect_forward_impl(_BoundArgs&&... __bound) :
|
|
|
|
__bound_(_VSTD::forward<_BoundArgs>(__bound)...) { }
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class _Op, class... _Args>
|
|
|
|
using __perfect_forward =
|
|
|
|
__perfect_forward_impl<_Op, __tuple_types<decay_t<_Args>...>>;
|
|
|
|
|
|
|
|
struct __not_fn_op
|
|
|
|
{
|
|
|
|
template<class... _Args>
|
|
|
|
static _LIBCPP_CONSTEXPR_AFTER_CXX17 auto __call(_Args&&... __args)
|
|
|
|
noexcept(noexcept(!_VSTD::invoke(_VSTD::forward<_Args>(__args)...)))
|
|
|
|
-> decltype( !_VSTD::invoke(_VSTD::forward<_Args>(__args)...))
|
|
|
|
{ return !_VSTD::invoke(_VSTD::forward<_Args>(__args)...); }
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class _Fn,
|
|
|
|
class = _EnableIf<is_constructible_v<decay_t<_Fn>, _Fn> &&
|
|
|
|
is_move_constructible_v<_Fn>>>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto not_fn(_Fn&& __f)
|
|
|
|
{
|
|
|
|
return __perfect_forward<__not_fn_op, _Fn>(_VSTD::forward<_Fn>(__f));
|
|
|
|
}
|
2016-06-02 09:25:41 +08:00
|
|
|
|
2021-03-03 08:17:22 +08:00
|
|
|
#endif // _LIBCPP_STD_VER > 14
|
2016-06-27 08:40:41 +08:00
|
|
|
|
2021-03-03 08:17:22 +08:00
|
|
|
#if _LIBCPP_STD_VER > 17
|
2016-06-02 09:25:41 +08:00
|
|
|
|
2021-03-03 08:17:22 +08:00
|
|
|
struct __bind_front_op
|
|
|
|
{
|
|
|
|
template<class... _Args>
|
|
|
|
constexpr static auto __call(_Args&&... __args)
|
|
|
|
noexcept(noexcept(_VSTD::invoke(_VSTD::forward<_Args>(__args)...)))
|
|
|
|
-> decltype( _VSTD::invoke(_VSTD::forward<_Args>(__args)...))
|
|
|
|
{ return _VSTD::invoke(_VSTD::forward<_Args>(__args)...); }
|
2016-06-02 09:25:41 +08:00
|
|
|
};
|
|
|
|
|
2021-03-03 08:17:22 +08:00
|
|
|
template<class _Fn, class... _Args,
|
|
|
|
class = _EnableIf<conjunction<is_constructible<decay_t<_Fn>, _Fn>,
|
|
|
|
is_move_constructible<decay_t<_Fn>>,
|
|
|
|
is_constructible<decay_t<_Args>, _Args>...,
|
|
|
|
is_move_constructible<decay_t<_Args>>...
|
|
|
|
>::value>>
|
|
|
|
constexpr auto bind_front(_Fn&& __f, _Args&&... __args)
|
|
|
|
{
|
|
|
|
return __perfect_forward<__bind_front_op, _Fn, _Args...>(_VSTD::forward<_Fn>(__f),
|
|
|
|
_VSTD::forward<_Args>(__args)...);
|
2016-06-02 09:25:41 +08:00
|
|
|
}
|
|
|
|
|
2021-03-03 08:17:22 +08:00
|
|
|
#endif // _LIBCPP_STD_VER > 17
|
2015-07-15 04:16:15 +08:00
|
|
|
|
2010-06-04 00:42:57 +08:00
|
|
|
// struct hash<T*> in <memory>
|
2010-05-12 03:42:16 +08:00
|
|
|
|
2018-01-09 03:18:00 +08:00
|
|
|
template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
|
2018-01-16 23:48:27 +08:00
|
|
|
pair<_ForwardIterator1, _ForwardIterator1> _LIBCPP_CONSTEXPR_AFTER_CXX11
|
2018-01-09 03:18:00 +08:00
|
|
|
__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
|
|
|
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
|
|
|
|
forward_iterator_tag, forward_iterator_tag)
|
|
|
|
{
|
|
|
|
if (__first2 == __last2)
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__first1, __first1); // Everything matches an empty sequence
|
2018-01-09 03:18:00 +08:00
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
// Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
if (__first1 == __last1) // return __last1 if no element matches *__first2
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__last1, __last1);
|
2018-01-09 03:18:00 +08:00
|
|
|
if (__pred(*__first1, *__first2))
|
|
|
|
break;
|
|
|
|
++__first1;
|
|
|
|
}
|
|
|
|
// *__first1 matches *__first2, now match elements after here
|
|
|
|
_ForwardIterator1 __m1 = __first1;
|
|
|
|
_ForwardIterator2 __m2 = __first2;
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__first1, __m1);
|
2018-01-09 03:18:00 +08:00
|
|
|
if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__last1, __last1);
|
2018-01-09 03:18:00 +08:00
|
|
|
if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
|
|
|
|
{
|
|
|
|
++__first1;
|
|
|
|
break;
|
|
|
|
} // else there is a match, check next elements
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
|
|
pair<_RandomAccessIterator1, _RandomAccessIterator1>
|
|
|
|
__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
|
|
|
_RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
|
|
|
|
random_access_iterator_tag, random_access_iterator_tag)
|
|
|
|
{
|
|
|
|
typedef typename iterator_traits<_RandomAccessIterator1>::difference_type _D1;
|
|
|
|
typedef typename iterator_traits<_RandomAccessIterator2>::difference_type _D2;
|
|
|
|
// Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
|
|
|
|
const _D2 __len2 = __last2 - __first2;
|
|
|
|
if (__len2 == 0)
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__first1, __first1);
|
2018-01-09 03:18:00 +08:00
|
|
|
const _D1 __len1 = __last1 - __first1;
|
|
|
|
if (__len1 < __len2)
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__last1, __last1);
|
2018-01-09 03:18:00 +08:00
|
|
|
const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
if (__first1 == __s)
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__last1, __last1);
|
2018-01-09 03:18:00 +08:00
|
|
|
if (__pred(*__first1, *__first2))
|
|
|
|
break;
|
|
|
|
++__first1;
|
|
|
|
}
|
|
|
|
|
|
|
|
_RandomAccessIterator1 __m1 = __first1;
|
|
|
|
_RandomAccessIterator2 __m2 = __first2;
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
if (++__m2 == __last2)
|
2020-05-07 23:54:25 +08:00
|
|
|
return _VSTD::make_pair(__first1, __first1 + __len2);
|
2018-01-09 03:18:00 +08:00
|
|
|
++__m1; // no need to check range on __m1 because __s guarantees we have enough source
|
|
|
|
if (!__pred(*__m1, *__m2))
|
|
|
|
{
|
|
|
|
++__first1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 14
|
|
|
|
|
|
|
|
// default searcher
|
|
|
|
template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
|
2021-04-06 15:55:33 +08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS default_searcher {
|
2018-01-09 03:18:00 +08:00
|
|
|
public:
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2018-08-04 06:36:53 +08:00
|
|
|
default_searcher(_ForwardIterator __f, _ForwardIterator __l,
|
2018-01-09 03:18:00 +08:00
|
|
|
_BinaryPredicate __p = _BinaryPredicate())
|
|
|
|
: __first_(__f), __last_(__l), __pred_(__p) {}
|
|
|
|
|
|
|
|
template <typename _ForwardIterator2>
|
2020-12-26 03:48:39 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
2018-01-09 03:18:00 +08:00
|
|
|
pair<_ForwardIterator2, _ForwardIterator2>
|
|
|
|
operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
|
|
|
|
{
|
|
|
|
return _VSTD::__search(__f, __l, __first_, __last_, __pred_,
|
|
|
|
typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category(),
|
|
|
|
typename _VSTD::iterator_traits<_ForwardIterator2>::iterator_category());
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
_ForwardIterator __first_;
|
|
|
|
_ForwardIterator __last_;
|
|
|
|
_BinaryPredicate __pred_;
|
2019-08-04 15:13:43 +08:00
|
|
|
};
|
2018-01-09 03:18:00 +08:00
|
|
|
|
|
|
|
#endif // _LIBCPP_STD_VER > 14
|
|
|
|
|
2018-12-03 22:03:27 +08:00
|
|
|
#if _LIBCPP_STD_VER > 17
|
|
|
|
template <class _Tp>
|
|
|
|
using unwrap_reference_t = typename unwrap_reference<_Tp>::type;
|
|
|
|
|
|
|
|
template <class _Tp>
|
|
|
|
using unwrap_ref_decay_t = typename unwrap_ref_decay<_Tp>::type;
|
|
|
|
#endif // > C++17
|
|
|
|
|
2021-03-19 01:21:35 +08:00
|
|
|
#if _LIBCPP_STD_VER > 17
|
|
|
|
// [func.identity]
|
|
|
|
struct identity {
|
|
|
|
template<class _Tp>
|
2021-04-06 02:56:03 +08:00
|
|
|
_LIBCPP_NODISCARD_EXT constexpr _Tp&& operator()(_Tp&& __t) const noexcept
|
2021-03-19 01:21:35 +08:00
|
|
|
{
|
|
|
|
return _VSTD::forward<_Tp>(__t);
|
|
|
|
}
|
|
|
|
|
|
|
|
using is_transparent = void;
|
|
|
|
};
|
|
|
|
#endif // _LIBCPP_STD_VER > 17
|
|
|
|
|
2010-05-12 03:42:16 +08:00
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
|
2021-04-21 00:03:32 +08:00
|
|
|
#endif // _LIBCPP_FUNCTIONAL
|