xtd 1.0.0
Loading...
Searching...
No Matches
enumerable.hpp
Go to the documentation of this file.
1
4#pragma once
5#include "enumerable_.hpp" // contains xtd::linq::enumerable <type_t> class definition
8#include "../nullopt.hpp"
9#include "from.hpp"
10
12template<typename type_t>
13struct __xtd_enumerable_holder {
14 __xtd_enumerable_holder(const type_t& value) : ptr_(std::addressof(value)) {}
15 //__xtd_enumerable_holder(type_t& value) : ptr_(std::addressof(value)) {}
16 __xtd_enumerable_holder(type_t&& value) requires std::movable<type_t> : value_(std::move(value)), ptr_(std::addressof(*value_)) {}
17
18 const xtd::raw_type<type_t>& get() const {return *ptr_;}
19
20private:
21 std::optional<type_t> value_;
22 const xtd::raw_type<type_t>* ptr_;
23};
24
25template<xtd::iterable source_t, xtd::func_callable<xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>> func_t>
26auto xtd::linq::enumerable::aggregate(source_t&& source, func_t&& func) -> xtd::iterable_value_type<source_t> {
27 auto nb = 0;
28 auto aggregated = xtd::iterable_value_type<source_t> {};
29 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
30 //for (const auto& item : source_holder.get())
31 for (const auto& item : source)
32 aggregated = nb++ == 0 ? item : func(aggregated, item);
33 return aggregated;
34}
35
36template<typename accumulate_t, xtd::iterable source_t, xtd::func_callable<accumulate_t, accumulate_t, xtd::iterable_value_type<source_t>> func_t>
37auto xtd::linq::enumerable::aggregate(source_t&& source, accumulate_t&& seed, func_t&& func) -> accumulate_t {
38 auto aggregated = std::move(seed);
39 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
40 //for (const auto& item : source_holder.get())
41 for (const auto& item : source)
42 aggregated = func(aggregated, item);
43 return aggregated;
44}
45
46template<typename result_t, typename accumulate_t, xtd::iterable source_t, xtd::func_callable<accumulate_t, accumulate_t, xtd::iterable_value_type<source_t>> func_t, xtd::func_callable<result_t, accumulate_t> result_selector_t>
47auto xtd::linq::enumerable::aggregate(source_t&& source, accumulate_t&& seed, func_t&& func, result_selector_t&& result_selector) -> result_t {
48 auto aggregated = std::move(seed);
49 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
50 //for (const auto& item : source_holder.get())
51 for (const auto& item : source)
52 aggregated = func(aggregated, item);
53 return result_selector(aggregated);
54}
55
56template<xtd::iterable source_t, xtd::predicate_callable<xtd::iterable_value_type<source_t>> predicate_t>
57auto xtd::linq::enumerable::all(source_t&& source, predicate_t&& predicate) -> bool {
58 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
59 //for (const auto& item : source_holder.get())
60 for (const auto& item : source)
61 if (!predicate(item)) return false;
62 return true;
63}
64
65template<xtd::iterable source_t>
66auto xtd::linq::enumerable::any(source_t&& source) noexcept -> bool {
67 return source.begin() != source.end();
68}
69
70template<xtd::iterable source_t, xtd::predicate_callable<xtd::iterable_value_type<source_t>> predicate_t>
71auto xtd::linq::enumerable::any(source_t&& source, predicate_t&& predicate) -> bool {
72 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
73 //for (const auto& item : source_holder.get())
74 for (const auto& item : source)
75 if (predicate(item)) return true;
76 return false;
77}
78
79template<xtd::iterable source_t>
81 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<xtd::raw_type<source_t>>(source)};
82 //for (const auto& item : source_holder.get())
83 for (const auto& item : source)
84 co_yield item;
85 co_yield std::move(element);
86}
87
88template<xtd::iterable source_t>
90 for (const auto& item : source)
91 co_yield item;
92}
93
94template<xtd::iterable source_t>
96 for (const auto& item : source)
97 co_yield item;
98}
99
100template<typename value_t>
101auto xtd::linq::enumerable::as_enumerable(std::initializer_list<value_t> source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
102 for (const auto& item : source)
103 co_yield item;
104}
105
106template<std::forward_iterator iterator_t>
107auto xtd::linq::enumerable::as_enumerable(iterator_t first, iterator_t last) noexcept -> xtd::collections::generic::enumerable_generator<typename std::decay<decltype(*first)>::type> {
108 for (auto iterator = first; iterator != last; ++iterator)
109 co_yield *iterator;
110}
111
112template<std::forward_iterator iterator_t>
113auto xtd::linq::enumerable::as_enumerable(iterator_t iterator, xtd::usize length) noexcept -> xtd::collections::generic::enumerable_generator<typename std::decay<decltype(*iterator)>::type> {
114 return as_enumerable(iterator, iterator + length);
115}
116
117template<typename value_t, xtd::usize length>
119 return as_enumerable(array, array + length);
120}
121
122template<typename value_t, xtd::usize length>
124 return as_enumerable(array, array + length);
125}
126
127template<typename value_t, typename container_t>
128auto xtd::linq::enumerable::as_enumerable(const std::queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
129 struct accessor : public std::queue<value_t> {static auto get() {return &accessor::c;}};
130 const auto& underlying_items = source.*accessor::get();
131 return as_enumerable(underlying_items.begin(), underlying_items.end());
132}
133template<typename value_t, typename container_t>
134auto xtd::linq::enumerable::as_enumerable(std::queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
135 struct accessor : public std::queue<value_t> {static auto get() {return &accessor::c;}};
136 const auto& underlying_items = source.*accessor::get();
137 return as_enumerable(underlying_items.begin(), underlying_items.end());
138}
139template<typename value_t, typename container_t>
140auto xtd::linq::enumerable::as_enumerable(const std::priority_queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
141 struct accessor : public std::priority_queue<value_t> {static auto get() {return &accessor::c;}};
142 const auto& underlying_items = source.*accessor::get();
143 return as_enumerable(underlying_items.begin(), underlying_items.end());
144}
145template<typename value_t, typename container_t>
146auto xtd::linq::enumerable::as_enumerable(std::priority_queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
147 struct accessor : public std::priority_queue<value_t> {static auto get() {return &accessor::c;}};
148 const auto& underlying_items = source.*accessor::get();
149 return as_enumerable(underlying_items.begin(), underlying_items.end());
150}
151template<typename value_t, typename container_t>
152auto xtd::linq::enumerable::as_enumerable(const std::stack<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
153 struct accessor : public std::stack<value_t> {static auto get() {return &accessor::c;}};
154 const auto& underlying_items = source.*accessor::get();
155 return as_enumerable(underlying_items.begin(), underlying_items.end());
156}
157template<typename value_t, typename container_t>
158auto xtd::linq::enumerable::as_enumerable(std::stack<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
159 struct accessor : public std::stack<value_t> {static auto get() {return &accessor::c;}};
160 const auto& underlying_items = source.*accessor::get();
161 return as_enumerable(underlying_items.begin(), underlying_items.end());
162}
163
164template<xtd::iterable source_t>
166auto xtd::linq::enumerable::average(source_t&& source) -> xtd::decimal {
167 auto average = .0l;
168 auto count = 0;
169 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
170 //for (const auto& item : source_holder.get())
171 for (const auto& item : source) {
172 average += item;
173 ++count;
174 }
176 return average / count;
177}
178
179template<xtd::iterable source_t>
181auto xtd::linq::enumerable::average(source_t&& source) -> double {
182 auto average = .0;
183 auto count = 0;
184 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
185 //for (const auto& item : source_holder.get())
186 for (const auto& item : source) {
187 average += item;
188 ++count;
189 }
191 return average / count;
192}
193
194template<xtd::iterable source_t>
196auto xtd::linq::enumerable::average(source_t&& source) -> xtd::single {
197 auto average = .0f;
198 auto count = 0;
199 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
200 //for (const auto& item : source_holder.get())
201 for (const auto& item : source) {
202 average += item;
203 ++count;
204 }
206 return average / count;
207}
208
209template<xtd::iterable source_t>
211auto xtd::linq::enumerable::average(source_t&& source) -> double {
212 auto average = .0;
213 auto count = 0;
214 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
215 //for (const auto& item : source_holder.get())
216 for (const auto& item : source) {
217 average += item;
218 ++count;
219 }
221 return average / count;
222}
223
224template<xtd::iterable source_t>
226auto xtd::linq::enumerable::average(source_t&& source) -> double {
227 auto average = .0;
228 auto count = 0;
229 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
230 //for (const auto& item : source_holder.get())
231 for (const auto& item : source) {
232 average += item;
233 ++count;
234 }
236 return average / count;
237}
238
239template<xtd::iterable source_t>
240requires std::same_as<xtd::iterable_value_type<source_t>, xtd::optional<xtd::decimal>>
242 auto average = .0l;
243 auto count = 0;
244 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
245 //for (const auto& item : source_holder.get())
246 for (const auto& item : source) {
247 if (!item) continue;
248 average += *item;
249 ++count;
250 }
251 return count == 0 ? xtd::nullopt : std::make_optional(average / count);
252}
253
254template<xtd::iterable source_t>
255requires std::same_as<xtd::iterable_value_type<source_t>, xtd::optional<double>>
256auto xtd::linq::enumerable::average(source_t&& source) -> xtd::optional<double> {
257 auto average = .0;
258 auto count = 0;
259 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
260 //for (const auto& item : source_holder.get())
261 for (const auto& item : source) {
262 if (!item) continue;
263 average += *item;
264 ++count;
265 }
266 return count == 0 ? xtd::nullopt : std::make_optional(average / count);
267}
268
269template<xtd::iterable source_t>
270requires std::same_as<xtd::iterable_value_type<source_t>, xtd::optional<xtd::single>>
272 auto average = .0f;
273 auto count = 0;
274 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
275 //for (const auto& item : source_holder.get())
276 for (const auto& item : source) {
277 if (!item) continue;
278 average += *item;
279 ++count;
280 }
281 return count == 0 ? xtd::nullopt : std::make_optional(average / count);
282}
283
284template<xtd::iterable source_t>
285requires std::same_as<xtd::iterable_value_type<source_t>, xtd::optional<xtd::int32>>
286auto xtd::linq::enumerable::average(source_t&& source) -> xtd::optional<double> {
287 auto average = .0;
288 auto count = 0;
289 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
290 //for (const auto& item : source_holder.get())
291 for (const auto& item : source) {
292 if (!item) continue;
293 average += *item;
294 ++count;
295 }
296 return count == 0 ? xtd::nullopt : std::make_optional(average / count);
297}
298
299template<xtd::iterable source_t>
300requires std::same_as<xtd::iterable_value_type<source_t>, xtd::optional<xtd::int64>>
301auto xtd::linq::enumerable::average(source_t&& source) -> xtd::optional<double> {
302 auto average = .0;
303 auto count = 0;
304 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
305 //for (const auto& item : source_holder.get())
306 for (const auto& item : source) {
307 if (!item) continue;
308 average += *item;
309 ++count;
310 }
311 return count == 0 ? xtd::nullopt : std::make_optional(average / count);
312}
313
314template<xtd::iterable first_t,xtd::iterable second_t>
316 //auto first_holder = __xtd_enumerable_holder<xtd::raw_type<first_t>> {std::forward<first_t>(first)};
317 //auto second_holder = __xtd_enumerable_holder<xtd::raw_type<second_t>> {std::forward<second_t>(second)};
318 //for (const auto& item : first_holder.get())
319 // co_yield item;
320 //for (const auto& item : second_holder.get())
321 // co_yield item;
322 for (const auto& item : first)
323 co_yield item;
324 for (const auto& item : second)
325 co_yield item;
326}
327
328template<xtd::iterable source_t>
329auto xtd::linq::enumerable::contains(source_t&& source, const xtd::iterable_value_type<source_t>& value) noexcept -> bool {
330 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
331 //for (const auto& item : source_holder.get())
332 for (const auto& item : source)
333 if (item == value) return true;
334 return false;
335}
336
337template<xtd::iterable source_t>
338auto xtd::linq::enumerable::contains(source_t&& source, const xtd::iterable_value_type<source_t>& value, const iequality_comparer<xtd::iterable_value_type<source_t>>& comparer) noexcept -> bool {
339 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
340 //for (const auto& item : source_holder.get())
341 for (const auto& item : source)
342 if (comparer.equals(item, value)) return true;
343 return false;
344}
345
346template<xtd::iterable source_t, xtd::func_callable<bool, xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>> equater_t>
347auto xtd::linq::enumerable::contains(source_t&& source, const xtd::iterable_value_type<source_t>& value, equater_t&& equater) noexcept -> bool {
348 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
349 //for (const auto& item : source_holder.get())
350 for (const auto& item : source)
351 if (equater(item, value)) return true;
352 return false;
353}
354
355template<xtd::iterable source_t>
356auto xtd::linq::enumerable::count(source_t&& source) noexcept -> xtd::usize {
357 auto count = xtd::usize {0};
358 auto enumerator = source.get_enumerator();
359 while (enumerator.move_next()) ++count;
360 return count;
361}
362
363template<xtd::iterable source_t, xtd::predicate_callable<xtd::iterable_value_type<source_t>> predicate_t>
364auto xtd::linq::enumerable::count(source_t&& source, predicate_t&& predicate) noexcept -> xtd::usize {
365 return where(std::forward<source_t>(source), predicate).count();
366}
367
368template<xtd::iterable source_t>
369auto xtd::linq::enumerable::count(source_t&& source, xtd::iterable_value_type<source_t>&& value) noexcept -> xtd::usize {
370 return count(std::forward<source_t>(source), [value](const xtd::iterable_value_type<source_t>& item) -> bool {return item == value;});
371}
372
373template<typename key_t, xtd::iterable source_t, xtd::callable<key_t, xtd::iterable_value_type<source_t>> key_selector_t>
375 return count_by<key_t>(std::forward<source_t>(source), key_selector, [](auto&& a, auto&& b) {return xtd::collections::generic::equality_comparer<key_t>::default_equality_comparer().equals(a, b);});
376 //return count_by<key_t>(std::forward<source_t>(source), key_selector, xtd::collections::generic::equality_comparer<key_t>::default_equality_comparer());
377}
378
379template<typename key_t, xtd::iterable source_t, xtd::callable<key_t, xtd::iterable_value_type<source_t>> key_selector_t>
380auto xtd::linq::enumerable::count_by(source_t&& source, key_selector_t&& key_selector, const iequality_comparer<key_t>& key_comparer) noexcept -> xtd::collections::generic::enumerable_generator<xtd::collections::generic::key_value_pair<key_t, xtd::usize>> {
381 return count_by<key_t>(std::forward<source_t>(source), key_selector, [&key_comparer](auto&& a, auto&& b) {return key_comparer.equals(a, b);});
382}
383
384template<xtd::iterable source_t>
387 //return default_if_empty(std::forward<source_t>(source), std::forward<xtd::iterable_value_type<source_t>>(default_value));
388 if (!any(source)) co_yield default_value;
389 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
390 //else for (const auto& item : source_holder.get())
391 else for (const auto& item : source)
392 co_yield item;
393}
394
395template<xtd::iterable source_t>
397 if (!any(source)) co_yield default_value;
398 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
399 //else for (const auto& item : source_holder.get())
400 else for (const auto& item : source)
401 co_yield item;
402}
403
404template<xtd::iterable source_t, xtd::predicate_callable<xtd::iterable_value_type<source_t>> prediacte_t>
405auto xtd::linq::enumerable::first_or_default(source_t&& source, prediacte_t&& predicate, xtd::iterable_value_type<source_t>&& default_value) noexcept -> xtd::iterable_value_type<source_t> {
406 auto result = where(std::forward<source_t>(source), std::forward<prediacte_t>(predicate));
407 return any(result) ? *result.begin() : std::move(default_value);
408}
409
410template<xtd::iterable source_t, xtd::predicate_callable<xtd::iterable_value_type<source_t>> prediacte_t>
411auto xtd::linq::enumerable::first_or_default(source_t&& source, prediacte_t&& predicate) noexcept -> xtd::iterable_value_type<source_t> {
412 return first_or_default(std::forward<source_t>(source), std::forward<prediacte_t>(predicate), xtd::iterable_value_type<source_t> {});
413}
414
415template<xtd::iterable source_t>
417 return any(std::forward<source_t>(source)) ? *source.begin() : std::move(default_value);
418}
419
420template<xtd::iterable source_t>
422 return first_or_default(std::forward<source_t>(source), xtd::iterable_value_type<source_t> {});
423}
424
425template<xtd::iterable source_t>
427 return as_enumerable(source);
428}
429
430template<xtd::iterable source_t>
432 return as_enumerable(source);
433}
434
435template<typename value_t>
436auto xtd::linq::enumerable::from(std::initializer_list<value_t> source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
437 return as_enumerable(source);
438}
439
440template<std::forward_iterator iterator_t>
441auto xtd::linq::enumerable::from(iterator_t first, iterator_t last) noexcept -> xtd::collections::generic::enumerable_generator<typename std::decay<decltype(*first)>::type> {
442 return as_enumerable(first, last);
443}
444
445template<std::forward_iterator iterator_t>
446auto xtd::linq::enumerable::from(iterator_t iterator, xtd::usize length) noexcept -> xtd::collections::generic::enumerable_generator<typename std::decay<decltype(*iterator)>::type> {
447 return as_enumerable(iterator, length);
448}
449
450template<typename value_t, xtd::usize length>
451auto xtd::linq::enumerable::from(const value_t (&array)[length]) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
452 return as_enumerable(array);
453}
454
455template<typename value_t, xtd::usize length>
457 return as_enumerable(array);
458}
459
460template<typename value_t, typename container_t>
461auto xtd::linq::enumerable::from(const std::queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
462 return as_enumerable(source);
463}
464
465template<typename value_t, typename container_t>
466auto xtd::linq::enumerable::from(std::queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
467 return as_enumerable(source);
468}
469
470template<typename value_t, typename container_t>
471auto xtd::linq::enumerable::from(const std::priority_queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
472 return as_enumerable(source);
473}
474
475template<typename value_t, typename container_t>
476auto xtd::linq::enumerable::from(std::priority_queue<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
477 return as_enumerable(source);
478}
479
480template<typename value_t, typename container_t>
481auto xtd::linq::enumerable::from(const std::stack<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
482 return as_enumerable(source);
483}
484
485template<typename value_t, typename container_t>
486auto xtd::linq::enumerable::from(std::stack<value_t, container_t>& source) noexcept -> xtd::collections::generic::enumerable_generator<value_t> {
487 return as_enumerable(source);
488}
489
490template<xtd::iterable source_t>
494 for (const auto& item : source)
495 if (!result || item > result) result = item;
496 return result.value_or(xtd::iterable_value_type<source_t> {});
497}
498
499template<xtd::iterable source_t, xtd::callable<xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>> selector_t>
501auto xtd::linq::enumerable::max(source_t&& source, selector_t&& selector) -> xtd::iterable_value_type<source_t> {
503 for (const auto& item : source) {
504 auto val = selector(item);
505 if (!result || val > result) result = val;
506 }
507 return result.value_or(xtd::iterable_value_type<source_t> {});
508}
509
510template<typename result_t, xtd::iterable source_t, xtd::callable<result_t, xtd::iterable_value_type<source_t>> selector_t>
512auto xtd::linq::enumerable::max(source_t&& source, selector_t&& selector) -> result_t {
513 auto result = xtd::optional<result_t> {};
514 for (const auto& item : source) {
515 auto val = selector(item);
516 if (!result || val > result) result = val;
517 }
518 return result.value_or(result_t {});
519}
520
521template<typename result_t, xtd::iterable source_t>
523 auto index = xtd::usize {0};
524 //auto source_holder = __xtd_enumerable_holder<source_t> {std::forward<source_t>(source)};
525 //for (const auto& item : source_holder.get())
526 for (const auto& item : source)
527 co_yield invoke_selector_with_optional_index<result_t>(selector, item, index++);
528}
529
530template<xtd::iterable source_t>
532 auto index = xtd::usize {0};
533 //auto source_holder = __xtd_enumerable_holder<xtd::raw_type<source_t>> {std::forward<source_t>(source)};
534 //for (const auto& item : source_holder.get())
535 for (const auto& item : source)
536 co_yield invoke_selector_with_optional_index<xtd::iterable_value_type<source_t>>(selector, item, index++);
537}
538
539template<typename predicate_t, typename value_t>
540constexpr auto xtd::linq::enumerable::invoke_predicate_with_optional_index(predicate_t&& predicate, value_t&& value, xtd::usize index) -> bool {
541 if constexpr (xtd::func_callable<predicate_t, bool, xtd::raw_type<value_t>, xtd::usize>) return predicate(std::forward<value_t>(value), index);
542 else if constexpr (xtd::predicate_callable<predicate_t, xtd::raw_type<value_t>>) return predicate(std::forward<value_t>(value));
543 else static_assert(always_false_v<predicate_t>, "Predicate must accept either (value) or (value, index).");
544}
545
546template<typename result_t, typename selector_t, typename value_t>
547auto xtd::linq::enumerable::invoke_selector_with_optional_index(selector_t&& selector, value_t&& value, xtd::usize index) -> result_t {
548 if constexpr (xtd::callable<selector_t, xtd::raw_type<result_t>, xtd::raw_type<value_t>, xtd::usize>) return selector(std::forward<value_t>(value), index);
549 if constexpr (xtd::callable<selector_t, xtd::raw_type<result_t>, xtd::raw_type<value_t>>) return selector(std::forward<value_t>(value));
550 else static_assert(always_false_v<selector_t>, "Selector must accept either (value) or (value, index).");
551}
Represents an enumerable generator that supports deferred, lazy iteration over a collection of a spec...
Definition enumerable_generator.hpp:44
static auto default_equality_comparer() -> const equality_comparer &
Gets the default equality comparer for the type specified by the generic argument.
Definition equality_comparer.hpp:42
static auto throws(xtd::helpers::exception_case exception_case, const source_location &location=source_location::current()) -> void
Throws an exption with specified exception case.
static auto concat(first_t &&first, second_t &&second) noexcept -> xtd::collections::generic::enumerable_generator< xtd::iterable_value_type< first_t > >
Concatenates two sequences.
static auto first_or_default(source_t &&source, prediacte_t &&predicate, xtd::iterable_value_type< source_t > &&default_value) noexcept -> xtd::iterable_value_type< source_t >
Returns the first element of the sequence that satisfies a condition, or a specified default value if...
static auto select(source_t &&source, auto &&selector) -> xtd::collections::generic::enumerable_generator< result_t >
Projects each element of a sequence into a new form.
static auto default_if_empty(source_t &&source) noexcept -> xtd::collections::generic::enumerable_generator< xtd::iterable_value_type< source_t > >
Returns the elements of the specified sequence or the type parameter's default value in a singleton c...
static auto contains(source_t &&source, const xtd::iterable_value_type< source_t > &value) noexcept -> bool
Determines whether a sequence contains a specified element by using the default equality comparer.
static auto count_by(source_t &&source, key_selector_t &&key_selector) noexcept -> xtd::collections::generic::enumerable_generator< xtd::collections::generic::key_value_pair< key_t, xtd::usize > >
Returns the count of elements in the source sequence grouped by key.
static auto all(source_t &&source, predicate_t &&predicate) -> bool
Determines whether all elements of a sequence satisfy a condition.
static auto from(source_t &&source) noexcept
Returns the input typed as xtd::collections::generic::ienumerable <type_t>.
static auto aggregate(source_t &&source, func_t &&func) -> xtd::iterable_value_type< source_t >
Applies an accumulator function over a sequence.
static auto as_enumerable(source_t &&source) noexcept
Returns the input typed as xtd::collections::generic::ienumerable <type_t>.
static auto average(source_t &&source) -> xtd::decimal
Computes the average of a sequence of xtd::decimal values.
static auto append(source_t &&source, xtd::iterable_value_type< source_t > &&element) noexcept -> xtd::collections::generic::enumerable_generator< xtd::iterable_value_type< source_t > >
Appends a value to the end of the sequence.
static auto count(source_t &&source) noexcept -> xtd::usize
Returns the number of elements in a sequence.
static auto max(source_t &&source) -> xtd::iterable_value_type< source_t >
Returns the maximum value in a sequence of xtd::numeric values.
static auto any(source_t &&source) noexcept -> bool
Determines whether a sequence contains any elements.
virtual auto equals(const object &obj) const noexcept -> bool
Determines whether the specified object is equal to the current object.
Contains xtd::collections::generic::extensions::enumerable <type_t> class.
Definition callable.hpp:11
Definition func_callable.hpp:11
Definition numeric.hpp:12
Definition predicate_callable.hpp:11
Definition real_decimal.hpp:13
Definition real_double.hpp:13
Definition real_single.hpp:13
Definition signed_integer_32.hpp:13
Definition signed_integer_64.hpp:14
Contains xtd::collections::generic::enumerable_generator <> class.
Contains xtd::linq::from methods.
generic::enumerator< xtd::any_object > enumerator
Supports a simple iteration over a non-generic collection.
Definition enumerator.hpp:28
xtd::collections::generic::comparer< xtd::any_object > comparer
Exposes a method that compares two objects.
Definition comparer.hpp:25
xtd::raw_type< decltype(*std::begin(std::declval< iterable_t & >()))> iterable_value_type
Represents the orward iterable value type.
Definition iterable_value_type.hpp:29
xtd::delegate< result_t(arguments_t... arguments)> func
Represents a delegate that has variables parameters and returns a value of the type specified by the ...
Definition func.hpp:27
@ value
Represnets the constant operator precedence (42).
Definition operator_precedence.hpp:30
@ invalid_operation
The operation is not valid.
Definition exception_case.hpp:65
constexpr auto where
The xtd::ranges::views::where instance.
Definition where.hpp:40
long double decimal
Represents a decimal-precision floating-point number.
Definition decimal.hpp:23
std::optional< type_t > optional
Represents the optional alias on std::optional.
Definition optional.hpp:26
std::size_t usize
Represents an unsigned size of any object in bytes.
Definition usize.hpp:22
constexpr null_opt nullopt
Represents a nullopt value. Used to indicate that an std::optional does not contain a value.
Definition nullopt.hpp:26
float single
Represents a single-precision floating-point number.
Definition single.hpp:23
std::any any
Represents the any alias on std::any.
Definition any.hpp:24
std::remove_cvref_t< value_t > raw_type
Represents a raw type alias equivalent to std::remove_cvref_t<value_t>.
Definition raw_type.hpp:25
xtd::func< bool, type_t > predicate
Represents a delegate that defines a set of criteria and determines whether the specified object meet...
Definition predicate.hpp:16
@ default_value
Default quality.
Definition compositing_quality.hpp:24
Contains xtd::linq::enumerable <type_t> class.
const xtd::collections::generic::helpers::wrap_pointer_iterator< pointer > iterator
Represents the iterator of read_only_span value type.
Definition read_only_span.hpp:70
auto last() const -> read_only_span< type_t, count >
Obtains a subspan consisting of the last N elements of the sequence.
Definition read_only_span.hpp:273
Contains xtd::nullopt valiue.
bool move_next() override
Advances the enumerator to the next element of the collection.
Definition enumerator.hpp:72