| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | //====================================================================================================================== | ||
| 2 | /* | ||
| 3 | KUMI - Compact Tuple Tools | ||
| 4 | Copyright : KUMI Project Contributors | ||
| 5 | SPDX-License-Identifier: BSL-1.0 | ||
| 6 | */ | ||
| 7 | //====================================================================================================================== | ||
| 8 | #pragma once | ||
| 9 | |||
| 10 | namespace kumi | ||
| 11 | { | ||
| 12 | namespace _ | ||
| 13 | { | ||
| 14 | template<typename T> | ||
| 15 | inline constexpr bool is_reference_wrapper_v = | ||
| 16 | !std::is_same_v<std::decay_t<typename std::unwrap_reference<T&&>::type>, | ||
| 17 | typename std::unwrap_ref_decay<T&&>::type>; | ||
| 18 | |||
| 19 | template<typename T> KUMI_HIDDEN_ABI constexpr decltype(auto) unwrap_memptr(T&& obj) | ||
| 20 | { | ||
| 21 | if constexpr (kumi::_::is_reference_wrapper_v<std::remove_cvref_t<T>>) return KUMI_FWD(obj).get(); | ||
| 22 | else if constexpr (std::is_pointer_v<std::remove_cvref_t<T>>) return *KUMI_FWD(obj); | ||
| 23 | else return KUMI_FWD(obj); | ||
| 24 | } | ||
| 25 | |||
| 26 | template<typename C, typename P, typename O, typename... Ts> | ||
| 27 | KUMI_HIDDEN_ABI constexpr decltype(auto) invoke_memptr(P C::* member, O&& o, Ts&&... ts) | ||
| 28 | { | ||
| 29 | using callable_t = P C::*; | ||
| 30 | if constexpr (std::is_member_object_pointer_v<callable_t>) return unwrap_memptr(KUMI_FWD(o)).*member; | ||
| 31 | else return (unwrap_memptr(KUMI_FWD(o)).*member)(KUMI_FWD(ts)...); | ||
| 32 | } | ||
| 33 | } | ||
| 34 | |||
| 35 | //==================================================================================================================== | ||
| 36 | /** | ||
| 37 | @ingroup kumi_functional | ||
| 38 | @brief Invoke the Callable object c with a pack of arguments. | ||
| 39 | |||
| 40 | @param c Callable object to be invoked | ||
| 41 | @param ts elements to be used as arguments to c | ||
| 42 | @return The value returned by c. | ||
| 43 | |||
| 44 | @note Replaces std::invoke to avoid depending on `functional`. | ||
| 45 | **/ | ||
| 46 | //==================================================================================================================== | ||
| 47 | template<typename C, typename... Ts> KUMI_ABI constexpr decltype(auto) invoke(C&& c, Ts&&... ts) | ||
| 48 | { | ||
| 49 | if constexpr (std::is_member_pointer_v<std::decay_t<C>>) return kumi::_::invoke_memptr(c, KUMI_FWD(ts)...); | ||
| 50 |
40/40✓ Branch 1 taken 9 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 7 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 7 times.
✓ Branch 16 taken 7 times.
✓ Branch 19 taken 4 times.
✓ Branch 22 taken 6 times.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 4 times.
✓ Branch 29 taken 4 times.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 4 times.
✓ Branch 34 taken 2 times.
✓ Branch 35 taken 4 times.
✓ Branch 38 taken 4 times.
✓ Branch 40 taken 2 times.
✓ Branch 41 taken 4 times.
✓ Branch 43 taken 2 times.
✓ Branch 47 taken 4 times.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 4 times.
✓ Branch 52 taken 2 times.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 4 times.
✓ Branch 58 taken 2 times.
✓ Branch 59 taken 4 times.
✓ Branch 61 taken 2 times.
✓ Branch 64 taken 2 times.
✓ Branch 65 taken 4 times.
✓ Branch 68 taken 4 times.
✓ Branch 70 taken 2 times.
✓ Branch 73 taken 2 times.
✓ Branch 79 taken 2 times.
✓ Branch 82 taken 2 times.
✓ Branch 88 taken 2 times.
✓ Branch 91 taken 2 times.
|
2375 | else return KUMI_FWD(c)(KUMI_FWD(ts)...); |
| 51 | } | ||
| 52 | |||
| 53 | //==================================================================================================================== | ||
| 54 | /** | ||
| 55 | @ingroup kumi_functional | ||
| 56 | @brief Invoke the Callable object c with a pack of arguments with return type R. | ||
| 57 | |||
| 58 | @tparam R the return type of the callable | ||
| 59 | @param c Callable object to be invoked | ||
| 60 | @param ts elements to be used as arguments to c | ||
| 61 | @return The value returned by c with type R. | ||
| 62 | |||
| 63 | @note Replaces std::invoke_r to avoid depending on `functional`. | ||
| 64 | **/ | ||
| 65 | //==================================================================================================================== | ||
| 66 | template<typename R, typename C, typename... Ts> | ||
| 67 | KUMI_ABI constexpr R invoke_r(C&& c, Ts&&... ts) noexcept(std::is_nothrow_invocable_r_v<R, C, Ts...>) | ||
| 68 | requires(std::is_invocable_r_v<R, C, Ts...>) | ||
| 69 | { | ||
| 70 | if constexpr (std::is_void_v<R>) kumi::invoke(KUMI_FWD(c), KUMI_FWD(ts)...); | ||
| 71 | else return kumi::invoke(KUMI_FWD(c), KUMI_FWD(ts)...); | ||
| 72 | } | ||
| 73 | } | ||
| 74 |