14 template<
typename Con,
typename Value>
19 container.emplace_back(util::move(value));
25template<
typename Value, detail::StackCompatible<Value> Con = container::Vector<Value>>
28 template<concepts::InputContainer Other>
36 struct Iterator :
public IteratorBase<Iterator, InputIteratorTag, Value, meta::ContainerSSizeType<Con>> {
45 constexpr auto operator*() const -> Value& {
return *m_base->
top(); }
47 constexpr void advance_one() { m_base->
pop(); }
50 constexpr friend auto operator==(Iterator
const& a, DefaultSentinel
const&) ->
bool {
51 return a.m_base->empty();
54 Stack* m_base {
nullptr };
63 constexpr auto top() const ->
Optional<Value const&> {
return m_container.back(); }
65 constexpr auto empty() const ->
bool {
return size() == 0U; }
66 constexpr auto size()
const {
return m_container.size(); }
68 constexpr auto push(Value
const& value) ->
decltype(
auto)
73 constexpr auto push(Value&& value) ->
decltype(
auto) {
return emplace(util::move(value)); }
75 template<
typename... Args>
77 constexpr auto emplace(Args&&... args) ->
decltype(
auto) {
78 return m_container.emplace_back(util::forward<Args>(args)...);
81 template<concepts::ContainerCompatible<Value> Other>
83 return m_container.append_container(util::forward<Other>(
container));
86 constexpr auto pop() {
return m_container.pop_back(); }
88 constexpr auto begin() {
return Iterator(*
this); }
91 constexpr auto base() const -> Con const& {
return m_container; }
93 constexpr void clear() { m_container.clear(); }
103template<concepts::Container Con,
typename T = meta::ContainerValue<Con>>
104requires(detail::StackCompatible<Con, T>)
107template<concepts::InputContainer Con,
typename T = meta::ContainerValue<Con>>
constexpr auto top() const -> Optional< Value const & >
Definition stack.h:63
constexpr auto end()
Definition stack.h:89
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< Stack >, Other &&other)
Definition stack.h:30
constexpr auto push(Value const &value) -> decltype(auto) requires(concepts::CopyConstructible< Value >)
Definition stack.h:68
constexpr friend auto tag_invoke(types::Tag< util::clone >, Stack const &self)
Definition stack.h:96
constexpr auto base() const -> Con const &
Definition stack.h:91
constexpr void clear()
Definition stack.h:93
constexpr auto size() const
Definition stack.h:66
constexpr auto empty() const -> bool
Definition stack.h:65
constexpr auto push(Value &&value) -> decltype(auto)
Definition stack.h:73
constexpr auto push_container(Other &&container)
Definition stack.h:82
constexpr auto pop()
Definition stack.h:86
constexpr Stack(Con &&container)
Definition stack.h:60
constexpr auto emplace(Args &&... args) -> decltype(auto)
Definition stack.h:77
constexpr auto top() -> Optional< Value & >
Definition stack.h:62
constexpr auto begin()
Definition stack.h:88
Definition optional_forward_declaration.h:5
Definition operations.h:11
Definition container_compatible.h:9
Definition operations.h:34
Definition language.h:244
constexpr auto move
Definition move.h:38
constexpr auto to(Con &&container, Args &&... args)
Definition to.h:25
constexpr auto default_sentinel
Definition default_sentinel.h:6
Stack(Con) -> Stack< T, Con >
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition zstring_parser.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto as_fallible
Definition as_fallible.h:26
constexpr auto try_infallible
Definition try_infallible.h:31
Definition iterator_base.h:14
Definition in_place_template.h:5
Definition in_place_type.h:5