44#include < concepts>
55#include < ranges>
66#include < algorithm>
7- #include < tuple> // use rsl::tuple?
7+ #include < tuple> // use rsl::tuple?
88#include < utility>
99#include < stdexcept>
1010
@@ -14,10 +14,7 @@ namespace rsl::_impl {
1414template <std::meta::info R>
1515consteval std::meta::info make_arg_tuple () {
1616 std::vector<std::meta::info> args;
17- auto make_optional = [](auto r) {
18- return substitute (^^std::optional, {
19- r});
20- };
17+ auto make_optional = [](auto r) { return substitute (^^std::optional, {r}); };
2118
2219 if constexpr (is_function (R)) {
2320 for (auto & arg : parameters_of (R)) {
@@ -33,8 +30,7 @@ consteval std::meta::info make_arg_tuple() {
3330 constexpr auto ctx = std::meta::access_context::current ();
3431 for (auto && base : bases_of (dealias (R), ctx)) {
3532 args.push_back (extract<std::meta::info (*)()>(
36- substitute (^^make_arg_tuple, {
37- reflect_constant (type_of (base))}))());
33+ substitute (^^make_arg_tuple, {reflect_constant (type_of (base))}))());
3834 }
3935 for (auto && arg : nonstatic_data_members_of (R, ctx)) {
4036 args.push_back (make_optional (type_of (arg)));
@@ -53,12 +49,14 @@ namespace _default_impl {
5349consteval std::size_t required_args_count (std::meta::info reflection) {
5450 if (is_function (reflection)) {
5551 auto members = parameters_of (reflection);
56- return std::count_if (members.begin (), members.end (),
57- [](auto x) { return !has_default_argument (x); });
52+ return std::count_if (members.begin (), members.end (), [](auto x) {
53+ return !has_default_argument (x);
54+ });
5855 } else if (is_type (reflection)) {
5956 auto members = nonstatic_data_members_of (reflection, std::meta::access_context::current ());
60- return std::count_if (members.begin (), members.end (),
61- [](auto x) { return !has_default_member_initializer (x); });
57+ return std::count_if (members.begin (), members.end (), [](auto x) {
58+ return !has_default_member_initializer (x);
59+ });
6260 } else {
6361 return {};
6462 }
@@ -76,13 +74,13 @@ decltype(auto) do_visit(F visitor, std::size_t index, Args&&... extra_args) {
7674
7775template <std::size_t Bases, std::size_t Required, typename T, typename F, typename ... Args>
7876decltype (auto ) visit(F visitor, ArgumentTuple<T> const & args, Args&&... extra_args) {
79- constexpr static int size = std::tuple_size_v<ArgumentTuple<T>>;
80- constexpr static int optional_min = Bases + Required;
81- constexpr static int branches = size - optional_min;
77+ constexpr static std:: size_t size = std::tuple_size_v<ArgumentTuple<T>>;
78+ constexpr static std:: size_t optional_min = Bases + Required;
79+ constexpr static std:: size_t branches = size - optional_min;
8280
8381 std::size_t index = 0 ;
84- template for (constexpr auto Idx : std::views::iota (0zu , size - Bases )) {
85- if (get<Bases + Idx>(args).has_value ()) {
82+ template for (constexpr auto Idx : std::views::iota (Bases , size)) {
83+ if (get<Idx>(args).has_value ()) {
8684 ++index;
8785 } else {
8886 break ;
@@ -91,15 +89,16 @@ decltype(auto) visit(F visitor, ArgumentTuple<T> const& args, Args&&... extra_ar
9189
9290 if (index < Required) {
9391 // fail more gracefully
94- throw std::runtime_error (" not all required arguments are given " );
92+ throw std::runtime_error (std::format ( " expected {} arguments, got {} " , size, index) );
9593 }
9694
9795 if constexpr (branches == 0 ) {
9896 // no optional arguments
9997 return visitor (std::make_index_sequence<size - Bases>(), std::forward<Args>(extra_args)...);
10098 } else {
101- return do_visit<Required, branches>(
102- visitor, index - Required, std::forward<Args>(extra_args)...);
99+ return do_visit<Required, branches>(visitor,
100+ index - Required,
101+ std::forward<Args>(extra_args)...);
103102 }
104103}
105104
@@ -109,27 +108,30 @@ template <std::meta::info R>
109108constexpr inline std::size_t required_arg_count = _default_impl::required_args_count(R);
110109
111110template <typename T>
112- constexpr inline std::size_t base_count = bases_of(^^T, std::meta::access_context::current()).size();
111+ constexpr inline std::size_t base_count =
112+ bases_of (^^T, std::meta::access_context::current()).size();
113113
114114template <typename T>
115115 requires (std::is_aggregate_v<T> && !std::is_array_v<T>)
116116T default_construct(ArgumentTuple<T> const & args) {
117117 constexpr static auto num_bases = base_count<T>;
118- constexpr static auto ctx = std::meta::access_context::current ();
118+ constexpr static auto ctx = std::meta::access_context::current ();
119119
120120 return _default_impl::visit<num_bases, required_arg_count<dealias (^^T)>, T>(
121121 [&]<std::size_t ... Idx, std::size_t ... BIdx>(std::index_sequence<Idx...>,
122122 std::index_sequence<BIdx...>) {
123- return T{default_construct<typename [:type_of (bases_of (^^T, ctx)[BIdx]):]>(get<BIdx>(args))...,
124- *get<num_bases + Idx>(args)...};
123+ return T{
124+ default_construct<typename [:type_of (bases_of (^^T, ctx)[BIdx]):]>(get<BIdx>(args))...,
125+ *get<num_bases + Idx>(args)...};
125126 },
126- args, std::make_index_sequence<num_bases>());
127+ args,
128+ std::make_index_sequence<num_bases>());
127129}
128130
129131template <std::meta::info R>
130132 requires (meta::function<R> || meta::static_member_function<R>)
131- decltype(auto ) default_invoke(ArgumentTuple<typename [:type_of(R):]> const & args) {
132- return _default_impl::visit<0 , required_arg_count<R>, typename [:type_of (R):]>(
133+ decltype(auto ) default_invoke(ArgumentTuple<typename [:type_of(R):]> const & args) {
134+ return _default_impl::visit<0 , required_arg_count<R>, typename [:type_of (R):]>(
133135 [&]<std::size_t ... Idx>(std::index_sequence<Idx...>) { return [:R:](*get<Idx>(args)...); },
134136 args);
135137}
@@ -141,11 +143,11 @@ decltype(auto) default_invoke() =
141143
142144template <std::meta::info R, typename T>
143145 requires (meta::nonstatic_member_function<R>)
144- decltype(auto ) default_invoke(T&& self, ArgumentTuple<typename [:type_of(R):]> const & args) {
145- static_assert (std::convertible_to<std::remove_cvref_t <T>, typename [:parent_of (R):]>,
146+ decltype(auto ) default_invoke(T&& self, ArgumentTuple<typename [:type_of(R):]> const & args) {
147+ static_assert (std::convertible_to<std::remove_cvref_t <T>, typename [:parent_of (R):]>,
146148 " wrong type for self argument" );
147149
148- return _default_impl::visit<0 , required_arg_count<R>, typename [:type_of (R):]>(
150+ return _default_impl::visit<0 , required_arg_count<R>, typename [:type_of (R):]>(
149151 [&]<std::size_t ... Idx>(std::index_sequence<Idx...>) {
150152 std::forward<T>(self).[:R:](*get<Idx>(args)...);
151153 },
0 commit comments