namespacedetail{template<classV,classF,class...Args>constexprboolnegate_invocable_impl=false;template<classF,class...Args>constexprboolnegate_invocable_impl<std::void_t<decltype(!std::invoke(std::declval<F>(),std::declval<Args>()...))>,F,Args...>=true;template<classF,class...Args>constexprboolnegate_invocable_v=negate_invocable_impl<void,F,Args...>;template<classF>structnot_fn_t{Ff;template<class...Args,std::enable_if_t<negate_invocable_v<F&,Args...>,int>=0>constexprdecltype(auto)operator()(Args&&...args)&noexcept(noexcept(!std::invoke(f,std::forward<Args>(args)...))){return!std::invoke(f,std::forward<Args>(args)...);}template<class...Args,std::enable_if_t<negate_invocable_v<constF&,Args...>,int>=0>constexprdecltype(auto)operator()(Args&&...args)const&noexcept(noexcept(!std::invoke(f,std::forward<Args>(args)...))){return!std::invoke(f,std::forward<Args>(args)...);}template<class...Args,std::enable_if_t<negate_invocable_v<F,Args...>,int>=0>constexprdecltype(auto)operator()(Args&&...args)&&noexcept(noexcept(!std::invoke(std::move(f),std::forward<Args>(args)...))){return!std::invoke(std::move(f),std::forward<Args>(args)...);}template<class...Args,std::enable_if_t<negate_invocable_v<constF,Args...>,int>=0>constexprdecltype(auto)operator()(Args&&...args)const&&noexcept(noexcept(!std::invoke(std::move(f),std::forward<Args>(args)...))){return!std::invoke(std::move(f),std::forward<Args>(args)...);}// Deleted overloads are needed since C++20// for preventing a non-equivalent but well-formed overload to be selected.template<class...Args,std::enable_if_t<!negate_invocable_v<F&,Args...>,int>=0>voidoperator()(Args&&...)&=delete;template<class...Args,std::enable_if_t<!negate_invocable_v<constF&,Args...>,int>=0>voidoperator()(Args&&...)const&=delete;template<class...Args,std::enable_if_t<!negate_invocable_v<F,Args...>,int>=0>voidoperator()(Args&&...)&&=delete;template<class...Args,std::enable_if_t<!negate_invocable_v<constF,Args...>,int>=0>voidoperator()(Args&&...)const&&=delete;};}template<classF>constexprdetail::not_fn_t<std::decay_t<F>>not_fn(F&&f){return{std::forward<F>(f)};}