8#include <xtd/collections/generic/helpers/equator>
9#include <xtd/collections/generic/list>
12#include <xtd/argument_out_of_range_exception>
13#include <xtd/event_args>
14#include <xtd/event_handler>
18#include <xtd/size_object>
41 template<
class type_t,
class sorter_t = sorter_none>
47 const type_t& current()
const override {
49 if (index_ < items_.
count())
return items_[index_];
50 return default_value_;
53 bool move_next()
override {
55 return ++index_ < items_.
count();
58 void reset()
override {
59 version_ = items_.
items().version();
67 type_t default_value_;
78 template<
class ...args_t>
79 value_type(args_t&& ...args) : type_t(args...) {}
81 if (value.owner) owner = value.owner;
82 if (owner !=
nullptr && !owner->data_->inserting && !owner->data_->erasing) owner->
on_item_updated(pos,
static_cast<type_t&
>(
const_cast<value_type&
>(value)));
83 type_t::operator =(value);
87 if (value.owner) owner = value.owner;
88 if (owner !=
nullptr && !owner->data_->inserting && !owner->data_->erasing) owner->
on_item_updated(pos,
static_cast<type_t&
>(value));
89 type_t::operator =(value);
92 operator type_t() {
return self_;}
93 friend std::ostream& operator <<(std::ostream& os,
const value_type& value) {
return os << static_cast<const type_t&>(value);}
97 friend class arranged_element_collection;
99 arranged_element_collection* owner =
nullptr;
195 data_ = std::move(collection.data_);
211 template <std::input_iterator input_iterator_t>
213 for (
auto iterator =
first; iterator !=
last; ++iterator)
244 const auto&
items()
const {
return data_->items.items();}
247 auto&
items() {
return data_->items.items();}
251 virtual bool sorted() const noexcept {
return data_->sorted;}
255 if (data_->sorted == value)
return self_;
256 data_->sorted = value;
257 if (data_->sorted)
sort();
267 void add(
const type_t& item)
override {
268 data_->items.add(item);
269 size_t index = data_->items.count() - 1;
270 static_cast<value_type&
>(
self_[index]).owner =
this;
271 static_cast<value_type&
>(
self_[index]).pos = index;
273 if (data_->sorted)
sort();
277 virtual void add(type_t&& item) {
278 data_->items.add(item);
279 size_t index = data_->items.count() - 1;
280 static_cast<value_type&
>(
self_[index]).owner =
this;
281 static_cast<value_type&
>(
self_[index]).pos = index;
283 if (data_->sorted)
sort();
289 for (
const auto& item : collection)
294 virtual void add_range(
const std::vector<type_t>& collection) {
295 for (
const auto& item : collection)
300 virtual void add_range(
const std::initializer_list<type_t>& collection) {
301 for (
const auto& item : collection)
306 template<
class collection_t>
308 for (
auto& item : collection)
309 add(value_type(item));
313 template<
class collection_t>
315 for (
const auto& item : collection)
329 bool contains(
const type_t& item)
const noexcept override {
330 return data_->items.contains(item);
340 for (
const type_t& item :
self_) {
342 array[array_index +
i++] = item;
357 data_->inserting =
true;
359 data_->inserting =
false;
360 static_cast<value_type&
>(
self_[index]).owner =
this;
361 static_cast<value_type&
>(
self_[index]).pos = index;
363 if (data_->sorted)
sort();
378 bool remove(
const type_t& item)
override {
379 if (
count() == 0)
return false;
393 data_->erasing =
true;
395 data_->erasing =
false;
438 data_->items[index].pos = index >
npos / 2 ?
count() - (
npos - index) : index;
439 data_->items[index].owner =
this;
440 return data_->items[index];
447 data_->items[index].pos = index >
npos / 2 ?
count() - (
npos - index) : index;
449 return data_->items[index];
496 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().max_size - Will be removed in version 0.4.0.")]]
507 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::operator [] - Will be removed in version 0.4.0.")]]
509 data_->items[pos].pos = pos;
510 data_->items[pos].owner =
this;
511 return data_->items.at(pos);
517 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::operator [] - Will be removed in version 0.4.0.")]]
523 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::operator [~1_z] - Will be removed in version 0.4.0.")]]
528 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::operator [~1_z] - Will be removed in version 0.4.0.")]]
534 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().crbegin - Will be removed in version 0.4.0.")]]
535 const_reverse_iterator
crbegin() const noexcept {
return data_->items.crbegin();}
539 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().crend - Will be removed in version 0.4.0.")]]
540 const_reverse_iterator
crend() const noexcept {
return data_->items.crend();}
545 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::operator [0] - Will be removed in version 0.4.0.")]]
550 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::operator [0] - Will be removed in version 0.4.0.")]]
556 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().get_allocator - Will be removed in version 0.4.0.")]]
563 template<
class ...args_t>
564 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::insert - Will be removed in version 0.4.0.")]]
566 auto index = pos -
items().begin();
567 data_->inserting =
true;
568 auto result = data_->
items.insert(pos, args...);
569 data_->inserting =
false;
570 self_[index].owner =
this;
571 self_[index].pos = index;
573 if (data_->sorted)
sort();
580 template<
class ...args_t>
581 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add - Will be removed in version 0.4.0.")]]
583 data_->items.emplace_back(args...);
584 size_t index = data_->items.size() - 1;
585 self_[index].owner =
this;
586 self_[index].pos = index;
588 if (data_->sorted)
sort();
594 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::remove_at - Will be removed in version 0.4.0.")]]
597 data_->erasing =
true;
598 auto result =
items().erase(pos);
599 data_->erasing =
false;
605 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::remove_at - Will be removed in version 0.4.0.")]]
608 data_->erasing =
true;
609 auto result =
items().erase(pos);
610 data_->erasing =
false;
618 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::remove_at - Will be removed in version 0.4.0.")]]
620 auto result =
items().end();
630 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::remove_at - Will be removed in version 0.4.0.")]]
632 auto result =
items().end();
642 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::remove_at - Will be removed in version 0.4.0.")]]
651 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::insert - Will be removed in version 0.4.0.")]]
653 auto index = pos -
items().begin();
654 data_->inserting =
true;
655 auto result =
items().insert(pos, value);
656 data_->inserting =
false;
657 self_[index].owner =
this;
658 self_[index].pos = index;
660 if (data_->sorted)
sort();
667 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::insert - Will be removed in version 0.4.0.")]]
669 auto index = pos -
items().begin();
670 data_->inserting =
true;
671 auto result =
items().insert(pos, value);
672 data_->inserting =
false;
673 self_[index].owner =
this;
674 self_[index].pos = index;
676 if (data_->sorted)
sort();
684 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::insert - Will be removed in version 0.4.0.")]]
691 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::remove(count() - 1) - Will be removed in version 0.4.0.")]]
699 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add - Will be removed in version 0.4.0.")]]
706 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add - Will be removed in version 0.4.0.")]]
708 add(std::move(item));
714 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add_range - Will be removed in version 0.4.0.")]]
721 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add_range - Will be removed in version 0.4.0.")]]
728 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add_range - Will be removed in version 0.4.0.")]]
735 template<
class collection_t>
736 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add_range - Will be removed in version 0.4.0.")]]
743 template<
class iterator_t>
744 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::add_range - Will be removed in version 0.4.0.")]]
752 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::to_array - Will be removed in version 0.4.0.")]]
758 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().rbegin - Will be removed in version 0.4.0.")]]
759 auto rbegin() noexcept {
return data_->items.rbegin();}
763 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().rbegin - Will be removed in version 0.4.0.")]]
764 auto rbegin() const noexcept {
return data_->items.rbegin();}
769 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().rend - Will be removed in version 0.4.0.")]]
770 auto rend() noexcept {
return data_->items.rend();}
774 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().rend - Will be removed in version 0.4.0.")]]
775 auto rend() const noexcept {
return data_->items.rend();}
779 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().reserve - Will be removed in version 0.4.0.")]]
784 [[deprecated(
"Replaced by xtd::forms::layout::arranged_element_collection::items().shrink_to_fit - Will be removed in version 0.4.0.")]]
809 bool is_read_only() const noexcept
override {
return false;}
810 bool is_synchronized() const noexcept
override {
return false;}
811 const xtd::object& sync_root() const noexcept
override {
return data_->sync_root;}
813 struct data_collection {
814 mutable xtd::collections::generic::list < value_type > items;
815 bool inserting =
false;
816 bool erasing =
false;
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Definition array.hpp:63
virtual const base_type & items() const noexcept
Returns the underlying base type items.
Definition basic_array.hpp:172
static constexpr size_t max_value
Definition box_integer.hpp:67
Exposes the enumerator, which supports a simple iteration over a collection of a specified type.
Definition ienumerable.hpp:40
Supports a simple iteration over a generic collection.
Definition ienumerator.hpp:58
Represents a strongly typed list of objects that can be accessed by index. Provides methods to search...
Definition list.hpp:79
typename __xtd_raw_array_data__< value_type >::base_type base_type
Represents the list base type.
Definition list.hpp:126
const auto & items() const noexcept
Returns the underlying base type items.
Definition list.hpp:290
Provides the base class for a generic read-only collection.
Definition read_only_collection.hpp:38
static void throws(xtd::helpers::exception_case exception_case, const source_location &location=source_location::current())
Throws an exption with specified exception case.
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.hpp:44
object()=default
Create a new instance of the ultimate base class object.
Represents the version number of an assembly, operating system, or the xtd. This class cannot be inhe...
Definition version.hpp:114
@ index_out_of_range
The index is out of range.
Definition exception_case.hpp:59
@ 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:63
#define self_
The self_ expression is a reference value expression whose value is the reference of the implicit obj...
Definition self.hpp:20
constexpr xtd::size npos
Represents a value that is not a valid position in a collection.
Definition npos.hpp:26
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23
xtd::sptr< type_t > ptr
The xtd::ptr object is a shared pointer.
Definition ptr.hpp:27
ptr< type_t > new_ptr(args_t &&... args)
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:58
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
const_iterator begin() const
Returns an iterator to the beginning.
Definition read_only_span.hpp:183
read_only_span< type_t, count > first() const
Obtains a subspan consisting of the first count elements of the sequence.
Definition read_only_span.hpp:282
read_only_span< type_t, count > last() const
Obtains a subspan consisting of the last N elements of the sequence.
Definition read_only_span.hpp:307
Contains xtd::forms::layout::sorter_none class.
Supports a simple iteration over a generic collection.
Definition enumerator.hpp:38
Implements a function object for performing comparisons. Unless specialised, invokes operator== on ty...
Definition equator.hpp:38
Contains xtd::helpers::exception_case enum class.