Skip to content

Commit 256aa66

Browse files
committed
Refactor enumerable : with xtd concepts and enumerable_generator
1 parent 0f1d676 commit 256aa66

3 files changed

Lines changed: 81 additions & 64 deletions

File tree

src/xtd.core/include/xtd/linq/enumerable.hpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,68 @@ auto xtd::linq::enumerable::as_enumerable(const std::stack<value_t, container_t>
105105
const auto& underlying_items = source.*accessor::get();
106106
return as_enumerable(underlying_items.begin(), underlying_items.end());
107107
}
108+
109+
template<xtd::forward_iterable source_t>
110+
requires xtd::real_decimal<typename xtd::raw_type<source_t>::value_type>
111+
auto xtd::linq::enumerable::average(source_t&& source) -> xtd::decimal {
112+
auto average = .0l;
113+
auto count = 0;
114+
for (const auto& item : source) {
115+
average += item;
116+
++count;
117+
}
118+
if (count == 0) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation);
119+
return average / count;
120+
}
121+
122+
template<xtd::forward_iterable source_t>
123+
requires xtd::real_double<typename xtd::raw_type<source_t>::value_type>
124+
auto xtd::linq::enumerable::average(source_t&& source) -> double {
125+
auto average = .0;
126+
auto count = 0;
127+
for (const auto& item : source) {
128+
average += item;
129+
++count;
130+
}
131+
if (count == 0) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation);
132+
return average / count;
133+
}
134+
135+
template<xtd::forward_iterable source_t>
136+
requires xtd::real_single<typename xtd::raw_type<source_t>::value_type>
137+
auto xtd::linq::enumerable::average(source_t&& source) -> xtd::single {
138+
auto average = .0f;
139+
auto count = 0;
140+
for (const auto& item : source) {
141+
average += item;
142+
++count;
143+
}
144+
if (count == 0) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation);
145+
return average / count;
146+
}
147+
148+
template<xtd::forward_iterable source_t>
149+
requires xtd::signed_integer_32<typename xtd::raw_type<source_t>::value_type>
150+
auto xtd::linq::enumerable::average(source_t&& source) -> double {
151+
auto average = .0;
152+
auto count = 0;
153+
for (const auto& item : source) {
154+
average += item;
155+
++count;
156+
}
157+
if (count == 0) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation);
158+
return average / count;
159+
}
160+
161+
template<xtd::forward_iterable source_t>
162+
requires xtd::signed_integer_64<typename xtd::raw_type<source_t>::value_type>
163+
auto xtd::linq::enumerable::average(source_t&& source) -> double {
164+
auto average = .0;
165+
auto count = 0;
166+
for (const auto& item : source) {
167+
average += item;
168+
++count;
169+
}
170+
if (count == 0) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation);
171+
return average / count;
172+
}

src/xtd.core/include/xtd/linq/enumerable_.hpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -241,28 +241,38 @@ namespace xtd {
241241
/// @param source A sequence of xtd::decimal values to calculate the average of.
242242
/// @return The average of the sequence of values.
243243
/// @exception xtd::invalid_operation_exception `source` contains no elements.
244-
[[nodiscard]] static auto average(const ienumerable<xtd::decimal>& source) -> xtd::decimal;
244+
template<xtd::forward_iterable source_t>
245+
requires xtd::real_decimal<typename xtd::raw_type<source_t>::value_type>
246+
[[nodiscard]] static auto average(source_t&& source) -> xtd::decimal;
245247
/// @brief Computes the average of a sequence of double values.
246248
/// @param source A sequence of double values to calculate the average of.
247249
/// @return The average of the sequence of values.
248250
/// @exception xtd::invalid_operation_exception `source` contains no elements.
249-
[[nodiscard]] static auto average(const ienumerable<double>& source) -> double;
251+
template<xtd::forward_iterable source_t>
252+
requires xtd::real_double<typename xtd::raw_type<source_t>::value_type>
253+
[[nodiscard]] static auto average(source_t&& source) -> double;
250254
/// @brief Computes the average of a sequence of float values.
251255
/// @param source A sequence of float values to calculate the average of.
252256
/// @return The average of the sequence of values.
253257
/// @exception xtd::invalid_operation_exception `source` contains no elements.
254-
[[nodiscard]] static auto average(const ienumerable<float>& source) -> float;
258+
template<xtd::forward_iterable source_t>
259+
requires xtd::real_single<typename xtd::raw_type<source_t>::value_type>
260+
[[nodiscard]] static auto average(source_t&& source) -> xtd::single;
255261
/// @brief Computes the average of a sequence of xtd::int32 values.
256262
/// @param source A sequence of xtd::int32 values to calculate the average of.
257263
/// @return The average of the sequence of values.
258264
/// @exception xtd::invalid_operation_exception `source` contains no elements.
259-
[[nodiscard]] static auto average(const ienumerable<xtd::int32>& source) -> double;
265+
template<xtd::forward_iterable source_t>
266+
requires xtd::signed_integer_32<typename xtd::raw_type<source_t>::value_type>
267+
[[nodiscard]] static auto average(source_t&& source) -> double;
260268
/// @brief Computes the average of a sequence of xtd::int64 values.
261269
/// @param source A sequence of xtd::int64 values to calculate the average of.
262270
/// @return The average of the sequence of values.
263271
/// @exception xtd::invalid_operation_exception `source` contains no elements.
264-
[[nodiscard]] static auto average(const ienumerable<xtd::int64>& source) -> double;
265-
272+
template<xtd::forward_iterable source_t>
273+
requires xtd::signed_integer_64<typename xtd::raw_type<source_t>::value_type>
274+
[[nodiscard]] static auto average(source_t&& source) -> double;
275+
266276
/// @brief Computes the average of a sequence of optional xtd::decimal values.
267277
/// @param source A sequence of optional xtd::decimal values to calculate the average of.
268278
/// @return The average of the sequence of values, or xtd::nullopt if the source sequence is empty or contains only values that are xtd::nullopt.
Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,10 @@
11
#include "../../../include/xtd/linq/enumerable.hpp"
2-
#include "../../../include/xtd/argument_out_of_range_exception.hpp"
32
#include "../../../include/xtd/as.hpp"
4-
#include "../../../include/xtd/invalid_operation_exception.hpp"
53

64
using namespace xtd;
75
using namespace xtd::helpers;
86
using namespace xtd::linq;
97

10-
auto enumerable::average(const ienumerable<decimal>& source) -> decimal {
11-
auto average = .0l;
12-
auto count = 0;
13-
for (auto item : source) {
14-
average += item;
15-
++count;
16-
}
17-
if (count == 0) throw_helper::throws(exception_case::invalid_operation);
18-
return average / count;
19-
}
20-
21-
auto enumerable::average(const ienumerable<double>& source) -> double {
22-
auto average = .0;
23-
auto count = 0;
24-
for (auto item : source) {
25-
average += item;
26-
++count;
27-
}
28-
if (count == 0) throw_helper::throws(exception_case::invalid_operation);
29-
return average / count;
30-
}
31-
32-
auto enumerable::average(const ienumerable<float>& source) -> float {
33-
auto average = .0f;
34-
auto count = 0;
35-
for (auto item : source) {
36-
average += item;
37-
++count;
38-
}
39-
if (count == 0) throw_helper::throws(exception_case::invalid_operation);
40-
return average / count;
41-
}
42-
43-
auto enumerable::average(const ienumerable<int32>& source) -> double {
44-
auto average = .0;
45-
auto count = 0;
46-
for (auto item : source) {
47-
average += as<double>(item);
48-
++count;
49-
}
50-
if (count == 0) throw_helper::throws(exception_case::invalid_operation);
51-
return average / count;
52-
}
53-
54-
auto enumerable::average(const ienumerable<int64>& source) -> double {
55-
auto average = .0;
56-
auto count = 0;
57-
for (auto item : source) {
58-
average += as<double>(item);
59-
++count;
60-
}
61-
if (count == 0) throw_helper::throws(exception_case::invalid_operation);
62-
return average / count;
63-
}
64-
658
auto enumerable::average(const ienumerable<optional<decimal >>& source) noexcept -> optional<decimal> {
669
auto average = .0l;
6710
auto count = 0;
@@ -121,4 +64,3 @@ auto enumerable::average(const ienumerable<optional<int64 >>& source) noexcept -
12164
if (count == 0) return nullopt;
12265
return average / count;
12366
}
124-

0 commit comments

Comments
 (0)