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(const stack& stack) = default;
80 stack(std::stack<type_t>&& stack) {
81 auto tmp = std::vector<type_t> {};
82 tmp.reserve(stack.size());
83
84 while (!stack.empty()) {
85 tmp.push_back(std::move(stack.top()));
86 stack.pop();
87 }
88
89 for (auto iterator = tmp.rbegin(); iterator != tmp.rend(); ++iterator)
90 data_->items.push(*iterator);
91
93 }
94
96 stack(const std::stack<type_t>& stack) {
97 struct accessor : public std::stack<type_t> {static auto get() {return &accessor::c;}};
98 const auto& underlying_items = stack.*accessor::get();
99 data_->items = base_type(underlying_items.begin(), underlying_items.end());
101 }
102
104 stack(const ienumerable<value_type>& collection) {
105 for (const auto& item : collection)
106 data_->items.push(item);
108 }
109
112 data_->items.reserve(capacity);
113 }
114
116 stack(std::initializer_list<type_t> il) {
117 data_->items = base_type {il};
119 }
120
123 template < std::input_iterator input_iterator_t >
124 stack(input_iterator_t first, input_iterator_t last) {
125 for (auto iterator = first; iterator != last; ++iterator)
126 push(*iterator);
128 }
129
130
132
136 [[nodiscard]] auto capacity() const noexcept -> size_type {return data_->items.capacity();}
140 [[nodiscard]] auto count() const noexcept -> size_type override {return data_->items.size();}
141
144 [[nodiscard]] auto items() const {return std::stack<type_t>(std::deque<type_t>(data_->items.begin(), data_->items.end()));}
146
148
154 auto clear() -> void override {
155 data_->items.clear();
156 ++data_->version;
157 }
158
162 [[nodiscard]] auto contains(const_reference value) const noexcept -> bool override {
163 for (const auto& item : data_->items)
164 if (xtd::collections::generic::helpers::equator<type_t> {}(item, value)) return true;
165 return false;
166 }
167
175 auto copy_to(xtd::array<type_t>& array, size_type array_index) const -> void override {
177 array_index += count() - 1;
178 for (const auto& item : data_->items)
179 array[array_index--] = item;
180 }
181
185 auto pop() -> value_type {
186 auto result = value_type {};
188 return result;
189 }
190
193 auto push(const_reference value) -> void {
194 data_->items.push(value);
196 ++data_->version;
197 }
198
201 auto push(value_type&& value) -> void {
202 data_->items.push(std::move(value));
204 ++data_->version;
205 }
206
211 if (data_->items.capacity() < capacity) data_->items.reserve(capacity);
212 return data_->items.capacity();
213 }
214
217 [[nodiscard]] enumerator<value_type> get_enumerator() const noexcept override {
218 struct stack_enumerator : public ienumerator < value_type > {
219 explicit stack_enumerator(const stack & items, xtd::usize version) : items_(items), version_(version) {}
220
221 [[nodiscard]] const value_type& current() const override {
222 if (iterator_ == items_.data_->items.crend()) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation);
223 if (version_ != items_.data_->version) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "Collection was modified; enumeration operation may not execute.");
224 return *iterator_;
225 }
226
227 [[nodiscard]] bool move_next() override {
228 if (version_ != items_.data_->version) xtd::helpers::throw_helper::throws(xtd::helpers::exception_case::invalid_operation, "Collection was modified; enumeration operation may not execute.");
229 if (index_++ && iterator_ != items_.data_->items.crend()) ++iterator_;
230 else iterator_ = items_.data_->items.crbegin();
231 return iterator_ != items_.data_->items.crend();
232 }
233
234 void reset() override {
235 index_ = 0;
236 version_ = items_.data_->version;
237 iterator_ = items_.data_->items.crend();
238 }
239
240 private:
241 size_type index_ = 0;
242 const stack& items_;
243 typename base_type::const_reverse_iterator iterator_ = items_.data_->items.crend();
244 size_type version_ = 0;
245 };
246 return {new_ptr < stack_enumerator > (self_, data_->version)};
247 }
248
253 [[nodiscard]] auto peek() const -> value_type {
254 auto result = value_type {};
256 return result;
257 }
258
261 [[nodiscard]] auto to_array() const -> xtd::array<value_type> {
263 copy_to(array, 0);
264 return array;
265 }
266
269 [[nodiscard]] auto to_string() const noexcept -> string override {return xtd::string::format("[{}]", xtd::string::join(", ", self_));}
270
275 auto trim_excess() -> void {
276 if (count() < static_cast<xtd::usize>(capacity() * 0.9)) trim_excess(count());
277 }
278
284 auto temp = base_type {};
285 temp.reserve(capacity);
286 for (auto& i : data_->items)
287 temp.push(i);
288 data_->items = std::move(temp);
289 ++data_->version;
290 }
291
295 [[nodiscard]] auto try_pop(value_type& result) noexcept -> bool {
296 if (!try_peek(result)) return false;
297 data_->items.pop();
298 ++data_->version;
299 return true;
300 }
301
305 [[nodiscard]] auto try_peek(value_type& result) const noexcept -> bool {
306 result = count() ? data_->items.top() : type_t {};
307 return count();
308 }
309
310
312
317 auto operator =(const stack& other) -> stack& = default;
321 auto operator =(stack&& other) noexcept -> stack& {
322 data_->items = std::move(other.data_->items);
323 ++data_->version;
324 return self_;
325 }
326
329 auto operator =(const std::initializer_list<type_t>& items) -> stack& {
330 data_->items = items;
331 ++data_->version;
332 return self_;
333 }
334
337 operator std::stack<type_t>() const {return items();}
339
340 private:
341 auto is_read_only() const noexcept -> bool override {return false;}
342 auto is_synchronized() const noexcept -> bool override {return false;}
343 const xtd::object& sync_root() const noexcept override {return data_->sync_root;}
344 auto add(const type_t& value) -> void override {push(value);}
345 auto remove(const type_t&) -> bool override {return false;}
346
347 struct stack_data {
349 xtd::object sync_root;
350 xtd::usize version = 0;
351 };
352
354 };
355
357 // Deduction guides for xtd::collections::generic::stack
358 // {
359 template < class type_t, typename container_t>
361
362 template < class type_t, typename container_t>
364
365 template < class type_t>
367
368 template < class type_t>
369 stack(std::initializer_list<type_t>) -> stack<type_t>;
370
371 template<typename input_iterator_t>
372 stack(input_iterator_t, input_iterator_t) -> stack<std::iter_value_t<input_iterator_t>>;
373 // }
375 }
376 }
377}
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:193
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:104
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:210
stack(std::stack< type_t > &&stack)
Move constructor with specified stack.
Definition stack.hpp:80
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:305
stack(const std::stack< type_t > &stack)
Default copy constructor with specified stack.
Definition stack.hpp:96
auto capacity() const noexcept -> size_type
Definition stack.hpp:136
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:282
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:295
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
Gets a std::stack<type_t>.
Definition stack.hpp:144
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:140
auto to_string() const noexcept -> string override
Returns a xtd::string that represents the current object.
Definition stack.hpp:269
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:124
auto peek() const -> value_type
Returns the object at the beginning of the xtd::collections::generic::stack <type_t> without removing...
Definition stack.hpp:253
auto trim_excess() -> void
Sets the capacity to the actual number of elements in the xtd::collections::generic::stack <type_t>,...
Definition stack.hpp:275
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:261
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:175
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:162
auto pop() -> value_type
Removes and returns the object at the beginning of the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:185
enumerator< value_type > get_enumerator() const noexcept override
Returns an enumerator that iterates through the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:217
stack(std::initializer_list< type_t > il)
Constructs the container with the contents of the specified initializer list, and allocator.
Definition stack.hpp:116
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:111
auto clear() -> void override
Removes all elements from the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:154
auto push(value_type &&value) -> void
Adds an object to the end of the xtd::collections::generic::stack <type_t>.
Definition stack.hpp:201
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:249
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:274
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.