11#pragma once
22
3-
4- #include < safe/var.hpp>
53#include < safe/constant.hpp>
6- #include < safe/dsl/eval.hpp>
7-
84#include < safe/detail/concepts.hpp>
5+ #include < safe/dsl/eval.hpp>
6+ #include < safe/var.hpp>
97
108#include < type_traits>
119#include < utility>
1210
13-
1411namespace safe {
15- namespace detail {
16- template <auto count>
17- inline consteval auto fold (auto e, auto op){
18- if constexpr (count > 100 ) {
12+ namespace detail {
13+ template <auto count> inline consteval auto fold (auto e, auto op) {
14+ if constexpr (count > 100 ) {
1915 return safe::dsl::detail::simp (
2016 op (op (op (op (op (op (op (op (op (op (
2117 op (op (op (op (op (op (op (op (op (op (
@@ -39,83 +35,76 @@ namespace safe {
3935 e), e), e), e), e), e), e), e), e), e)
4036 );
4137
42- } else if constexpr (count > 10 ) {
43- return safe::dsl::detail::simp (
44- op (op (op (op (op (op (op (op (op (op (fold<count - 10 >(e, op), e), e), e), e), e), e), e), e), e), e)
45- );
46-
47- } else if constexpr (count > 1 ) {
38+ } else if constexpr (count > 10 ) {
39+ return safe::dsl::detail::simp (op (
40+ op (op (op (op (op (op (op (op (op (fold<count - 10 >(e, op), e), e),
41+ e),
42+ e),
43+ e),
44+ e),
45+ e),
46+ e),
47+ e),
48+ e));
49+
50+ } else if constexpr (count > 1 ) {
4851 return safe::dsl::detail::simp (op (fold<count - 1 >(e, op), e));
4952
50- } else {
53+ } else {
5154 return e;
52- }
53- }
54-
55- inline constexpr auto plus_op = [](auto a, auto b){return a + b;};
5655 }
56+ }
5757
58+ constexpr inline auto plus_op = [](auto a, auto b) { return a + b; };
59+ } // namespace detail
5860
59- template <size_t max_iter>
60- [[nodiscard]] inline constexpr auto accumulate (
61- detail::iter_like auto first,
62- auto last,
63- auto init,
64- auto op
65- ) {
66- constexpr auto req = decltype ((*first).requirement ){};
67- constexpr auto sum_req = detail::fold<max_iter>(req, op);
61+ template <size_t max_iter>
62+ [[nodiscard]] constexpr inline auto accumulate (detail::iter_like auto first,
63+ auto last, auto init, auto op) {
64+ constexpr auto req = decltype ((*first).requirement ){};
65+ constexpr auto sum_req = detail::fold<max_iter>(req, op);
6866
69- using ret_num_t = decltype ((*first).unsafe_value ());
67+ using ret_num_t = decltype ((*first).unsafe_value ());
7068
71- auto iter_count = size_t {};
72- auto sum = init;
73- while ((first != last) && (iter_count < max_iter)) {
74- sum = op (sum, (*first).unsafe_value ());
75- first++;
76- iter_count++;
77- }
78-
79- return unsafe_cast<var<ret_num_t , sum_req>>(sum);
80- }
81-
82- template <size_t max_iter>
83- [[nodiscard]] inline constexpr auto accumulate (
84- detail::iter_like auto first,
85- auto last,
86- auto init
87- ) {
88- return accumulate<max_iter>(first, last, init, detail::plus_op);
89- }
90-
91- template <size_t max_iter>
92- [[nodiscard]] inline constexpr auto accumulate (
93- detail::range_like auto & range,
94- auto init,
95- auto op
96- ) {
97- return accumulate<max_iter>(range.begin (), range.end (), init, op);
69+ auto iter_count = size_t {};
70+ auto sum = init;
71+ while ((first != last) && (iter_count < max_iter)) {
72+ sum = op (sum, (*first).unsafe_value ());
73+ first++;
74+ iter_count++;
9875 }
9976
100- template <size_t max_iter>
101- [[nodiscard]] inline constexpr auto accumulate (
102- detail::range_like auto & range,
103- auto init
104- ) {
105- return accumulate<max_iter>(range.begin (), range.end (), init, detail::plus_op);
106- }
107-
108- template <size_t max_iter>
109- [[nodiscard]] inline constexpr auto accumulate (
110- detail::range_like auto const & range,
111- auto init,
112- auto op
113- ) {
114- return accumulate<max_iter>(range.begin (), range.end (), init, op);
115- }
116-
117- template <size_t max_iter>
118- [[nodiscard]] inline constexpr auto accumulate (auto const & range, auto init) {
119- return accumulate<max_iter>(range.begin (), range.end (), init, detail::plus_op);
120- }
121- }
77+ return unsafe_cast<var<ret_num_t , sum_req>>(sum);
78+ }
79+
80+ template <size_t max_iter>
81+ [[nodiscard]] constexpr inline auto accumulate (detail::iter_like auto first,
82+ auto last, auto init) {
83+ return accumulate<max_iter>(first, last, init, detail::plus_op);
84+ }
85+
86+ template <size_t max_iter>
87+ [[nodiscard]] constexpr inline auto accumulate (detail::range_like auto &range,
88+ auto init, auto op) {
89+ return accumulate<max_iter>(range.begin (), range.end (), init, op);
90+ }
91+
92+ template <size_t max_iter>
93+ [[nodiscard]] constexpr inline auto accumulate (detail::range_like auto &range,
94+ auto init) {
95+ return accumulate<max_iter>(range.begin (), range.end (), init,
96+ detail::plus_op);
97+ }
98+
99+ template <size_t max_iter>
100+ [[nodiscard]] constexpr inline auto
101+ accumulate (detail::range_like auto const &range, auto init, auto op) {
102+ return accumulate<max_iter>(range.begin (), range.end (), init, op);
103+ }
104+
105+ template <size_t max_iter>
106+ [[nodiscard]] constexpr inline auto accumulate (auto const &range, auto init) {
107+ return accumulate<max_iter>(range.begin (), range.end (), init,
108+ detail::plus_op);
109+ }
110+ } // namespace safe
0 commit comments