xtd 1.0.0
Loading...
Searching...
No Matches
stack.hpp
Go to the documentation of this file.
1
4#pragma once
6#include "icollection.hpp"
7#include "../../string.hpp"
8#include "../../usize.hpp"
9
11namespace xtd {
13 namespace collections {
15 namespace generic {
46 template<typename type_t, typename container_t = std::deque<type_t>>
48 public:
50
63
65
68 stack() = default;
72 data_ = std::move(stack.data_);
73 stack.data_ = new_ptr<stack_data>();
74 }
75
77 stack(stack& stack) = default;
80 stack(const stack& stack) = default;
83 stack(std::stack<type_t>&& stack) {
84 auto tmp = std::vector<type_t> {};
85 tmp.reserve(stack.size());
86
87 while (!stack.empty()) {
88 tmp.push_back(std::move(stack.top()));
89 stack.pop();
90 }
91
92 for (auto iterator = tmp.rbegin(); iterator != tmp.rend(); ++iterator)
93 data_->items.push(*iterator);
94
96 }
97
99 stack(const std::stack<type_t>& stack) {
100 struct accessor : public std::stack<type_t> {static auto get() {return &accessor::c;}};
101 const auto& underlying_items = stack.*accessor::get();
102 data_->items = base_type(underlying_items.begin(), underlying_items.end());
104 }
105
107 stack(const ienumerable<value_type>& collection) {
108 for (const auto& item : collection)
109 data_->items.push(item);
111 }
112
114 template<xtd::iterable iterable_t>
115 stack(iterable_t&& items) {
116 for (const auto& item : items)
117 data_->items.push(item);
119 }
120
123 data_->items.reserve(capacity);
124 }
125
127 stack(std::initializer_list<type_t> il) {
128 data_->items = base_type {il};
130 }
131
134 template < std::input_iterator input_iterator_t >
135 stack(input_iterator_t first, input_iterator_t last) {
136 for (auto iterator = first; iterator != last; ++iterator)
137 push(*iterator);
139 }
140
141
143
147 [[nodiscard]] auto capacity() const noexcept -> size_type {return data_->items.capacity();}
151 [[nodiscard]] auto count() const noexcept -> size_type override {return data_->items.size();}
152
155 [[nodiscard]] auto items() const {return std::stack<type_t>(std::deque<type_t>(data_->items.begin(), data_->items.end()));}
157
159
165 auto clear() -> void override {
166 data_->items.clear();
167 ++data_->version;
168 }
169
173 [[nodiscard]] auto contains(const_reference value) const noexcept -> bool override {
174 for (const auto& item : data_->items)
175 if (xtd::collections::generic::helpers::equator<type_t> {}(item, value)) return true;
176 return false;
177 }
178
186 auto copy_to(xtd::array<type_t>& array, size_type array_index) const -> void override {
188 array_index += count() - 1;
189 for (const auto& item : data_->items)
190 array[array_index--] = item;
191 }
192
196 auto pop() -> value_type {
197 auto result = value_type {};
199 return result;
200 }
201
204 auto push(const_reference value) -> void {
205 data_->items.push(value);
207 ++data_->version;
208 }
209
212 auto push(value_type&& value) -> void {
213 data_->items.push(std::move(value));
215 ++data_->version;
216 }
217
222 if (data_->items.capacity() < capacity) data_->items.reserve(capacity);
223 return data_->items.capacity();
224 }
225
228 [[nodiscard]] enumerator<value_type> get_enumerator() const noexcept override {
229 struct stack_enumerator : public ienumerator < value_type > {
230 explicit stack_enumerator(const stack & items, xtd::usize version) : items_(items), version_(version) {}
231
232 [[nodiscard]] const value_type& current() const override {
233 if (iterator_ == items_.data_->items.crend()) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation);
234 if (version_ != items_.data_->version) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "Collection was modified; enumeration operation may not execute.");
235 return *iterator_;
236 }
237
238 [[nodiscard]] bool move_next() override {
239 if (version_ != items_.data_->version) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "Collection was modified; enumeration operation may not execute.");
240 if (index_++ && iterator_ != items_.data_->items.crend()) ++iterator_;
241 else iterator_ = items_.data_->items.crbegin();
242 return iterator_ != items_.data_->items.crend();
243 }
244
245 void reset() override {
246 index_ = 0;
247 version_ = items_.data_->version;
248 iterator_ = items_.data_->items.crend();
249 }
250
251 private:
252 size_type index_ = 0;
253 const stack& items_;
254 typename base_type::const_reverse_iterator iterator_ = items_.data_->items.crend();
255 size_type version_ = 0;
256 };
257 return {new_ptr < stack_enumerator > (self_, data_->version)};
258 }
259
264 [[nodiscard]] auto peek() const -> value_type {
265 auto result = value_type {};
267 return result;
268 }
269
272 [[nodiscard]] auto to_array() const -> xtd::array<value_type> {
274 copy_to(array, 0);
275 return array;
276 }
277
280 [[nodiscard]] auto to_string() const noexcept -> string override {return xtd::string::format("[{}]", xtd::string::join(", ", self_));}
281
286 auto trim_excess() -> void {
287 if (count() < static_cast<xtd::usize>(capacity() * 0.9)) trim_excess(count());
288 }
289
295 auto temp = base_type {};
296 temp.reserve(capacity);
297 for (auto& i : data_->items)
298 temp.push(i);
299 data_->items = std::move(temp);
300 ++data_->version;
301 }
302
306 [[nodiscard]] auto try_pop(value_type& result) noexcept -> bool {
307 if (!try_peek(result)) return false;
308 data_->items.pop();
309 ++data_->version;
310 return true;
311 }
312
316 [[nodiscard]] auto try_peek(value_type& result) const noexcept -> bool {
317 result = count() ? data_->items.top() : type_t {};
318 return count();
319 }
320
321
323
328 auto operator =(const stack& other) -> stack& = default;
332 auto operator =(stack&& other) noexcept -> stack& {
333 data_->items = std::move(other.data_->items);
334 ++data_->version;
335 return self_;
336 }
337
340 auto operator =(const std::initializer_list<type_t>& items) -> stack& {
341 data_->items = items;
342 ++data_->version;
343 return self_;
344 }
345
348 operator std::stack<type_t>() const {return items();}
350
351 private:
352 auto is_read_only() const noexcept -> bool override {return false;}
353 auto is_synchronized() const noexcept -> bool override {return false;}
354 const xtd::object& sync_root() const noexcept override {return data_->sync_root;}
355 auto add(const type_t& value) -> void override {push(value);}
356 auto remove(const type_t&) -> bool override {return false;}
357
358 struct stack_data {
360 xtd::object sync_root;
361 xtd::usize version = 0;
362 };
363
365 };
366
368 // Deduction guides for xtd::collections::generic::stack
369 // {
370 template <typename type_t, typename container_t>
372
373 template <typename type_t, typename container_t>
375
376 template <typename type_t, typename container_t>
378
379 template <typename type_t>
381
382 template <xtd::iterable iterable_t>
384
385 template <typename type_t>
386 stack(std::initializer_list<type_t>) -> stack<type_t>;
387
388 template<typename input_iterator_t>
389 stack(input_iterator_t, input_iterator_t) -> stack<std::iter_value_t<input_iterator_t>>;
390 // }
392 }
393 }
394}
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:1258
Provides a raw, contiguous memory based LIFO (last-in, first-out) stack.
Definition raw_stack.hpp:43
typename container_type::const_reverse_iterator const_reverse_iterator
Const reverse iterator type.
Definition raw_stack.hpp:55
Defines methods to manipulate generic collections.
Definition icollection.hpp:45
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_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>.
typename xtd::collections::generic::ienumerable< xtd::any_object >::value_type value_type
Definition icollection.hpp:51
virtual auto is_read_only() const noexcept -> bool=0
Gets a value indicating whether the xtd::collections::generic::icollection <type_t> is read-only.
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 variable size last-in-first-out (LIFO) collection of instances of the same specified typ...
Definition stack.hpp:47
auto push(const_reference value) -> void
Adds an object to the end of the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:204
const value_type & const_reference
Represents the const reference of list value type.
Definition stack.hpp:61
stack()=default
Initializes a new instance of the xtd::collections::generic::stack <type_t> class that is empty and h...
stack(const ienumerable< value_type > &collection)
Initializes a new instance of the xtd::collections::generic::stack <type_t> class that contains eleme...
Definition stack.hpp:107
auto ensure_capacity(size_type capacity) -> size_type
Ensures that the capacity of this stack is at least the specified capacity. If the current capacity i...
Definition stack.hpp:221
stack(std::stack< type_t > &&stack)
Move constructor with specified stack.
Definition stack.hpp:83
auto try_peek(value_type &result) const noexcept -> bool
Returns a value that indicates whether there is an object at the beginning of the xtd::collections::g...
Definition stack.hpp:316
stack(const std::stack< type_t > &stack)
Default copy constructor with specified stack.
Definition stack.hpp:99
auto capacity() const noexcept -> size_type
Definition stack.hpp:147
auto trim_excess(size_type capacity) -> void
Sets the capacity of a xtd::collections::generic::stack <type_t> object to the specified number of en...
Definition stack.hpp:293
auto try_pop(value_type &result) noexcept -> bool
Removes the object at the beginning of the xtd::collections::generic::stack <type_t>,...
Definition stack.hpp:306
auto operator=(const stack &other) -> stack &=default
Copy assignment operator. Replaces the contents with a copy of the contents of other.
xtd::collections::generic::helpers::raw_stack< value_type, container_t > base_type
Represents the list base type.
Definition stack.hpp:55
auto items() const
Definition stack.hpp:155
auto count() const noexcept -> size_type override
Gets the number of nodes actually contained in the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:151
stack(iterable_t &&items)
Initializes a new instance of the xtd::iterable that contains elements copied from the specified coll...
Definition stack.hpp:115
auto to_string() const noexcept -> string override
Returns a xtd::string that represents the current object.
Definition stack.hpp:280
stack(stack &&stack)
Move constructor with specified stack.
Definition stack.hpp:71
stack(input_iterator_t first, input_iterator_t last)
Constructs the container with the contents of the range [first, last).
Definition stack.hpp:135
auto peek() const -> value_type
Returns the object at the beginning of the xtd::collections::generic::stack <type_t> without removing...
Definition stack.hpp:264
auto trim_excess() -> void
Sets the capacity to the actual number of elements in the xtd::collections::generic::stack <type_t>,...
Definition stack.hpp:286
xtd::usize size_type
Represents the list size type (usually xtd::usize).
Definition stack.hpp:57
stack(const stack &stack)=default
Default copy constructor with specified stack.
typename icollection< type_t >::value_type value_type
Represents the list value type.
Definition stack.hpp:53
auto to_array() const -> xtd::array< value_type >
Copies the xtd::collections::generic::stack <type_t> elements to a new array.
Definition stack.hpp:272
auto copy_to(xtd::array< type_t > &array, size_type array_index) const -> void override
Copies the entire xtd::colllections::generic::linked_list <type_t> to a compatible one-dimensional ar...
Definition stack.hpp:186
auto contains(const_reference value) const noexcept -> bool override
Determines whether an element is in the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:173
auto pop() -> value_type
Removes and returns the object at the beginning of the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:196
stack(stack &stack)=default
Default copy constructor with specified stack.
enumerator< value_type > get_enumerator() const noexcept override
Returns an enumerator that iterates through the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:228
stack(std::initializer_list< type_t > il)
Constructs the container with the contents of the specified initializer list, and allocator.
Definition stack.hpp:127
stack(size_type capacity)
Initializes a new instance of the xtd::collections::generic::stack <type_t> class that is empty and h...
Definition stack.hpp:122
auto clear() -> void override
Removes all elements from the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:165
auto push(value_type &&value) -> void
Adds an object to the end of the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:212
value_type & reference
Represents the reference of list value type.
Definition stack.hpp:59
static auto throws(xtd::helpers::exception_case exception_case, const source_location &location=source_location::current()) -> void
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:45
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:115
Contains xtd::collections::generic::icollection <type_t> interface.
generic::stack< xtd::any_object > stack
Represents a collection of xtd::any_object.
Definition stack.hpp:31
static auto format(const basic_string< char > &fmt, args_t &&... args) -> basic_string
@ 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
xtd::sptr< type_t > ptr
The xtd::ptr object is a shared pointer.
Definition ptr.hpp:27
std::size_t usize
Represents an unsigned size of any object in bytes.
Definition usize.hpp:22
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
@ i
The I key.
Definition console_key.hpp:104
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:248
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::collections::generic::helpers::raw_stack class.
Contains xtd::string alias.
Supports a simple iteration over a generic collection.
Definition enumerator.hpp:39
Implements a function object for performing comparisons. Unless specialised, invokes operator== on ty...
Definition equator.hpp:39
Contains xtd::usize type.