GCC Code Coverage Report


Directory: include/polyfloat/
File: include/polyfloat/module/core/if_else.hpp
Date: 2026-11-09 15:28:50
Exec Total Coverage
Lines: 16 16 100.0%
Functions: 416 416 100.0%
Branches: 101 101 100.0%

Line Branch Exec Source
1 //======================================================================================================================
2 /*
3 POLYFLOAT - Extended precision floating points
4 Copyright : POLYFLOAT Contributors & Maintainers
5 SPDX-License-Identifier: BSL-1.0
6 */
7 //======================================================================================================================
8 #pragma once
9
10 #include <polyfloat/details/callable.hpp>
11 #include <polyfloat/types/concepts.hpp>
12 #include <polyfloat/types/traits.hpp>
13 #include <type_traits>
14
15 namespace plf
16 {
17 template<typename Options> struct if_else_t : eve::callable<if_else_t, Options, raw_option, pedantic_option>
18 {
19 template<typename M, typename T, typename F>
20 requires(concepts::polyfloat<T> || concepts::polyfloat<F>)
21 24322049 POLYFLOAT_ABI constexpr expected_result_t<eve::if_else, M, T, F> operator()(M const& m,
22 T const& t,
23 F const& f) const noexcept
24 {
25 24322049 return POLYFLOAT_CALL(m, t, f);
26 }
27
28 template<typename M, typename T, typename F>
29 14623 POLYFLOAT_ABI constexpr auto operator()(M const& m, T const& t, F const& f) const noexcept
30 -> decltype(eve::if_else(m, t, f))
31 {
32 14623 return eve::if_else(m, t, f);
33 }
34
35 24322049 POLYFLOAT_CALLABLE_OBJECT(if_else_t, if_else_);
36 };
37
38 //======================================================================================================================
39 //! @addtogroup core
40 //! @{
41 //! @var if_else
42 //! @brief Select a value between two arguments based on a logical mask
43 //!
44 //! @groupheader{Header file}
45 //!
46 //! @code
47 //! #include <polyfloat/module/core.hpp>
48 //! @endcode
49 //!
50 //! @groupheader{Callable Signatures}
51 //!
52 //! @code
53 //! namespace polyfloat
54 //! {
55 //! constexpr auto if_else(auto x, auto y, auto z ) noexcept;
56 //! }
57 //! @endcode
58 //!
59 //! **Parameters**
60 //!
61 //! * `x`: logical mask.
62 //! * `y`, `z`: values to be selected.
63 //!
64 //! **Return value**
65 //!
66 //! * elementwise `y` or `z` according the truth value of `x`.
67 //!
68 //! @groupheader{Example}
69 //!
70 //! @godbolt_todo{doc/core/if_else.cpp}
71 //======================================================================================================================
72 inline constexpr auto if_else = eve::functor<if_else_t>;
73 //======================================================================================================================
74 //! @}
75 //======================================================================================================================
76 }
77
78 namespace plf::_
79 {
80 template<typename M, typename Z1, typename Z2, eve::callable_options O>
81 24322049 constexpr auto if_else_(POLYFLOAT_DELAY(), O const&, M const& m, Z1 const& t, Z2 const& f) noexcept
82 {
83 if constexpr (concepts::polyfloat<Z1> && concepts::polyfloat<Z2>)
84 {
85 using type = as_polyfloat_t<Z1, Z2>;
86 using ret_t = eve::as_wide_as_t<type, M>;
87
88 55816829 return ret_t{kumi::map([&](auto const& v, auto const& w) { return eve::if_else(m, v, w); },
89 48507562 convert(t, eve::as_element<type>{}), convert(f, eve::as_element<type>{}))};
90 }
91 else
92 {
93 170671 auto parts = [&]() {
94 94789 auto cst = []<typename I>(auto x, I const&) {
95 34135 if constexpr (I::value == 0) return x;
96 60648 else return eve::zero;
97 };
98
99 if constexpr (!concepts::polyfloat<Z2>)
100
14/14
✓ Branch 1 taken 3958 times.
✓ Branch 3 taken 98 times.
✓ Branch 4 taken 3030 times.
✓ Branch 6 taken 155 times.
✓ Branch 7 taken 225 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 226 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 15 times.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 15 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 4 times.
✓ Branch 22 taken 4 times.
47296 return kumi::map_index([&](auto i, auto e) { return eve::if_else(m, e, cst(f, i)); }, t);
101 else if constexpr (!concepts::polyfloat<Z1>)
102
87/87
✓ Branch 1 taken 4798 times.
✓ Branch 3 taken 83 times.
✓ Branch 4 taken 3320 times.
✓ Branch 5 taken 15 times.
✓ Branch 6 taken 144 times.
✓ Branch 7 taken 1169 times.
✓ Branch 8 taken 15 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 655 times.
✓ Branch 11 taken 24 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 1127 times.
✓ Branch 14 taken 24 times.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 809 times.
✓ Branch 17 taken 32 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 528 times.
✓ Branch 20 taken 32 times.
✓ Branch 22 taken 515 times.
✓ Branch 23 taken 12 times.
✓ Branch 25 taken 517 times.
✓ Branch 26 taken 12 times.
✓ Branch 28 taken 1571 times.
✓ Branch 29 taken 32 times.
✓ Branch 31 taken 1417 times.
✓ Branch 32 taken 32 times.
✓ Branch 34 taken 1213 times.
✓ Branch 35 taken 12 times.
✓ Branch 37 taken 303 times.
✓ Branch 38 taken 12 times.
✓ Branch 39 taken 4 times.
✓ Branch 40 taken 1380 times.
✓ Branch 41 taken 2 times.
✓ Branch 43 taken 870 times.
✓ Branch 44 taken 6 times.
✓ Branch 45 taken 10 times.
✓ Branch 46 taken 911 times.
✓ Branch 48 taken 30 times.
✓ Branch 49 taken 122 times.
✓ Branch 51 taken 20 times.
✓ Branch 52 taken 123 times.
✓ Branch 54 taken 60 times.
✓ Branch 55 taken 917 times.
✓ Branch 57 taken 10 times.
✓ Branch 58 taken 441 times.
✓ Branch 60 taken 70 times.
✓ Branch 61 taken 78 times.
✓ Branch 63 taken 10 times.
✓ Branch 64 taken 100 times.
✓ Branch 66 taken 30 times.
✓ Branch 67 taken 637 times.
✓ Branch 69 taken 10 times.
✓ Branch 70 taken 292 times.
✓ Branch 72 taken 70 times.
✓ Branch 73 taken 17 times.
✓ Branch 75 taken 10 times.
✓ Branch 76 taken 32 times.
✓ Branch 78 taken 30 times.
✓ Branch 79 taken 28 times.
✓ Branch 82 taken 18 times.
✓ Branch 83 taken 1 times.
✓ Branch 85 taken 30 times.
✓ Branch 86 taken 2 times.
✓ Branch 88 taken 19 times.
✓ Branch 89 taken 1 times.
✓ Branch 91 taken 31 times.
✓ Branch 92 taken 1 times.
✓ Branch 94 taken 34 times.
✓ Branch 95 taken 1 times.
✓ Branch 97 taken 11 times.
✓ Branch 98 taken 1 times.
✓ Branch 100 taken 9 times.
✓ Branch 103 taken 49 times.
✓ Branch 106 taken 20 times.
✓ Branch 109 taken 2 times.
✓ Branch 112 taken 2 times.
✓ Branch 115 taken 18 times.
✓ Branch 118 taken 8 times.
✓ Branch 121 taken 2 times.
✓ Branch 124 taken 2 times.
✓ Branch 127 taken 26 times.
✓ Branch 130 taken 12 times.
✓ Branch 133 taken 2 times.
✓ Branch 136 taken 2 times.
✓ Branch 139 taken 18 times.
✓ Branch 142 taken 8 times.
148574 return kumi::map_index([&](auto i, auto e) { return eve::if_else(m, cst(t, i), e); }, f);
103 68268 }();
104
105 68268 return eve::as_wide_as_t<std::conditional_t<!concepts::polyfloat<Z2>, Z1, Z2>, M>{parts};
106 }
107 }
108 }
109