PR 70564 disambiguate constructors for not_fn call wrapper
PR libstdc++/70564 * include/experimental/functional (_Not_fn): Remove. (not_fn): Use std::_Not_fn. * include/std/functional (_Not_fn): Add second parameter to disambiguate copying from initialization by not_fn. Define for C++14. (not_fn): Add second argument to initialization. * testsuite/20_util/not_fn/1.cc: Copy call wrapper using direct-initialization. From-SVN: r240778
This commit is contained in:
parent
496326bcc1
commit
78ec9c15be
@ -1,3 +1,14 @@
|
|||||||
|
2016-10-05 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
PR libstdc++/70564
|
||||||
|
* include/experimental/functional (_Not_fn): Remove.
|
||||||
|
(not_fn): Use std::_Not_fn.
|
||||||
|
* include/std/functional (_Not_fn): Add second parameter to
|
||||||
|
disambiguate copying from initialization by not_fn. Define for C++14.
|
||||||
|
(not_fn): Add second argument to initialization.
|
||||||
|
* testsuite/20_util/not_fn/1.cc: Copy call wrapper using
|
||||||
|
direct-initialization.
|
||||||
|
|
||||||
2016-10-03 François Dumont <fdumont@gcc.gnu.org>
|
2016-10-03 François Dumont <fdumont@gcc.gnu.org>
|
||||||
|
|
||||||
* src/c++11/shared_ptr.cc (mask, invalid, get_mutex): Move
|
* src/c++11/shared_ptr.cc (mask, invalid, get_mutex): Move
|
||||||
|
@ -378,64 +378,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||||||
|
|
||||||
#define __cpp_lib_experimental_not_fn 201406
|
#define __cpp_lib_experimental_not_fn 201406
|
||||||
|
|
||||||
/// Generalized negator.
|
|
||||||
template<typename _Fn>
|
|
||||||
class _Not_fn
|
|
||||||
{
|
|
||||||
_Fn _M_fn;
|
|
||||||
|
|
||||||
public:
|
|
||||||
template<typename _Fn2>
|
|
||||||
explicit
|
|
||||||
_Not_fn(_Fn2&& __fn)
|
|
||||||
: _M_fn(std::forward<_Fn2>(__fn)) { }
|
|
||||||
|
|
||||||
_Not_fn(const _Not_fn& __fn) = default;
|
|
||||||
_Not_fn(_Not_fn&& __fn) = default;
|
|
||||||
~_Not_fn() = default;
|
|
||||||
|
|
||||||
template<typename... _Args>
|
|
||||||
auto
|
|
||||||
operator()(_Args&&... __args) &
|
|
||||||
noexcept(__is_nothrow_callable<_Fn&(_Args&&...)>::value)
|
|
||||||
-> decltype(!std::declval<result_of_t<_Fn&(_Args&&...)>>())
|
|
||||||
{ return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); }
|
|
||||||
|
|
||||||
template<typename... _Args>
|
|
||||||
auto
|
|
||||||
operator()(_Args&&... __args) const &
|
|
||||||
noexcept(__is_nothrow_callable<const _Fn&(_Args&&...)>::value)
|
|
||||||
-> decltype(!std::declval<result_of_t<const _Fn&(_Args&&...)>>())
|
|
||||||
{ return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); }
|
|
||||||
|
|
||||||
template<typename... _Args>
|
|
||||||
auto
|
|
||||||
operator()(_Args&&... __args) &&
|
|
||||||
noexcept(__is_nothrow_callable<_Fn&&(_Args&&...)>::value)
|
|
||||||
-> decltype(!std::declval<result_of_t<_Fn&&(_Args&&...)>>())
|
|
||||||
{
|
|
||||||
return !std::__invoke(std::move(_M_fn),
|
|
||||||
std::forward<_Args>(__args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename... _Args>
|
|
||||||
auto
|
|
||||||
operator()(_Args&&... __args) const &&
|
|
||||||
noexcept(__is_nothrow_callable<const _Fn&&(_Args&&...)>::value)
|
|
||||||
-> decltype(!std::declval<result_of_t<const _Fn&&(_Args&&...)>>())
|
|
||||||
{
|
|
||||||
return !std::__invoke(std::move(_M_fn),
|
|
||||||
std::forward<_Args>(__args)...);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// [func.not_fn] Function template not_fn
|
/// [func.not_fn] Function template not_fn
|
||||||
template<typename _Fn>
|
template<typename _Fn>
|
||||||
inline auto
|
inline auto
|
||||||
not_fn(_Fn&& __fn)
|
not_fn(_Fn&& __fn)
|
||||||
noexcept(std::is_nothrow_constructible<std::decay_t<_Fn>, _Fn&&>::value)
|
noexcept(std::is_nothrow_constructible<std::decay_t<_Fn>, _Fn&&>::value)
|
||||||
{
|
{
|
||||||
return _Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn)};
|
return std::_Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn), 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
_GLIBCXX_END_NAMESPACE_VERSION
|
_GLIBCXX_END_NAMESPACE_VERSION
|
||||||
|
@ -2139,19 +2139,14 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
|
|||||||
swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y) noexcept
|
swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y) noexcept
|
||||||
{ __x.swap(__y); }
|
{ __x.swap(__y); }
|
||||||
|
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
#if __cplusplus > 201402L
|
/// Generalized negator.
|
||||||
|
|
||||||
#define __cpp_lib_not_fn 201603
|
|
||||||
|
|
||||||
/// Generalized negator.
|
|
||||||
template<typename _Fn>
|
template<typename _Fn>
|
||||||
class _Not_fn
|
class _Not_fn
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
template<typename _Fn2>
|
template<typename _Fn2>
|
||||||
explicit
|
_Not_fn(_Fn2&& __fn, int)
|
||||||
_Not_fn(_Fn2&& __fn)
|
|
||||||
: _M_fn(std::forward<_Fn2>(__fn)) { }
|
: _M_fn(std::forward<_Fn2>(__fn)) { }
|
||||||
|
|
||||||
_Not_fn(const _Not_fn& __fn) = default;
|
_Not_fn(const _Not_fn& __fn) = default;
|
||||||
@ -2161,21 +2156,21 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
|
|||||||
template<typename... _Args>
|
template<typename... _Args>
|
||||||
auto
|
auto
|
||||||
operator()(_Args&&... __args) &
|
operator()(_Args&&... __args) &
|
||||||
noexcept(is_nothrow_callable_v<_Fn&(_Args&&...)>)
|
noexcept(__is_nothrow_callable<_Fn&(_Args&&...)>::value)
|
||||||
-> decltype(!std::declval<result_of_t<_Fn&(_Args&&...)>>())
|
-> decltype(!std::declval<result_of_t<_Fn&(_Args&&...)>>())
|
||||||
{ return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); }
|
{ return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); }
|
||||||
|
|
||||||
template<typename... _Args>
|
template<typename... _Args>
|
||||||
auto
|
auto
|
||||||
operator()(_Args&&... __args) const &
|
operator()(_Args&&... __args) const &
|
||||||
noexcept(is_nothrow_callable_v<const _Fn&(_Args&&...)>)
|
noexcept(__is_nothrow_callable<const _Fn&(_Args&&...)>::value)
|
||||||
-> decltype(!std::declval<result_of_t<const _Fn&(_Args&&...)>>())
|
-> decltype(!std::declval<result_of_t<const _Fn&(_Args&&...)>>())
|
||||||
{ return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); }
|
{ return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); }
|
||||||
|
|
||||||
template<typename... _Args>
|
template<typename... _Args>
|
||||||
auto
|
auto
|
||||||
operator()(_Args&&... __args) &&
|
operator()(_Args&&... __args) &&
|
||||||
noexcept(is_nothrow_callable_v<_Fn&&(_Args&&...)>)
|
noexcept(__is_nothrow_callable<_Fn&&(_Args&&...)>::value)
|
||||||
-> decltype(!std::declval<result_of_t<_Fn&&(_Args&&...)>>())
|
-> decltype(!std::declval<result_of_t<_Fn&&(_Args&&...)>>())
|
||||||
{
|
{
|
||||||
return !std::__invoke(std::move(_M_fn),
|
return !std::__invoke(std::move(_M_fn),
|
||||||
@ -2185,7 +2180,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
|
|||||||
template<typename... _Args>
|
template<typename... _Args>
|
||||||
auto
|
auto
|
||||||
operator()(_Args&&... __args) const &&
|
operator()(_Args&&... __args) const &&
|
||||||
noexcept(is_nothrow_callable_v<const _Fn&&(_Args&&...)>)
|
noexcept(__is_nothrow_callable<const _Fn&&(_Args&&...)>::value)
|
||||||
-> decltype(!std::declval<result_of_t<const _Fn&&(_Args&&...)>>())
|
-> decltype(!std::declval<result_of_t<const _Fn&&(_Args&&...)>>())
|
||||||
{
|
{
|
||||||
return !std::__invoke(std::move(_M_fn),
|
return !std::__invoke(std::move(_M_fn),
|
||||||
@ -2195,6 +2190,11 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
|
|||||||
private:
|
private:
|
||||||
_Fn _M_fn;
|
_Fn _M_fn;
|
||||||
};
|
};
|
||||||
|
#endif // C++14
|
||||||
|
|
||||||
|
#if __cplusplus > 201402L
|
||||||
|
|
||||||
|
#define __cpp_lib_not_fn 201603
|
||||||
|
|
||||||
/// [func.not_fn] Function template not_fn
|
/// [func.not_fn] Function template not_fn
|
||||||
template<typename _Fn>
|
template<typename _Fn>
|
||||||
@ -2202,7 +2202,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
|
|||||||
not_fn(_Fn&& __fn)
|
not_fn(_Fn&& __fn)
|
||||||
noexcept(std::is_nothrow_constructible<std::decay_t<_Fn>, _Fn&&>::value)
|
noexcept(std::is_nothrow_constructible<std::decay_t<_Fn>, _Fn&&>::value)
|
||||||
{
|
{
|
||||||
return _Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn)};
|
return _Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn), 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Searchers
|
// Searchers
|
||||||
@ -2515,7 +2515,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
|
|||||||
return std::make_pair(__last, __last);
|
return std::make_pair(__last, __last);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // C++17
|
||||||
|
|
||||||
_GLIBCXX_END_NAMESPACE_VERSION
|
_GLIBCXX_END_NAMESPACE_VERSION
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
@ -84,6 +84,12 @@ test04()
|
|||||||
VERIFY( not_fn(f)(d) );
|
VERIFY( not_fn(f)(d) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test05()
|
||||||
|
{
|
||||||
|
auto nf{ std::not_fn([] { return false; }) };
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
@ -91,4 +97,5 @@ main()
|
|||||||
test02();
|
test02();
|
||||||
test03();
|
test03();
|
||||||
test04();
|
test04();
|
||||||
|
test05();
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,12 @@ test04()
|
|||||||
VERIFY( not_fn(f)(d) );
|
VERIFY( not_fn(f)(d) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test05()
|
||||||
|
{
|
||||||
|
auto nf{ not_fn([] { return false; }) };
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
@ -91,4 +97,5 @@ main()
|
|||||||
test02();
|
test02();
|
||||||
test03();
|
test03();
|
||||||
test04();
|
test04();
|
||||||
|
test05();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user