5#if !defined(__XTD_ARRAY_INTERNAL__)
6#error "Do not include this file: Internal use only. Include <xtd/array> or <xtd/array.h> instead."
24 template<
class type_t>
43 template<
class type_t,
class allocator_t = xtd::collections::
generic::helpers::allocator<type_to_array_t<type_t>>>
48 comparer(
const comparer&) =
default;
49 comparer(comparer&&) =
default;
50 comparer&
operator=(
const comparer & comparer) =
default;
51 comparer&
operator=(comparer&&) =
default;
53 bool operator()(
const type_t& e1,
const type_t& e2)
const noexcept {
return comparer_ && comparer_->compare(e1, e2) < 0;}
59 class comparison_comparer {
60 template<
class comparison_t>
64 comparison_comparer() =
default;
67 comparison_comparer(
const comparison_comparer & mc) =
default;
68 comparison_comparer&
operator=(
const comparison_comparer & mc) =
default;
70 bool operator()(
const type_t& e1,
const type_t& e2)
const {
return comparer(e1, e2) < 0;}
112 inline static constexpr size_type npos = xtd::collections::generic::ilist<type_t>::npos;
116 basic_array(
const basic_array & array) {
if (array.data_) *data_ = *array.data_;}
174 virtual bool empty() const noexcept {
return data_->items.empty();}
192 bool is_fixed_size() const noexcept
override {
return true;}
193 bool is_read_only() const noexcept
override {
return false;}
194 bool is_synchronized() const noexcept
override {
return false;}
248 const xtd::object & sync_root() const noexcept
override {
return data_->sync_root;}
260 return (
reference)data_->items.at(index);
268 return (
reference)data_->items.at(index);
273 bool contains(
const type_t& value)
const noexcept override {
274 for (
const auto& item : data_->items)
273 bool contains(
const type_t& value)
const noexcept override {
…}
283 for (
auto increment =
size_type {0}; increment <
length(); ++increment)
284 array[index + increment] =
at(increment);
294 bool equals(
const object & obj)
const noexcept override {
return dynamic_cast<const basic_array<value_type>*
>(&obj) &&
equals(
static_cast<const basic_array<value_type>&
>(obj));}
296 if (
count() != rhs.count())
return false;
299 return data_->version == rhs.data_->version && data_->lower_bound == rhs.data_->lower_bound && data_->upper_bound == rhs.data_->upper_bound;
305 for (
auto& item : data_->items)
314 const value_type & current()
const override {
316 if (index_ < items_.count())
return items_[index_];
317 static thread_local auto default_value = value_type {};
321 bool move_next()
override {
323 return ++index_ < items_.count();
326 void reset()
override {
327 version_ = items_.data_->version;
328 index_ = basic_array::npos;
332 const basic_array& items_;
366 return data_->lower_bound[dimension];
378 return data_->upper_bound[dimension];
406 if (new_size ==
length())
return;
409 data_->items.resize(new_size, value);
410 data_->upper_bound[0] = new_size - 1;
417 void set_value(
const type_t& value,
const xtd::array < size_type > & indexes) {
operator()(indexes) = value;}
423 data_->items.swap(
other.data_->items);
465 if (array.size() == 0)
return npos;
466 for (
auto increment =
size_type {0}; increment <
count; ++increment) {
467 if (xtd::collections::generic::helpers::equator < type_t > {}(array[index + increment], value))
468 return index + increment;
476 static void reverse(basic_array & array)
noexcept {
reverse(array, 0, array.count());}
485 if (
count == 0)
return;
486 ++array.data_->version;
487 std::reverse(array.data_->items.begin() + index, array.data_->items.begin() + index +
count);
498 *data_ = *
other.data_;
511 data_->upper_bound[0] = data_->items.size() - 1;
528 operator const base_type & ()
const noexcept {
return data_->items;}
540 type_t&
operator()(
const xtd::array < size_type > & indexes);
549 const type_t&
operator()(
const xtd::array < size_type > & indexes)
const;
553 template <
class type_array_t,
size_type rank_array_t,
class allocator_array_t >
556 basic_array() =
default;
557 basic_array(
const array < size_type, 1 > & lengths);
558 basic_array(
const array < size_type, 1 > & lengths,
const value_type & value);
563 data_->upper_bound[0] = data_->items.size() - 1;
566 basic_array(
const xtd::collections::generic::ienumerable < type_t > & enumerable) {
567 for (
const auto& value : enumerable)
568 data_->items.push_back(value);
569 data_->lower_bound.push_back(0);
570 data_->upper_bound[0] = data_->items.size() - 1;
573 basic_array(
const std::vector < type_t > & array) {
574 data_->items = array;
575 data_->upper_bound[0] = data_->items.size() - 1;
578 basic_array(std::vector < type_t > && array) {
579 data_->items = std::move(array);
580 data_->upper_bound[0] = data_->items.size() - 1;
583 basic_array(std::initializer_list < type_t > il) {
584 data_->items.assign(il.begin(), il.end());
585 data_->upper_bound[0] = data_->items.size() - 1;
588 basic_array(std::initializer_list < std::initializer_list < type_t>> il) {
589 for (
const std::initializer_list < type_t > & il1 : il)
590 data_->items.insert(data_->items.end(), il1.begin(), il1.end());
591 data_->upper_bound[0] = il.size() - 1;
592 data_->lower_bound.push_back(0);
593 data_->upper_bound.push_back((*il.begin()).size() - 1);
596 basic_array(std::initializer_list < std::initializer_list < std::initializer_list<type_t>>> il) {
597 for (
const std::initializer_list < std::initializer_list < type_t>>& il1 : il)
598 for (
const std::initializer_list < type_t > & il2 : il1)
599 data_->items.insert(data_->items.end(), il2.begin(), il2.end());
600 data_->upper_bound[0] = il.size() - 1;
601 data_->lower_bound.push_back(0);
602 data_->upper_bound.push_back((*il.begin()).size() - 1);
603 data_->lower_bound.push_back(0);
604 data_->upper_bound.push_back((*(*il.begin()).begin()).size() - 1);
607 template <
class input_iterator_t >
608 basic_array(input_iterator_t
first, input_iterator_t
last) {
610 data_->lower_bound.push_back(0);
611 data_->upper_bound.push_back(data_->items.size() - 1);
614 void add(
const type_t& item)
override {}
615 void clear()
override {}
617 bool remove(
const type_t& item)
override {
return false;}
618 void remove_at(
size_type index)
override {}
620 typename base_type::iterator to_base_type_iterator(
iterator value)
noexcept {
621 if (value ==
begin())
return data_->items.begin();
622 if (value ==
end())
return data_->items.end();
623 return data_->items.begin() + (value -
begin());
626 iterator to_iterator(
typename base_type::iterator value)
noexcept {
627 if (value == data_->items.begin())
return begin();
628 if (value == data_->items.end())
return end();
629 return begin() + (value - data_->items.begin());
635 std::vector < size_type > lower_bound {0};
636 std::vector < size_type > upper_bound {std::numeric_limits < size_type >::max()};
Abstract object that represent array.
Definition array_abstract_object.hpp:25
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Definition array.hpp:61
xtd::size rank() const noexcept override
Gets the rank (number of dimensions) of the array.
Definition array.hpp:90
Base object that represent array.
Definition basic_array.hpp:44
typename base_type::const_reverse_iterator const_reverse_iterator
Represents the const reverse iterator of array value type.
Definition basic_array.hpp:105
const value_type & const_reference
Represents the const reference of array value type.
Definition basic_array.hpp:93
constexpr xtd::int64 get_long_length(size_type dimension) const
Gets a 64-bit integer that represents the total number of elements in all the dimensions of the array...
Definition basic_array.hpp:355
virtual const_reverse_iterator rbegin() const noexcept
Returns a reverse iterator to the first element of the reversed vector. It corresponds to the last el...
Definition basic_array.hpp:233
virtual bool empty() const noexcept
Checks if the container has no elements, i.e. whether xtd::array::begin() == xtd::array::end().
Definition basic_array.hpp:174
virtual size_type rank() const noexcept
Gets the rank (number of dimensions) of the array.
Definition basic_array.hpp:224
virtual const_pointer data() const noexcept
Returns pointer to the underlying array serving as element storage.
Definition basic_array.hpp:170
void set_value(const type_t &value, const xtd::array< size_type > &indexes)
Sets a value to the element at the specified position in the multidimensional array.
Definition basic_array.hpp:417
const value_type & get_value(const xtd::array< size_type > &indexes) const
Gets the value at the specified position in the multidimensional array. The indexes are specified as ...
const_iterator cend() const noexcept override
Returns an iterator to the element following the last element of the enumerable.
Definition basic_array.hpp:145
typename xtd::collections::generic::ienumerable< type_t >::const_iterator const_iterator
Represents the const iterator of array value type.
Definition basic_array.hpp:101
xtd::ptrdiff difference_type
Represents the array difference type (usually xtd::ptrdiff).
Definition basic_array.hpp:89
virtual reference front()
Returns a reference to the first element in the container.
Definition basic_array.hpp:186
size_type count() const noexcept override
Gets the number of elements contained in the xtd::array <type_t>.
Definition basic_array.hpp:151
virtual const_reverse_iterator rend() const noexcept
Returns a reverse iterator to the element following the last element of the reversed vector....
Definition basic_array.hpp:242
virtual reference at(size_type index)
Returns a reference to the element at specified location pos, with bounds checking.
Definition basic_array.hpp:258
bool equals(const object &obj) const noexcept override
Determines whether the specified object is equal to the current object.
Definition basic_array.hpp:294
xtd::collections::generic::helpers::allocator< typename std::conditional< std::is_same< bool, value_type >::value, xtd::byte, value_type >::type > allocator_type
Represents the array allocator type.
Definition basic_array.hpp:83
constexpr size_type get_length(size_type dimension) const
Gets the total number of elements in all the dimensions of the array.
Definition basic_array.hpp:346
virtual xtd::int64 long_length()
Gets a 64-bit integer that represents the total number of elements in all the dimensions of the array...
Definition basic_array.hpp:213
typename base_type::reverse_iterator reverse_iterator
Represents the reverse iterator of array value type.
Definition basic_array.hpp:103
const value_type * const_pointer
Represents the const pointer of array value type.
Definition basic_array.hpp:97
virtual const_reference back() const
Returns a reference to the last element in the container.
Definition basic_array.hpp:130
static constexpr size_type npos
This is a special value equal to the maximum value representable by the type xtd::size.
Definition basic_array.hpp:112
bool contains(const type_t &value) const noexcept override
Determines whether an element is in the array.
Definition basic_array.hpp:273
static size_type index_of(const basic_array &array, const value_type &value) noexcept
Determines the index of a specific item in the array specified.
Definition basic_array.hpp:439
value_type * pointer
Represents the pointer of array value type.
Definition basic_array.hpp:95
virtual pointer data() noexcept
Returns pointer to the underlying array serving as element storage.
Definition basic_array.hpp:166
value_type & reference
Represents the reference of array value type.
Definition basic_array.hpp:91
size_type index_of(const type_t &value) const noexcept override
Determines the index of a specific item in the xtd::array <type_t>.
Definition basic_array.hpp:390
const_iterator end() const noexcept override
Returns an iterator to the element following the last element of the enumerable.
Definition basic_array.hpp:178
constexpr size_type get_lower_bound(size_type dimension) const
Gets the lower bound of the specified dimension in the array.
Definition basic_array.hpp:364
virtual size_type max_size() const noexcept
Returns the maximum number of elements the container is able to hold due to system or library impleme...
Definition basic_array.hpp:217
void resize(size_type new_size, value_type value)
Resizes the container to contain count elements, does nothing if count == size(). / @param new_size T...
Definition basic_array.hpp:405
iterator begin() noexcept override
Returns an iterator to the first element of the enumerable.
Definition basic_array.hpp:137
const_iterator begin() const noexcept override
Returns an iterator to the first element of the enumerable.
Definition basic_array.hpp:134
void copy_to(xtd::array< type_t > &array, xtd::int64 index) const
Copies all the elements of the current one-dimensional array to the specified one-dimensional array s...
Definition basic_array.hpp:292
type_t value_type
Represents the array value type.
Definition basic_array.hpp:81
virtual void fill(const value_type &value) noexcept
Assigns the value to all elements in the container.
Definition basic_array.hpp:304
basic_array & operator=(const basic_array &other)
Copy assignment operator. Replaces the contents with a copy of the contents of other.
Definition basic_array.hpp:497
virtual reverse_iterator rbegin() noexcept
Returns a reverse iterator to the first element of the reversed vector. It corresponds to the last el...
Definition basic_array.hpp:229
iterator end() noexcept override
Returns an iterator to the element following the last element of the enumerable.
Definition basic_array.hpp:181
virtual const_reference at(size_type index) const
Returns a reference to the element at specified location pos, with bounds checking.
Definition basic_array.hpp:266
virtual size_type length() const noexcept
Gets a size that represents the total number of elements in all the dimensions of the array.
Definition basic_array.hpp:209
const type_t & operator()(const xtd::array< size_type > &indexes) const
Gets the value at the specified position in the multidimensional array. The indexes are specified as ...
virtual reverse_iterator rend() noexcept
Returns a reverse iterator to the element following the last element of the reversed vector....
Definition basic_array.hpp:238
virtual const base_type & items() const noexcept
Returns the underlying base type items.
Definition basic_array.hpp:198
constexpr size_type get_upper_bound(size_type dimension) const
Gets the upper bound of the specified dimension in the array.
Definition basic_array.hpp:376
virtual const_reverse_iterator crend() const noexcept
Returns a reverse iterator to the element following the last element of the reversed vector....
Definition basic_array.hpp:161
virtual void swap(basic_array &other) noexcept
Exchanges the contents and capacity of the container with those of other. Does not invoke any move,...
Definition basic_array.hpp:421
xtd::string to_string() const noexcept override
Returns a xtd::string that represents the current object.
typename xtd::collections::generic::ienumerable< type_t >::iterator iterator
Represents the iterator of array value type.
Definition basic_array.hpp:99
const_reference operator[](size_type index) const override
Returns a reference to the element at specified location index.
Definition basic_array.hpp:519
virtual const_reference front() const
Returns a reference to the first element in the container.
Definition basic_array.hpp:190
static void reverse(basic_array &array) noexcept
Reverses the order of the elements in the entire xtd::basic_array.
Definition basic_array.hpp:476
std::vector< typename std::conditional< std::is_same< bool, value_type >::value, xtd::byte, value_type >::type, allocator_type > base_type
Represents the array base type.
Definition basic_array.hpp:85
static size_type index_of(const basic_array &array, const value_type &value, size_type index, size_type count)
Determines the index of a specific item in the array specified.
Definition basic_array.hpp:462
static size_type index_of(const basic_array &array, const value_type &value, size_type index)
Determines the index of a specific item in the array specified.
Definition basic_array.hpp:450
virtual reference back()
Returns a reference to the last element in the container.
Definition basic_array.hpp:126
const_iterator cbegin() const noexcept override
Returns an iterator to the first element of the enumerable.
Definition basic_array.hpp:141
virtual base_type & items() noexcept
Returns the underlying base type items.
Definition basic_array.hpp:201
type_t & operator()(const xtd::array< size_type > &indexes)
Gets the value at the specified position in the multidimensional array. The indexes are specified as ...
virtual size_type size() const noexcept
Returns the number of elements in the container, i.e. std::distance(xtd::array::begin(),...
Definition basic_array.hpp:246
static void reverse(basic_array &array, size_type index, size_type count)
Reverses the order of the elements in the specified range.
Definition basic_array.hpp:483
virtual const_reverse_iterator crbegin() const noexcept
Returns a reverse iterator to the first element of the reversed vector. It corresponds to the last el...
Definition basic_array.hpp:156
xtd::size size_type
Represents the array size type (usually xtd::size).
Definition basic_array.hpp:87
virtual const_iterator cbegin() const
Returns an iterator to the first element of the enumerable.
Definition enumerable_iterators.hpp:148
virtual const_iterator begin() const
Returns an iterator to the first element of the enumerable.
Definition enumerable_iterators.hpp:141
virtual const_iterator cend() const
Returns an iterator to the element following the last element of the enumerable.
Definition enumerable_iterators.hpp:152
virtual const_iterator end() const
Returns an iterator to the element following the last element of the enumerable.
Definition enumerable_iterators.hpp:156
Provides a set of static methods for querying objects that implement ienumerable <type_t>.
Definition enumerable.hpp:32
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:36
typename xtd::collections::generic::extensions::enumerable_iterators< xtd::any_object, xtd::collections::generic::ienumerable< xtd::any_object > >::const_iterator const_iterator
Definition ienumerable.hpp:46
typename xtd::collections::generic::extensions::enumerable_iterators< xtd::any_object, xtd::collections::generic::ienumerable< xtd::any_object > >::iterator iterator
Definition ienumerable.hpp:44
Supports a simple iteration over a generic collection.
Definition ienumerator.hpp:58
static void throws(xtd::helpers::exception_case exception_case, const source_location &location=source_location::current())
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:22
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.hpp:44
Represents the version number of an assembly, operating system, or the xtd. This class cannot be inhe...
Definition version.hpp:114
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
std::allocator< type_t > allocator
Represent an allocator alias.
Definition allocator.hpp:38
@ argument
The argument is not valid.
Definition exception_case.hpp:31
@ index_out_of_range
The index is out of range.
Definition exception_case.hpp:59
@ rank
The rank is not valid.
Definition exception_case.hpp:89
@ argument_null
The argument is null.
Definition exception_case.hpp:33
@ 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
xtd::basic_string< char > string
Represents text as a sequence of UTF-8 code units.
Definition __string_definitions.hpp:43
typename std::conditional< std::is_same< bool, type_t >::value, char, type_t >::type type_to_array_t
Represents the type to array type.
Definition basic_array.hpp:25
std::type_info type
Stores information about a type.
Definition type.hpp:23
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23
null_ptr null
Represents a null pointer value.
int32_t int32
Represents a 32-bit signed integer.
Definition int32.hpp:23
uint8_t byte
Represents a 8-bit unsigned integer.
Definition byte.hpp:23
int64_t int64
Represents a 64-bit signed integer.
Definition int64.hpp:23
xtd::sptr< type_t > ptr
The xtd::ptr object is a shared pointer.
Definition ptr.hpp:27
std::ptrdiff_t ptrdiff
Represent the signed integer type of the result of subtracting two pointers.
Definition ptrdiff.hpp:23
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
@ add
The Add key.
Definition console_key.hpp:170
@ y
The Y key.
Definition console_key.hpp:136
@ c
The C key.
Definition console_key.hpp:92
@ i
The I key.
Definition console_key.hpp:104
@ x
The X key.
Definition console_key.hpp:134
@ insert
The INS (INSERT) key.
Definition console_key.hpp:62
@ default_value
Default quality.
Definition compositing_quality.hpp:24
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
void copy_to(span< type_t, length > &destination) const
Copies the contents of this xtd::read_only_span <type_t> into a destination xtd:span <type_t>.
Definition read_only_span.hpp:264
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
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