xtd 1.0.0
Loading...
Searching...
No Matches
list.hpp
Go to the documentation of this file.
1
4#pragma once
6#include "helpers/equator.hpp"
7#include "helpers/lesser.hpp"
9#include "comparer.hpp"
10#include "enumerable.hpp"
11#include "ilist.hpp"
12#define __XTD_CORE_INTERNAL__
14#undef __XTD_CORE_INTERNAL__
16#include "../../action.hpp"
17#include "../../comparison.hpp"
18#include "../../converter.hpp"
19#include "../../intptr.hpp"
20#include "../../is.hpp"
21#include "../../object.hpp"
22#include "../../optional.hpp"
23#include "../../new_ptr.hpp"
24#include "../../predicate.hpp"
25#include "../../raw_type.hpp"
26#include "../../self.hpp"
27#include "../../string.hpp"
28
30namespace xtd {
32 namespace collections {
34 namespace generic {
81 template<typename type_t, typename allocator_t>
82 class list : public xtd::object, public xtd::collections::generic::ilist<type_t>, public xtd::iequatable<xtd::collections::generic::list<type_t, allocator_t >> {
83 public:
85
102 using const_pointer = const value_type*;
106
108
118 list() noexcept = default;
125 explicit list(size_type capacity) {self_.capacity(capacity);}
133 list(const xtd::collections::generic::ienumerable<type_t>& collection) requires std::copy_constructible<type_t> {
134 for (const auto& value : collection)
135 data_->items.push_back(value);
136 }
137
139 template<xtd::iterable iterable_t>
140 list(iterable_t&& items) {
141 for (const auto& item : items)
142 data_->items.push_back(item);
143 }
144
146 list(list& list) requires std::copy_constructible<type_t> {*data_ = *list.data_;}
149 list(const list& list) requires std::copy_constructible<type_t> {*data_ = *list.data_;}
153 data_ = std::move(list.data_);
154 list.data_ = new_ptr<list_data>();
155 }
156
158 list(const base_type& list) requires std::copy_constructible<type_t> {data_->items = list;}
161 list(base_type&& list) {data_->items = std::move(list);}
164 list(std::initializer_list<type_t> items) requires std::copy_constructible<type_t> {add_range(items);}
168 template <std::input_iterator input_iterator_t>
169 list(input_iterator_t first, input_iterator_t last) requires std::copy_constructible<type_t> {
170 for (auto iterator = first; iterator != last; ++iterator)
171 add(*iterator);
172 }
173
174
176
200 [[nodiscard]] auto capacity() const noexcept -> size_type {return data_->items.capacity();}
224 auto capacity(size_type value) -> void {
227 if (value == capacity()) return;
228 if (value < capacity()) data_->items.shrink_to_fit();
229 data_->items.reserve(value);
230 }
231
253 [[nodiscard]] auto count() const noexcept -> size_type override {return data_->items.size();}
254
258 [[nodiscard]] auto data() noexcept -> pointer override {return reinterpret_cast<pointer>(data_->items.data());}
262 [[nodiscard]] auto data() const noexcept -> const_pointer {return reinterpret_cast<const_pointer>(data_->items.data());}
263
266 [[nodiscard]] const auto& items() const noexcept {return data_->items;}
269 [[nodiscard]] auto& items() noexcept {return data_->items;}
271
273
288 auto add(const type_t& item) -> void override {
289 if constexpr (std::copy_constructible<type_t>) data_->items.push_back(item);
290 else xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "value_type is not copy constructible.");
291 }
292
305 auto add(type_t&& item) -> void {data_->items.push_back(std::forward<type_t>(item));}
306
315 auto add_range(const xtd::collections::generic::ienumerable<type_t>& enumerable) -> void requires std::copy_constructible<type_t> {insert_range(count(), enumerable);}
316
325 auto add_range(std::initializer_list<type_t> il) -> void requires std::copy_constructible<type_t> {insert_range(count(), il);}
326
328 template<typename enumerable_t>
329 auto add_range(const enumerable_t& enumerable) -> void requires std::copy_constructible<type_t> {insert_range(count(), enumerable);}
331
336 [[nodiscard]] auto as_read_only() const noexcept -> read_only_collection requires std::copy_constructible<type_t> {return read_only_collection {self_};}
337
351 [[nodiscard]] auto binary_search(const type_t& item) const noexcept -> xtd::usize {return binary_search(0, count(), item, xtd::collections::generic::comparer<type_t>::default_comparer);}
363 [[nodiscard]] auto binary_search(const type_t& item, const xtd::collections::generic::icomparer<type_t>& comparer) const noexcept -> xtd::usize {return binary_search(0, count(), item, comparer);}
378 [[nodiscard]] auto binary_search(xtd::usize index, xtd::usize count, const type_t& item, const xtd::collections::generic::icomparer<type_t>& comparer) const -> xtd::usize {
380 auto first = data_->items.begin();
381 auto last = data_->items.begin();
382 std::advance(first, index);
383 std::advance(last, index + count);
384 auto position = std::lower_bound(first, last, item, helpers::lesser<type_t> {comparer});
385
386 if (position != data_->items.end() && !comparer.compare(item, *position))
387 return std::distance(data_->items.begin(), position);
388 return ~std::distance(data_->items.begin(), position);
389 }
390
395 auto clear() -> void override {data_->items.clear();}
396
400 [[nodiscard]] auto contains(const type_t& value) const noexcept -> bool override {
401 return index_of(value) != npos;
402 }
403
411 template<typename output_t, typename converter_t>
412 [[nodiscard]] auto convert_all(converter_t converter) const -> list<output_t> {
413 auto result = list<output_t> {};
414 auto apply_converter = xtd::converter<output_t, const type_t&> {converter};
415 for (const auto& item : self_)
416 result.add(apply_converter(item));
417 return result;
418 }
419
429 auto copy_to(xtd::array<type_t>& array) const -> void requires std::copy_constructible<type_t> {copy_to(0, array, 0, count());}
437 auto copy_to(xtd::array<type_t>& array, size_type array_index) const -> void override {
438 if constexpr (std::copy_constructible<type_t>) copy_to(0, array, array_index, count());
439 else xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "value_type is not copy constructible.");
440 }
441
454 auto copy_to(size_type index, xtd::array<type_t>& array, size_type array_index, size_type count) const -> void requires std::copy_constructible<type_t> {
456 for (auto i = index; i < (index + count); ++i)
457 array[array_index++] = self_[i];
458 }
459
465 data_->items.reserve(capacity);
466 return self_.capacity();
467 }
468
475 [[nodiscard]] auto equals(const object& obj) const noexcept -> bool override {return is<list<value_type>>(obj) && equals(static_cast<const list<value_type>& > (obj));}
479 [[nodiscard]] auto equals(const list& obj) const noexcept -> bool override {
480 if (count() != obj.count()) return false;
481 for (size_type i = 0; i < count(); i++)
482 if (!helpers::equator<type_t> {}(self_[i], obj[i])) return false;
483 return true;
484 }
485
497 template<typename predicate_t>
498 [[nodiscard]] auto exists(predicate_t match) const -> bool {
499 return find_index(match) != npos;
500 }
501
513 template<typename predicate_t>
514 [[nodiscard]] auto find(predicate_t match) const -> optional<type_t> {
515 auto index = find_index(match);
516 if (index == npos) return nullopt;
517 return self_[index];
518 }
519
531 template<typename predicate_t>
532 [[nodiscard]] auto find_all(predicate_t match) const -> list {
534 auto result = list {};
535 for (const auto& item : self_)
536 if (predicate(item)) result.add(item);
537 return result;
538 }
539
545 template<typename predicate_t>
546 [[nodiscard]] auto find_index(predicate_t match) const -> xtd::usize {return find_index(0, count(), match);}
554 template<typename predicate_t>
555 [[nodiscard]] auto find_index(xtd::usize start_index, predicate_t match) const -> xtd::usize {return find_index(start_index, count() - start_index, match);}
564 template<typename predicate_t>
565 [[nodiscard]] auto find_index(xtd::usize start_index, xtd::usize count, predicate_t match) const -> xtd::usize {
568 for (auto index = start_index; index < start_index + count; ++index)
569 if (predicate(self_[index])) return index;
570 return npos;
571 }
572
584 template<typename predicate_t>
585 [[nodiscard]] auto find_last(predicate_t match) const -> optional<type_t> {
586 auto index = find_last_index(match);
587 if (index == npos) return nullopt;
588 return self_[index];
589 }
590
596 template<typename predicate_t>
597 [[nodiscard]] auto find_last_index(predicate_t match) const -> xtd::usize {return find_last_index(count() - 1, count(), match);}
605 template<typename predicate_t>
606 [[nodiscard]] auto find_last_index(xtd::usize start_index, predicate_t match) const -> xtd::usize {return find_last_index(start_index, start_index + 1, match);}
615 template<typename predicate_t>
616 [[nodiscard]] auto find_last_index(xtd::usize start_index, xtd::usize count, predicate_t match) const -> xtd::usize {
619 auto end_index = start_index + 1 - count;
620 for (auto index = start_index; ; --index) {
621 if (predicate(self_[index])) return index;
622 if (index == end_index) break;
623 }
624 return npos;
625 }
626
635 template<typename action_t>
636 auto for_each(action_t action) -> void {
637 auto apply_action = xtd::action<const type_t&> {action};
638 for (const auto& item : self_)
639 apply_action(item);
640 }
641
644 [[nodiscard]] enumerator<value_type> get_enumerator() const noexcept override {
645 struct list_enumerator : public ienumerator<value_type> {
646 explicit list_enumerator(const list& items, xtd::usize version) : items_(items), version_(version) {}
647
648 [[nodiscard]] const value_type& current() const override {
650 if (version_ != items_.data_->items.version()) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "Collection was modified; enumeration operation may not execute.");
651 return items_[index_];
652 }
653
654 [[nodiscard]] bool move_next() override {
655 if (version_ != items_.data_->items.version()) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "Collection was modified; enumeration operation may not execute.");
656 return ++index_ < items_.count();
657 }
658
659 void reset() override {
660 version_ = items_.data_->items.version();
661 index_ = list::npos;
662 }
663
664 private:
665 size_type index_ = list::npos;
666 const list& items_;
667 size_type version_ = 0;
668 };
669
670 return {new_ptr<list_enumerator>(self_, data_->items.version())};
671 }
672
685 [[nodiscard]] auto get_range(size_type index, size_type count) -> list {
687 return list<type_t> {data_->items.begin() + index, data_->items.begin() + index + count};
688 }
689
693 [[nodiscard]] auto index_of(const type_t& value) const noexcept -> size_type override {
694 if (count() == 0) return npos;
695 return index_of(value, 0, count());
696 }
697
702 [[nodiscard]] auto index_of(const type_t& value, size_type index) const -> size_type {return index_of(value, index, count() - index);}
709 [[nodiscard]] auto index_of(const type_t& value, size_type index, size_type count) const -> size_type {
710 return find_index(index, count, delegate_(const auto& n) {return helpers::equator<type_t> {}(n, value);});
711 }
712
718 auto insert(size_type index, const type_t& value) -> void override {
719 if constexpr (std::copy_constructible<type_t>) {
721 data_->items.insert(data_->items.begin() + index, value);
722 } else xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "value_type is not copy constructible.");
723 }
724
729 auto insert(size_type index, type_t&& value) -> void {
731 data_->items.insert(data_->items.begin() + index, std::forward<type_t>(value));
732 }
733
745
746 // If the collection is this instance, it must be copied to avoid an infinite loop.
747 if (static_cast<const void*>(&enumerable) == static_cast<const void*>(this)) {
749 return;
750 }
751
752 data_->items.insert(data_->items.begin() + index, enumerable.begin(), enumerable.end());
753 }
754
763 auto insert_range(size_type index, const std::initializer_list<type_t>& items) -> void {
765 data_->items.insert(data_->items.begin() + index, items.begin(), items.end());
766 }
767
769 template<typename collection_t>
770 auto insert_range(size_type index, const collection_t& items) -> void {
772
773 // If the collection is this instance, it must be copied to avoid an infinite loop.
774 if (static_cast<const void*>(&items) == static_cast<const void*>(this)) {
775 insert_range(index, list(items));
776 return;
777 }
778
779 data_->items.insert(data_->items.begin() + index, items.begin(), items.end());
780 }
782
786 [[nodiscard]] auto last_index_of(const type_t& value) const noexcept -> size_type {
787 if (count() == 0) return npos;
788 return last_index_of(value, count() - 1, count());
789 }
790
795 [[nodiscard]] auto last_index_of(const type_t& value, size_type index) const -> size_type {
796 return last_index_of(value, index, index + 1);
797 }
804 [[nodiscard]] auto last_index_of(const type_t& value, size_type index, size_type count) const -> size_type {
805 return find_last_index(index, count, delegate_(const auto& n) {return helpers::equator<type_t> {}(n, value);});
806 }
807
813 auto remove(const type_t& item) noexcept -> bool override {
814 auto index = index_of(item);
815 if (index == npos) return false;
816 remove_at(index);
817 return true;
818 }
819
831 template<typename predicate_t>
832 auto remove_all(predicate_t match) -> xtd::usize {
834 auto count = xtd::usize {0};
835 auto iterator = data_->items.begin();
836 while (iterator != data_->items.end())
837 if (!predicate(*iterator)) iterator++;
838 else {
839 iterator = data_->items.erase(iterator);
840 ++count;
841 }
842 return count;
843 }
844
848 auto remove_at(size_type index) -> void override {
850 data_->items.erase(data_->items.begin() + index);
851 }
852
861 auto remove_range(size_type index, size_type count) -> void {
863 data_->items.erase(data_->items.begin() + index, data_->items.begin() + index + count);
864 }
865
871 virtual auto resize(size_type count) -> void {
872 if constexpr (std::copy_constructible<type_t>) {
873 resize(count, value_type {});
874 } else xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "value_type is not copy constructible.");
875 }
882 virtual auto resize(size_type count, const value_type& value) -> void {
883 if constexpr (std::copy_constructible<type_t>) {
885 if (count == self_.count()) return;
886 data_->items.resize(count, value);
887 } else xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "value_type is not copy constructible.");
888 }
889
896 auto reverse() -> list<type_t>& {return reverse(0, count());}
908 data_->items.increment_version();
909 std::reverse(data_->items.begin() + index, data_->items.begin() + index + count);
910 return self_;
911 }
912
918 [[nodiscard]] auto slice(size_type start, size_type length) const -> list<type_t> requires std::copy_constructible<type_t> {
920 return list<type_t> {data_->items.begin() + start, data_->items.begin() + start + length};
921 }
922
933
940 data_->items.increment_version();
941 std::sort(data_->items.begin(), data_->items.end(), [&](const type_t& x, const type_t& y) {return comparison(x, y) < 0;});
942 return self_;
943 }
944
953
964 data_->items.increment_version();
965 std::sort(data_->items.begin() + index, data_->items.begin() + index + count, helpers::lesser<type_t> {comparer});
966 return self_;
967 }
968
976 [[nodiscard]] auto to_array() const noexcept -> xtd::array<value_type> requires std::copy_constructible<type_t> {return count() ? xtd::array<value_type>(data_->items.begin(), data_->items.end()) : xtd::array<value_type> {};}
977
980 [[nodiscard]] auto to_string() const noexcept -> xtd::string override {return xtd::string::format("[{}]", xtd::string::join(", ", self_));}
981
1002 auto trim_excess() -> void {data_->items.shrink_to_fit();}
1003
1015 template<typename prediacate_t>
1016 [[nodiscard]] auto true_for_all(prediacate_t match) const -> bool {
1018 for (const auto& item : self_)
1019 if (!predicate(item)) return false;
1020 return true;
1021 }
1022
1023
1025
1030 auto operator =(const list& other) -> list& requires std::copy_constructible<type_t> = default;
1034 auto operator =(list&& other) noexcept -> list& {
1035 data_->items = std::move(other.data_->items);
1036 return self_;
1037 }
1038
1041 auto operator =(const std::initializer_list<type_t>& items) -> list& requires std::copy_constructible<type_t> {
1042 data_->items = items;
1043 return self_;
1044 }
1045
1046 using xtd::collections::generic::ilist<type_t>::operator [];
1047 using xtd::collections::generic::ilist<type_t>::operator ();
1052 auto operator [](size_type index) const -> const_reference override {
1054 return data_->items[index];
1055 }
1056
1060 auto operator [](size_type index) -> reference override {
1062 return data_->items[index];
1063 }
1064
1067 operator const_base_type& () const noexcept {return data_->items;}
1070 operator base_type& () noexcept {return data_->items;}
1072
1073 private:
1074 auto is_fixed_size() const noexcept -> bool override {return false;}
1075 auto is_read_only() const noexcept -> bool override {return false;}
1076 auto is_synchronized() const noexcept -> bool override {return false;}
1077 const xtd::object& sync_root() const noexcept override {return data_->sync_root;}
1078
1079 struct list_data {
1080 xtd::collections::generic::helpers::raw_array<value_type, allocator_t> items;
1081 xtd::object sync_root;
1082 };
1083
1085 };
1086
1088 // Deduction guides for xtd::collections::generic::list
1089 // {
1090 template<typename type_t>
1091 list(std::initializer_list<type_t>) -> list<type_t>;
1092
1093 template<typename type_t>
1095
1096 template<xtd::iterable iterable_t>
1098
1099 template<typename type_t>
1100 list(const ilist<type_t>&) -> list<type_t>;
1101
1102 template<typename type_t>
1103 list(const std::vector<type_t>&) -> list<type_t>;
1104
1105 template<typename type_t, typename allocator_t = helpers::allocator<type_t>>
1107
1108 template<typename type_t, typename allocator_t = helpers::allocator<type_t>>
1110
1111 template<typename type_t>
1112 list(std::vector<type_t>&&) -> list<type_t>;
1113
1114 template<typename type_t, typename allocator_t = helpers::allocator<type_t>>
1116
1117 template<typename input_iterator_t>
1118 list(input_iterator_t, input_iterator_t) -> list<std::iter_value_t<input_iterator_t>>;
1119 // }
1121 }
1122 }
1123}
1124
1127 template<typename source_t, typename enumerable_t>
1128 inline auto enumerable<source_t, enumerable_t>::to_list() const -> xtd::collections::generic::list<source_t> {
1129 return xtd::linq::enumerable::to_list(self());
1130 }
1131}
1132
1133template<xtd::iterable source_t>
1134auto xtd::linq::enumerable::as_enumerable(source_t&& source) noexcept {
1135 if constexpr(xtd::collections::generic::enumerable<source_t>) return std::move(source);
1137}
1138
1139template<typename key_t, xtd::iterable source_t, xtd::callable<key_t, xtd::iterable_value_type<source_t>> key_selector_t, xtd::callable<bool, key_t, key_t> key_equater_t>
1140auto xtd::linq::enumerable::count_by(source_t&& source, key_selector_t&& key_selector, key_equater_t&& key_equater) noexcept -> xtd::collections::generic::enumerable_generator<xtd::collections::generic::key_value_pair<key_t, xtd::usize>> {
1141 auto result = list<key_value_pair<key_t, xtd::usize>> {};
1142 auto keys = list<key_t> {};
1143 //auto source_holder = enumerable_holder<source_t> {std::forward<source_t>(source)};
1144 //auto enumerator = source_holder.get().get_enumerator();
1145 auto enumerator = source.get_enumerator();
1146 while (enumerator.move_next()) {
1147 auto key = key_selector(enumerator.current());
1148 auto index = xtd::usize {0};
1149 for (; index < keys.count(); ++index)
1150 if (key_equater(keys[index], key)) break;
1151 if (index < keys.count()) result[index] = {key, result[index].value() + 1};
1152 else {
1153 keys.add(key);
1154 result.add({key, 1});
1155 }
1156 }
1157
1158 for (const auto& item : result)
1159 co_yield item;
1160}
1161
1162template<xtd::iterable source_t>
1164 auto result = list<xtd::iterable_value_type<source_t>> {};
1165 //auto source_holder = enumerable_holder<source_t> {std::forward<source_t>(source)};
1166 //for (const auto& item : source_holder.get())
1167 for (const auto& item : source)
1168 if (!contains(result, item))
1169 result.add(item);
1170
1171 for (const auto& item : result)
1172 co_yield item;
1173}
1174
1175template<xtd::iterable source_t>
1176auto xtd::linq::enumerable::distinct(source_t&& source, const iequality_comparer<source_t>& comparer) noexcept -> xtd::collections::generic::enumerable_generator<xtd::iterable_value_type<source_t>> {
1177 auto result = list<xtd::iterable_value_type<source_t>> {};
1178 //auto source_holder = enumerable_holder<source_t> {std::forward<source_t>(source)};
1179 //for (const auto& item : source_holder.get())
1180 for (const auto& item : source)
1181 if (!contains(result, item, comparer))
1182 result.add(item);
1183
1184 for (const auto& item : result)
1185 co_yield item;
1186}
1187
1188template<xtd::iterable source_t, xtd::func_callable<bool, xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>> equater_t>
1190 auto result = list<xtd::iterable_value_type<source_t>> {};
1191 //auto source_holder = enumerable_holder<source_t> {std::forward<source_t>(source)};
1192 //for (const auto& item : source_holder.get())
1193 for (const auto& item : source)
1194 if (!contains(result, item, equater))
1195 result.add(item);
1196
1197 for (const auto& item : result)
1198 co_yield item;
1199}
1200
1201template<xtd::iterable source_t>
1202auto xtd::linq::enumerable::from(source_t&& source) noexcept {
1203 return as_enumerable(std::forward<source_t>(source));
1204}
1205
1206
1207template<xtd::iterable source_t, xtd::func_callable<bool, xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>> lesser_t>
1209 auto result = list<xtd::iterable_value_type<source_t>> {};
1210 //auto source_holder = enumerable_holder<source_t> {std::forward<source_t>(source)};
1211 //for (const auto& item : source_holder.get())
1212 for (const auto& item : source)
1213 result.add(item);
1214 std::sort(result.items().begin(), result.items().end(), lesser);
1215 for (const auto& item : result)
1216 co_yield item;
1217}
1218
1219template<typename key_t, xtd::iterable source_t, xtd::callable<key_t, xtd::iterable_value_type<source_t>> key_selector_t>
1221 auto result = list<xtd::iterable_value_type<source_t>> {};
1222 for (const auto& item : source)
1223 result.add(item);
1224 std::sort(result.items().begin(), result.items().end(), [key_selector](auto&& a, auto&& b) {return key_selector(a) < key_selector(b);});
1225 for (const auto& item : result)
1226 co_yield item;
1227}
1228
1229template<xtd::iterable source_t, xtd::callable<xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>> key_selector_t>
1231 auto result = list<xtd::iterable_value_type<source_t>> {};
1232 for (const auto& item : source)
1233 result.add(item);
1234 std::sort(result.items().begin(), result.items().end(), [key_selector](auto&& a, auto&& b) {return key_selector(a) < key_selector(b);});
1235 for (const auto& item : result)
1236 co_yield item;
1237}
1238
1239template<typename key_t, xtd::iterable source_t, xtd::callable<key_t, xtd::iterable_value_type<source_t>> key_selector_t>
1241 auto result = list<xtd::iterable_value_type<source_t>> {};
1242 for (const auto& item : source)
1243 result.add(item);
1244 std::sort(result.items().begin(), result.items().end(), [key_selector](auto&& a, auto&& b) {return key_selector(a) > key_selector(b);});
1245 for (const auto& item : result)
1246 co_yield item;
1247}
1248
1249template<xtd::iterable source_t, xtd::callable<xtd::iterable_value_type<source_t>, xtd::iterable_value_type<source_t>> key_selector_t>
1251 auto result = list<xtd::iterable_value_type<source_t>> {};
1252 for (const auto& item : source)
1253 result.add(item);
1254 std::sort(result.items().begin(), result.items().end(), [key_selector](auto&& a, auto&& b) {return key_selector(a) > key_selector(b);});
1255 for (const auto& item : result)
1256 co_yield item;
1257}
1258
1259template<typename value_t>
1261 return list<value_t>(source);
1262}
Contains xtd::action delegate.
Contains xtd::collections::generic::helpers::allocator alias.
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Definition array.hpp:64
virtual auto length() const noexcept -> size_type
Gets a size that represents the total number of elements in all the dimensions of the array.
Definition basic_array.hpp:122
static auto join(const basic_string &separator, const collection_t &values) noexcept -> basic_string
Definition basic_string.hpp:1259
Provides a base class for implementations of the xtd::collections::generic::icomparer <type_t> generi...
Definition comparer.hpp:33
auto compare(const first_argument_type &x, const second_argument_type &y) const -> result_type override
Compares two entities and returns a value indicating whether one is less than, equal to,...
Definition comparer.hpp:66
static const comparer< xtd::any_object > default_comparer
Definition comparer.hpp:50
Represents an enumerable generator that supports deferred, lazy iteration over a collection of a spec...
Definition enumerable_generator.hpp:44
auto to_list() const -> xtd::collections::generic::list< value_t >
Creates a xtd::collections::generic::list <type_t> from an xtd::collections::generic::ienumerable <ty...
value_t value_type
Represents the ienumerable value type.
Definition enumerable.hpp:40
internal_base_type base_type
Underlying vector type.
Definition raw_array.hpp:128
Exposes a method that compares two objects.
Definition icomparer.hpp:30
Exposes the enumerator, which supports a simple iteration over a collection of a specified type.
Definition ienumerable.hpp:40
typename xtd::collections::generic::extensions::enumerable_iterators< xtd::any_object, xtd::collections::generic::ienumerable< xtd::any_object > >::iterator iterator
Definition ienumerable.hpp:48
Supports a simple iteration over a generic collection.
Definition ienumerator.hpp:58
Represents a collection of objects that can be individually accessed by index.
Definition ilist.hpp:44
static constexpr xtd::usize npos
Definition ilist.hpp:57
virtual auto is_fixed_size() const noexcept -> bool=0
Gets a value indicating whether the xtd::collections::generic::ilist <type_t> has a fixed size.
virtual auto is_synchronized() const noexcept -> bool=0
Gets a value indicating whether access to the xtd::collections::generic::icollection <type_t> is sync...
virtual auto count() const noexcept -> xtd::usize=0
Gets the number of elements contained in the xtd::collections::generic::icollection <type_t>.
virtual auto sync_root() const noexcept -> const xtd::object &=0
Gets an object that can be used to synchronize access to the the xtd::collections::generic::icollecti...
virtual auto is_read_only() const noexcept -> bool=0
Gets a value indicating whether the xtd::collections::generic::icollection <type_t> is read-only.
Represents a strongly typed list of objects that can be accessed by index. Provides methods to search...
Definition list.hpp:82
auto last_index_of(const type_t &value, size_type index, size_type count) const -> size_type
Determines the last index of a specific item in the xtd::collections::generic::list <type_t>.
Definition list.hpp:804
auto to_array() const noexcept -> xtd::array< value_type >
Copies the elements of the xtd::collections::generic::list <type_t> to a new array.
Definition list.hpp:976
auto count() const noexcept -> size_type override
Gets the number of elements contained in the xtd::collections::generic::list <type_t>.
Definition list.hpp:253
list(std::initializer_list< type_t > items)
Constructs the container with the contents of the specified initializer list, and allocator.
Definition list.hpp:164
auto operator=(const list &other) -> list &=default
Copy assignment operator. Replaces the contents with a copy of the contents of other.
auto index_of(const type_t &value) const noexcept -> size_type override
Determines the index of a specific item in the xtd::collections::generic::list <type_t>.
Definition list.hpp:693
auto equals(const object &obj) const noexcept -> bool override
Determines whether the specified object is equal to the current object.
Definition list.hpp:475
auto find_index(xtd::usize start_index, xtd::usize count, predicate_t match) const -> xtd::usize
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:565
auto sort(xtd::comparison< const type_t & > comparison) -> list< type_t > &
Sorts the elements in the entire xtd::collections::generic::list <type_t> using the specified xtd::co...
Definition list.hpp:939
auto operator[](size_type index) const -> const_reference override
Returns a reference to the element at specified location index.
Definition list.hpp:1052
auto insert(size_type index, const type_t &value) -> void override
Determines the index of a specific item in the xtd::collections::generic::list <type_t>.
Definition list.hpp:718
list(base_type &&list)
Move constructor with specified base type list.
Definition list.hpp:161
auto sort() -> list< type_t > &
Sorts the elements in the entire xtd::collections::generic::list <type_t> using the default comparer.
Definition list.hpp:932
auto find_last_index(xtd::usize start_index, xtd::usize count, predicate_t match) const -> xtd::usize
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:616
const value_type * const_pointer
Definition list.hpp:102
const base_type const_base_type
Definition list.hpp:92
auto last_index_of(const type_t &value) const noexcept -> size_type
Determines the last index of a specific item in the xtd::collections::generic::list <type_t>.
Definition list.hpp:786
auto sort(xtd::usize index, xtd::usize count, const xtd::collections::generic::icomparer< type_t > &comparer) -> list< type_t > &
Sorts the elements in a range of elements in xtd::collections::generic::list <type_t> using the speci...
Definition list.hpp:962
auto insert(size_type index, type_t &&value) -> void
Inserts an element into the xtd::collections::generic::list <type_t> at the specified index.
Definition list.hpp:729
auto remove_range(size_type index, size_type count) -> void
Removes a range of elements from the xtd::collections::generic::list <type_t>.
Definition list.hpp:861
auto index_of(const type_t &value, size_type index) const -> size_type
Determines the index of a specific item in the xtd::collections::generic::list <type_t>.
Definition list.hpp:702
auto ensure_capacity(xtd::usize capacity) -> xtd::usize
Ensures that the capacity of this list is at least the specified capacity. If the current capacity is...
Definition list.hpp:464
auto remove(const type_t &item) noexcept -> bool override
Removes the first occurrence of a specific object from the xtd::collections::generic::list <type_t>.
Definition list.hpp:813
auto to_string() const noexcept -> xtd::string override
Returns a xtd::string that represents the current object.
Definition list.hpp:980
auto slice(size_type start, size_type length) const -> list< type_t >
Creates a shallow copy of a range of elements in the source xtd::collections::generic::list <type_t>.
Definition list.hpp:918
auto add(const type_t &item) -> void override
Adds an object to the end of the xtd::collections::generic::list <type_t>.
Definition list.hpp:288
auto reverse() -> list< type_t > &
Resizes the container to contain count elements, does nothing if count == size(). @param count The ne...
Definition list.hpp:896
auto remove_all(predicate_t match) -> xtd::usize
Removes all the elements that match the conditions defined by the specified predicate.
Definition list.hpp:832
auto find_last(predicate_t match) const -> optional< type_t >
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:585
xtd::usize size_type
Definition list.hpp:94
auto find_last_index(xtd::usize start_index, predicate_t match) const -> xtd::usize
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:606
auto add_range(const xtd::collections::generic::ienumerable< type_t > &enumerable) -> void
Adds copy of elements from the specified collection to the end of the xtd::collections::generic::list...
Definition list.hpp:315
auto data() noexcept -> pointer override
Returns pointer to the underlying array serving as element storage.
Definition list.hpp:258
list() noexcept=default
Initializes a new instance of the xtd::collections::generic::list class that is empty.
list(const list &list)
Default copy constructor with specified list.
Definition list.hpp:149
auto & items() noexcept
Returns the underlying base type items.
Definition list.hpp:269
auto add_range(std::initializer_list< type_t > il) -> void
Adds copy of elements from the specified collection to the end of the xtd::collections::generic::list...
Definition list.hpp:325
const value_type & const_reference
Definition list.hpp:98
auto capacity(size_type value) -> void
Sets the total number of elements the internal data structure can hold without resizing.
Definition list.hpp:224
auto insert_range(size_type index, const std::initializer_list< type_t > &items) -> void
Inserts copy of elements from a collection into the xtd::collections::generic::list <type_t> at the s...
Definition list.hpp:763
auto for_each(action_t action) -> void
Performs the specified action on each element of the xtd::collections::generic::list <type_t>.
Definition list.hpp:636
list(const xtd::collections::generic::ienumerable< type_t > &collection)
Initializes a new instance of the xtd::collections::generic::list <type_t> class that contains elemen...
Definition list.hpp:133
auto contains(const type_t &value) const noexcept -> bool override
Determines whether an element is in the xtd::colllections::generic::list <type_t>.
Definition list.hpp:400
list(list &list)
Default copy constructor with specified list.
Definition list.hpp:146
list(const base_type &list)
Copy constructor with specified base type list.
Definition list.hpp:158
typename ilist< xtd::any_object >::value_type value_type
Definition list.hpp:88
list(list &&list)
Move constructor with specified list.
Definition list.hpp:152
list(iterable_t &&items)
Initializes a new instance of the xtd::iterable that contains elements copied from the specified coll...
Definition list.hpp:140
auto exists(predicate_t match) const -> bool
Determines whether the xtd::collections::generic::list <type_t> contains elements that match the cond...
Definition list.hpp:498
auto true_for_all(prediacate_t match) const -> bool
Determines whether every element in the xtd::collections::generic::list <type_t> matches the conditio...
Definition list.hpp:1016
value_type & reference
Definition list.hpp:96
auto copy_to(xtd::array< type_t > &array, size_type array_index) const -> void override
Copies the entire xtd::colllections::generic::list <type_t> to a compatible one-dimensional array,...
Definition list.hpp:437
enumerator< value_type > get_enumerator() const noexcept override
Returns an enumerator that iterates through the xtd::collections::generic::list <type_t>.
Definition list.hpp:644
auto get_range(size_type index, size_type count) -> list
Creates a shallow copy of a range of elements in the source xtd::collections::generic::list <type_t>.
Definition list.hpp:685
auto binary_search(xtd::usize index, xtd::usize count, const type_t &item, const xtd::collections::generic::icomparer< type_t > &comparer) const -> xtd::usize
Searches a range of elements in the sorted xtd::collections::generic::list <type_t> for an element us...
Definition list.hpp:378
auto copy_to(xtd::array< type_t > &array) const -> void
Copies the entire xtd::collections::generic::list <type_t> to a compatible one-dimensional array.
Definition list.hpp:429
typename xtd::collections::generic::helpers::raw_array< value_type >::base_type base_type
Definition list.hpp:90
auto binary_search(const type_t &item, const xtd::collections::generic::icomparer< type_t > &comparer) const noexcept -> xtd::usize
Searches the entire sorted xtd::collections::generic::list <type_t> for an element using the specifie...
Definition list.hpp:363
auto copy_to(size_type index, xtd::array< type_t > &array, size_type array_index, size_type count) const -> void
Copies the entire xtd::collections::generic::list <type_t> to a compatible one-dimensional array,...
Definition list.hpp:454
auto equals(const list &obj) const noexcept -> bool override
Indicates whether the current object is equal to another object of the same type.
Definition list.hpp:479
auto clear() -> void override
Removes all elements from the xtd::collections::generic::list <type_t>.
Definition list.hpp:395
auto capacity() const noexcept -> size_type
Definition list.hpp:200
auto data() const noexcept -> const_pointer
Returns pointer to the underlying array serving as element storage.
Definition list.hpp:262
auto find_last_index(predicate_t match) const -> xtd::usize
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:597
auto remove_at(size_type index) -> void override
Removes the element at the specified index of the xtd::collections::generic::list <type_t>.
Definition list.hpp:848
auto find_index(xtd::usize start_index, predicate_t match) const -> xtd::usize
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:555
value_type * pointer
Definition list.hpp:100
auto reverse(size_type index, size_type count) -> list< type_t > &
Reverses the order of the elements in the specified range.
Definition list.hpp:906
auto find_index(predicate_t match) const -> xtd::usize
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:546
auto find_all(predicate_t match) const -> list
Retrieves all the elements that match the conditions defined by the specified predicate.
Definition list.hpp:532
auto binary_search(const type_t &item) const noexcept -> xtd::usize
Searches the entire sorted xtd::collections::generic::list <type_t> for an element using the default ...
Definition list.hpp:351
const auto & items() const noexcept
Definition list.hpp:266
xtd::collections::object_model::read_only_collection< value_type > read_only_collection
Definition list.hpp:104
auto find(predicate_t match) const -> optional< type_t >
Searches for an element that matches the conditions defined by the specified predicate,...
Definition list.hpp:514
auto insert_range(size_type index, const xtd::collections::generic::ienumerable< type_t > &enumerable) -> void
Inserts copy of elements from a collection into the xtd::collections::generic::list <type_t> at the s...
Definition list.hpp:743
auto convert_all(converter_t converter) const -> list< output_t >
Converts the elements in the current xtd::colllections::generic::list <type_t> to another type,...
Definition list.hpp:412
auto sort(const xtd::collections::generic::icomparer< type_t > &comparer) -> list< type_t > &
Sorts the elements in the entire xtd::collections::generic::list <type_t> using the specified compare...
Definition list.hpp:950
auto trim_excess() -> void
Sets the capacity to the actual number of elements in the xtd::collections::generic::list <type_t>,...
Definition list.hpp:1002
list(input_iterator_t first, input_iterator_t last)
Constructs the container with the contents of the range [first, last).
Definition list.hpp:169
auto as_read_only() const noexcept -> read_only_collection
Returns a read-only xtd::collections::object_model::read_only_collection <type_t> wrapper for the cur...
Definition list.hpp:336
auto add(type_t &&item) -> void
Adds an object to the end of the xtd::collections::generic::list <type_t>.
Definition list.hpp:305
Provides the base class for a generic read-only collection.
Definition read_only_collection.hpp:39
static auto throws(xtd::helpers::exception_case exception_case, const source_location &location=source_location::current()) -> void
Throws an exption with specified exception case.
Defines a generalized method that a value type or class implements to create a type-specific method f...
Definition iequatable.hpp:23
static auto order_by_descending(source_t &&source, key_selector_t &&key_selector) -> xtd::collections::generic::enumerable_generator< xtd::iterable_value_type< source_t > >
Sorts the elements of a sequence in descending order according to a key.
static auto distinct(source_t &&source) noexcept -> xtd::collections::generic::enumerable_generator< xtd::iterable_value_type< source_t > >
Returns distinct elements from a sequence by using the default equality comparer to compare values.
typename xtd::collections::generic::list< type_t > list
Represents the list value type.
Definition enumerable_.hpp:94
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 from(source_t &&source) noexcept
Returns the input typed as xtd::collections::generic::ienumerable <type_t>.
static auto order(source_t &&source) -> xtd::collections::generic::enumerable_generator< xtd::iterable_value_type< source_t > >
Sorts the elements of a sequence in ascending order.
static auto as_enumerable(source_t &&source) noexcept
Returns the input typed as xtd::collections::generic::ienumerable <type_t>.
static auto order_by(source_t &&source, key_selector_t &&key_selector) -> xtd::collections::generic::enumerable_generator< xtd::iterable_value_type< source_t > >
Sorts the elements of a sequence in ascending order according to a key.
static auto to_list(const ienumerable< source_t > &source)
Creates a xtd::collections::generic::list <type_t> from an xtd::collections::generic::ienumerable <ty...
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.hpp:40
Represents the version number of an assembly, operating system, or the xtd. This class cannot be inhe...
Definition version.hpp:115
Contains xtd::collections::generic::enumerable concept.
Contains xtd::comparison delegate.
Definition enumerable.hpp:17
Contains xtd::converter alias.
Contains xtd::collections::generic::helpers::equator struct.
Contains xtd::collections::generic::comparer <type_t> class.
Contains xtd::collections::generic::ilist <type_t> interface.
generic::enumerator< xtd::any_object > enumerator
Supports a simple iteration over a non-generic collection.
Definition enumerator.hpp:28
xtd::delegate< int32(type_t x, type_t y)> comparison
Represents the method that compares two objects of the same type.
Definition comparison.hpp:33
xtd::delegate< output_t(input_t input)> converter
Represents a method that converts an object from one type to another type.
Definition converter.hpp:33
static auto format(const basic_string< char > &fmt, args_t &&... args) -> basic_string
@ index_out_of_range
The index is out of range.
Definition exception_case.hpp:61
@ out_of_memory
Out of memory.
Definition exception_case.hpp:87
@ argument_out_of_range
The argument is out of range.
Definition exception_case.hpp:35
@ invalid_operation
The operation is not valid.
Definition exception_case.hpp:65
#define self_
The self_ expression is a reference value expression whose value is the reference of the implicit obj...
Definition self.hpp:20
#define delegate_
The declaration of a delegate type is similar to a method signature. It has a return value and any nu...
Definition delegate.hpp:1018
xtd::sptr< type_t > ptr
The xtd::ptr object is a shared pointer.
Definition ptr.hpp:27
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
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
auto is(xtd::any value) -> bool
Checks if the result of an expression is compatible with a given type.
Definition is.hpp:485
auto new_ptr(args_t &&... args) -> xtd::ptr< type_t >
The xtd::new_ptr operator creates a xtd::ptr object.
Definition new_ptr.hpp:24
@ other
The operating system is other.
Definition platform_id.hpp:60
@ y
The Y key.
Definition console_key.hpp:136
@ n
The N key.
Definition console_key.hpp:114
@ i
The I key.
Definition console_key.hpp:104
@ x
The X key.
Definition console_key.hpp:134
keys
Specifies key codes and modifiers.
Definition keys.hpp:77
Contains xtd::intptr type.
Contains xtd::is method.
Contains xtd::collections::generic::helpers::lesser struct.
The xtd::extensions namespace contains interface extensions.
Definition collection_common.hpp:14
The xtd::collections::generic namespace contains interfaces and classes that define generic collectio...
Definition comparer.hpp:16
The xtd::collections namespace contains interfaces and classes that define various collections of obj...
Definition any_pair.hpp:10
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
auto first() const -> read_only_span< type_t, count >
Obtains a subspan consisting of the first count elements of the sequence.
Definition read_only_span.hpp:262
xtd::usize size_type
Represents the read_only_span size type (usually xtd::usize).
Definition read_only_span.hpp:62
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:287
constexpr auto length() const noexcept -> size_type
Returns the length of the current read_only_span.
Definition read_only_span.hpp:226
Contains xtd::new_ptr method.
Contains xtd::object class.
Contains xtd::optional type.
Contains xtd::predicate delegate.
Contains xtd::collections::generic::helpers::raw_array class.
Contains xtd::raw_type alias.
Contains xtd::collections::object_model::read_only_collection class.
Contains self_ keyword.
Contains xtd::string alias.
Supports a simple iteration over a generic collection.
Definition enumerator.hpp:39
const type_t & current() const override
Gets the element in the collection at the current position of the enumerator.
Definition enumerator.hpp:63
bool move_next() override
Advances the enumerator to the next element of the collection.
Definition enumerator.hpp:72
Implements a function object for performing comparisons. Unless specialised, invokes operator== on ty...
Definition equator.hpp:39
Implements a function object for compare data.
Definition lesser.hpp:39
Represents a value_type struct.
Definition value_type.hpp:34