[libcxx] moves `std::invoke` into `__functional_base`
Including `<concepts>` in other standard library headers (such as
`<iterator>`) creates circular dependencies due to `<functional>`.
Since `<concepts>` only needs `std::invoke` from `<functional>`, the
easiest, fastest, and cleanest way to eliminate the circular dep is to
move `std::invoke` into `__functional_base`.
This has the added advantage of `<concepts>` not transitively importing
`<functional>`.
Differential Revision: https://reviews.llvm.org/D99041
GitOrigin-RevId: c25c22d5f9b7e56c0c350982b5ec41095c5a0a05
diff --git a/include/__functional_base b/include/__functional_base
index caa7460..5e98eba 100644
--- a/include/__functional_base
+++ b/include/__functional_base
@@ -665,6 +665,18 @@
#endif // _LIBCPP_CXX03_LANG
+#if _LIBCPP_STD_VER > 14
+
+template <class _Fn, class ..._Args>
+_LIBCPP_CONSTEXPR_AFTER_CXX17 invoke_result_t<_Fn, _Args...>
+invoke(_Fn&& __f, _Args&&... __args)
+ noexcept(is_nothrow_invocable_v<_Fn, _Args...>)
+{
+ return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
+}
+
+#endif // _LIBCPP_STD_VER > 14
+
_LIBCPP_END_NAMESPACE_STD
#endif // _LIBCPP_FUNCTIONAL_BASE
diff --git a/include/concepts b/include/concepts
index 0a3e927..070e1df 100644
--- a/include/concepts
+++ b/include/concepts
@@ -135,7 +135,7 @@
*/
#include <__config>
-#include <functional>
+#include <__functional_base>
#include <type_traits>
#include <utility>
#include <version>
diff --git a/include/functional b/include/functional
index e5b85c2..bbc2301 100644
--- a/include/functional
+++ b/include/functional
@@ -2986,14 +2986,6 @@
#if _LIBCPP_STD_VER > 14
-template <class _Fn, class ..._Args>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 invoke_result_t<_Fn, _Args...>
-invoke(_Fn&& __f, _Args&&... __args)
- noexcept(is_nothrow_invocable_v<_Fn, _Args...>)
-{
- return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
-}
-
template<class _Op, class _Tuple,
class _Idxs = typename __make_tuple_indices<tuple_size<_Tuple>::value>::type>
struct __perfect_forward_impl;