Skip to content

Commit 5eb9b1e

Browse files
authored
Merge pull request #476 from eugeneko/ek/ref
Use invoke_result instead of result_of in reference_wrapper.
2 parents 46b5321 + 00216eb commit 5eb9b1e

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

include/EASTL/internal/functional_base.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ namespace eastl
118118

119119
template <typename R, typename F, typename... Args>
120120
struct is_invocable_r_impl<R, F, void_t<typename invoke_result<F, Args...>::type>, Args...>
121-
: public is_convertible<typename invoke_result<F, Args...>::type, R> {};
121+
: public disjunction<is_convertible<typename invoke_result<F, Args...>::type, R>,
122+
is_same<typename remove_cv<R>::type, void>> {};
122123

123124
template <typename R, typename F, typename... Args>
124125
struct is_invocable_r : public is_invocable_r_impl<R, F, void, Args...> {};
@@ -232,7 +233,7 @@ namespace eastl
232233
T& get() const EA_NOEXCEPT;
233234

234235
template <typename... ArgTypes>
235-
typename eastl::result_of<T&(ArgTypes&&...)>::type operator() (ArgTypes&&...) const;
236+
typename eastl::invoke_result<T&, ArgTypes...>::type operator() (ArgTypes&&...) const;
236237

237238
private:
238239
T* val;
@@ -269,7 +270,7 @@ namespace eastl
269270

270271
template <typename T>
271272
template <typename... ArgTypes>
272-
typename eastl::result_of<T&(ArgTypes&&...)>::type reference_wrapper<T>::operator() (ArgTypes&&... args) const
273+
typename eastl::invoke_result<T&, ArgTypes...>::type reference_wrapper<T>::operator() (ArgTypes&&... args) const
273274
{
274275
return eastl::invoke(*val, eastl::forward<ArgTypes>(args)...);
275276
}

test/source/TestFunctional.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1491,5 +1491,39 @@ struct TestInvokeResult
14911491
};
14921492

14931493
template struct eastl::invoke_result<decltype(&TestInvokeResult::f), TestInvokeResult, void>;
1494+
14941495
static_assert(!eastl::is_invocable<decltype(&TestInvokeResult::f), TestInvokeResult, void>::value, "incorrect value for is_invocable");
1496+
static_assert(!eastl::is_invocable<decltype(&TestInvokeResult::f), TestInvokeResult, int, int>::value, "incorrect value for is_invocable");
14951497
static_assert(eastl::is_invocable<decltype(&TestInvokeResult::f), TestInvokeResult, int>::value, "incorrect value for is_invocable");
1498+
1499+
static_assert(!eastl::is_invocable_r<int, decltype(&TestInvokeResult::f), TestInvokeResult, void>::value, "incorrect value for is_invocable_r");
1500+
static_assert(!eastl::is_invocable_r<void, decltype(&TestInvokeResult::f), TestInvokeResult, int, int>::value, "incorrect value for is_invocable_r");
1501+
static_assert(eastl::is_invocable_r<void, decltype(&TestInvokeResult::f), TestInvokeResult, int>::value, "incorrect value for is_invocable_r");
1502+
static_assert(eastl::is_invocable_r<int, decltype(&TestInvokeResult::f), TestInvokeResult, int>::value, "incorrect value for is_invocable_r");
1503+
1504+
struct TestCallableInvokeResult
1505+
{
1506+
int operator()(int i) {return i;}
1507+
};
1508+
1509+
template struct eastl::invoke_result<TestCallableInvokeResult, void>;
1510+
1511+
static_assert(!eastl::is_invocable<TestCallableInvokeResult, void>::value, "incorrect value for is_invocable");
1512+
static_assert(!eastl::is_invocable<TestCallableInvokeResult, int, int>::value, "incorrect value for is_invocable");
1513+
static_assert(eastl::is_invocable<TestCallableInvokeResult, int>::value, "incorrect value for is_invocable");
1514+
1515+
static_assert(!eastl::is_invocable_r<int, TestCallableInvokeResult, void>::value, "incorrect value for is_invocable_r");
1516+
static_assert(!eastl::is_invocable_r<void, TestCallableInvokeResult, int, int>::value, "incorrect value for is_invocable_r");
1517+
static_assert(eastl::is_invocable_r<void, TestCallableInvokeResult, int>::value, "incorrect value for is_invocable_r");
1518+
static_assert(eastl::is_invocable_r<int, TestCallableInvokeResult, int>::value, "incorrect value for is_invocable_r");
1519+
1520+
typedef decltype(eastl::ref(eastl::declval<TestCallableInvokeResult&>())) TestCallableRefInvokeResult;
1521+
1522+
static_assert(!eastl::is_invocable<TestCallableRefInvokeResult, void>::value, "incorrect value for is_invocable");
1523+
static_assert(!eastl::is_invocable<TestCallableRefInvokeResult, int, int>::value, "incorrect value for is_invocable");
1524+
static_assert(eastl::is_invocable<TestCallableRefInvokeResult, int>::value, "incorrect value for is_invocable");
1525+
1526+
static_assert(!eastl::is_invocable_r<int, TestCallableRefInvokeResult, void>::value, "incorrect value for is_invocable_r");
1527+
static_assert(!eastl::is_invocable_r<void, TestCallableRefInvokeResult, int, int>::value, "incorrect value for is_invocable_r");
1528+
static_assert(eastl::is_invocable_r<void, TestCallableRefInvokeResult, int>::value, "incorrect value for is_invocable_r");
1529+
static_assert(eastl::is_invocable_r<int, TestCallableRefInvokeResult, int>::value, "incorrect value for is_invocable_r");

0 commit comments

Comments
 (0)