GCC Code Coverage Report


Directory: include/kumi/
File: include/kumi/functional/invoke.hpp
Date: 2026-10-14 16:33:56
Exec Total Coverage
Lines: 1 1 100.0%
Functions: 0 0 -%
Branches: 40 40 100.0%

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