GCC Code Coverage Report


Directory: include/kumi/
File: include/kumi/product_types/shared.hpp
Date: 2026-10-14 16:33:56
Exec Total Coverage
Lines: 17 17 100.0%
Functions: 361 486 74.3%
Branches: 119 136 87.5%

Line Branch Exec Source
1 //======================================================================================================================
2 //! @file
3 /*
4 KUMI - Compact Tuple Tools
5 Copyright : KUMI Project Contributors
6 SPDX-License-Identifier: BSL-1.0
7 */
8 //======================================================================================================================
9 #pragma once
10
11 namespace kumi
12 {
13 namespace _
14 {
15 11 template<typename T, typename U, std::size_t... I> constexpr T static_cast_(U&& u, std::index_sequence<I...>)
16 {
17 32 return {static_cast<kumi::element_t<I, T>>(get<I>(KUMI_FWD(u)))...};
18 }
19
20 2 template<typename T, typename U, std::size_t... I> constexpr void assign(T&& t, U&& u, std::index_sequence<I...>)
21 {
22 11 ((get<I>(KUMI_FWD(t)) = get<I>(KUMI_FWD(u))), ...);
23 2 }
24
25 template<typename T, typename U, std::size_t... I>
26 65513 constexpr auto compare(T&& t, U&& u, std::index_sequence<I...>) noexcept
27 {
28
20/27
✓ Branch 1 taken 22332 times.
✓ Branch 2 taken 10350 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 22327 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 10351 times.
✓ Branch 7 taken 22103 times.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 30930 times.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 39 times.
✓ Branch 14 taken 755 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 25 times.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 7 times.
✓ Branch 19 taken 19 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 5 times.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
526180 return ((get<I>(KUMI_FWD(t)) == get<I>(KUMI_FWD(u))) && ...);
29 }
30
31 // The first position where t and u differ decides the order
32 template<typename T, typename U, std::size_t... I>
33 64974 constexpr auto lexicographic_compare(T const& t, U const& u, std::index_sequence<I...>) noexcept
34 {
35 // The accumulators take the type of the whole fold: masks of different element types do not convert
36 using result_t = decltype((... || (get<I>(t) < get<I>(u))));
37
38 64974 result_t less{false};
39 64974 result_t equal{true};
40
41
46/49
✓ Branch 0 taken 29535 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 29535 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9843 times.
✓ Branch 6 taken 19692 times.
✓ Branch 7 taken 29535 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 19692 times.
✓ Branch 10 taken 9843 times.
✓ Branch 12 taken 9850 times.
✓ Branch 13 taken 9842 times.
✓ Branch 14 taken 19664 times.
✓ Branch 15 taken 9829 times.
✓ Branch 16 taken 9836 times.
✓ Branch 17 taken 9828 times.
✓ Branch 19 taken 3277 times.
✓ Branch 20 taken 6555 times.
✓ Branch 21 taken 9834 times.
✓ Branch 22 taken 19659 times.
✓ Branch 23 taken 6559 times.
✓ Branch 24 taken 3277 times.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 3281 times.
✓ Branch 27 taken 3276 times.
✓ Branch 28 taken 16203 times.
✓ Branch 29 taken 12962 times.
✓ Branch 30 taken 3243 times.
✓ Branch 31 taken 12962 times.
✓ Branch 33 taken 1081 times.
✓ Branch 34 taken 2162 times.
✓ Branch 35 taken 3243 times.
✓ Branch 36 taken 25922 times.
✓ Branch 37 taken 2162 times.
✓ Branch 38 taken 1081 times.
✓ Branch 40 taken 1082 times.
✓ Branch 41 taken 1080 times.
✓ Branch 42 taken 13608 times.
✓ Branch 43 taken 12636 times.
✓ Branch 44 taken 972 times.
✓ Branch 45 taken 12636 times.
✓ Branch 47 taken 324 times.
✓ Branch 48 taken 648 times.
✓ Branch 49 taken 972 times.
✓ Branch 50 taken 25272 times.
✓ Branch 51 taken 648 times.
✓ Branch 52 taken 324 times.
✓ Branch 54 taken 324 times.
✓ Branch 55 taken 324 times.
425826 ((less = less || (equal && (get<I>(t) < get<I>(u))), equal = equal && !less && !(get<I>(u) < get<I>(t))), ...);
42
43 64974 return less;
44 }
45
46 template<typename Os, typename T, std::size_t... I>
47 667 constexpr Os& print(
48 Os& os, T&& t, char start, [[maybe_unused]] char separator, char stop, std::index_sequence<I...>)
49 {
50 667 os << start << ' ';
51
45/51
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 171 times.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 171 times.
✓ Branch 7 taken 3 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 138 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 138 times.
✓ Branch 16 taken 2 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 50 times.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 50 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 38 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 38 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✓ Branch 35 taken 27 times.
✓ Branch 37 taken 1 times.
✓ Branch 38 taken 27 times.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 14 times.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 14 times.
✓ Branch 47 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 1 times.
✓ Branch 51 taken 6 times.
✓ Branch 54 taken 7 times.
✓ Branch 57 taken 1 times.
✓ Branch 59 taken 3 times.
✓ Branch 60 taken 1 times.
✓ Branch 62 taken 3 times.
✓ Branch 64 taken 1 times.
✓ Branch 67 taken 4 times.
✓ Branch 70 taken 4 times.
✓ Branch 75 taken 3 times.
✓ Branch 78 taken 3 times.
✓ Branch 83 taken 3 times.
✓ Branch 86 taken 3 times.
✓ Branch 91 taken 2 times.
✓ Branch 94 taken 2 times.
✓ Branch 99 taken 2 times.
✓ Branch 102 taken 2 times.
1793 ((os << kumi::_::make_streamable(get<I>(KUMI_FWD(t))) << separator << ' '), ...);
52
8/9
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 189 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 189 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 10 taken 1 times.
667 os << kumi::_::make_streamable(get<sizeof...(I)>(KUMI_FWD(t))) << ' ' << stop;
53 667 return os;
54 }
55 }
56 }
57