GCC Code Coverage Report


Directory: include/kumi/
File: include/kumi/detail/binder.hpp
Date: 2026-10-14 16:33:56
Exec Total Coverage
Lines: 8 8 100.0%
Functions: 405 407 99.5%
Branches: 0 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 //====================================================================================================================
13 // Tuple leaf binder tricks
14 //====================================================================================================================
15 template<std::size_t N, typename T> struct leaf
16 {
17 T value;
18 using index = std::integral_constant<std::size_t, N>;
19 using inner_type = std::type_identity<T>;
20
21 1037 KUMI_HIDDEN_ABI constexpr T& operator()(index) & noexcept { return value; }
22
23 1912 KUMI_HIDDEN_ABI constexpr T&& operator()(index) && noexcept { return static_cast<T&&>(value); }
24
25 KUMI_HIDDEN_ABI constexpr T const&& operator()(index) const&& noexcept { return static_cast<T const&&>(value); }
26
27 432 KUMI_HIDDEN_ABI constexpr T const& operator()(index) const& noexcept { return value; }
28
29 KUMI_HIDDEN_ABI constexpr T& operator()(inner_type) & noexcept { return value; }
30
31 KUMI_HIDDEN_ABI constexpr T&& operator()(inner_type) && noexcept { return static_cast<T&&>(value); }
32
33 KUMI_HIDDEN_ABI constexpr T const&& operator()(inner_type) const&& noexcept
34 {
35 return static_cast<T const&&>(value);
36 }
37
38 KUMI_HIDDEN_ABI constexpr T const& operator()(inner_type) const& noexcept { return value; }
39 };
40
41 // Empty Base Optimization
42 template<std::size_t N, typename T>
43 requires(std::is_empty_v<T> && (!std::is_final_v<T>) && (!kumi::_::field<T>))
44 struct leaf<N, T> : std::remove_cvref_t<T>
45 {
46 using base = std::remove_cvref_t<T>;
47 using index = std::integral_constant<std::size_t, N>;
48 using inner_type = std::type_identity<base>;
49
50 649 KUMI_HIDDEN_ABI constexpr base& operator()(index) & noexcept { return *this; }
51
52 27 KUMI_HIDDEN_ABI constexpr base&& operator()(index) && noexcept { return static_cast<base&&>(*this); }
53
54 KUMI_HIDDEN_ABI constexpr base const&& operator()(index) const&& noexcept
55 {
56 return static_cast<base const&&>(*this);
57 }
58
59 88 KUMI_HIDDEN_ABI constexpr base const& operator()(index) const& noexcept { return *this; }
60
61 KUMI_HIDDEN_ABI constexpr base& operator()(inner_type) & noexcept { return *this; }
62
63 KUMI_HIDDEN_ABI constexpr base&& operator()(inner_type) && noexcept { return static_cast<base&&>(*this); }
64
65 KUMI_HIDDEN_ABI constexpr base const&& operator()(inner_type) const&& noexcept
66 {
67 return static_cast<base const&&>(*this);
68 }
69
70 KUMI_HIDDEN_ABI constexpr base const& operator()(inner_type) const& noexcept { return *this; }
71 };
72
73 template<std::size_t N, kumi::_::field T> struct leaf<N, T> : std::remove_cvref_t<T>
74 {
75 using base = std::remove_cvref_t<T>;
76 using base::operator();
77 using index = std::integral_constant<std::size_t, N>;
78
79 10 KUMI_HIDDEN_ABI constexpr base& operator()(index) & noexcept { return *this; }
80
81 KUMI_HIDDEN_ABI constexpr base&& operator()(index) && noexcept { return static_cast<base&&>(*this); }
82
83 KUMI_HIDDEN_ABI constexpr base const&& operator()(index) const&& noexcept
84 {
85 return static_cast<base const&&>(*this);
86 }
87
88 20 KUMI_HIDDEN_ABI constexpr base const& operator()(index) const& noexcept { return *this; }
89 };
90
91 // Specializable binder type constructor
92 template<typename ISeq, typename... Ts> struct binder;
93
94 // General N-case
95 template<std::size_t... Is, typename... Ts>
96 struct binder<std::index_sequence<Is...>, Ts...> : kumi::_::leaf<Is, Ts>...
97 {
98 static constexpr bool is_homogeneous = false;
99 using kumi::_::leaf<Is, Ts>::operator()...;
100 };
101
102 template<typename ISeq, typename... Ts> using make_binder_t = kumi::_::binder<ISeq, Ts...>;
103
104 // Record binder, a record is unordered which implies no need for leaf tagging with integers. All types are also
105 // necessarily unique.
106 template<typename... Ts> using make_set_t = kumi::_::set<Ts...>;
107 }
108