Iros
 
Loading...
Searching...
No Matches
stack.h
Go to the documentation of this file.
1#pragma once
2
11
12namespace di::container {
13namespace detail {
14 template<typename Con, typename Value>
16 requires(Con& container, Value&& value) {
18 { util::as_const(container).back() } -> concepts::SameAs<Optional<Value const&>>;
19 container.emplace_back(util::move(value));
22 };
23}
24
25template<typename Value, detail::StackCompatible<Value> Con = container::Vector<Value>>
26class Stack {
27private:
28 template<concepts::InputContainer Other>
30 constexpr friend auto tag_invoke(types::Tag<util::create_in_place>, InPlaceType<Stack>, Other&& other) {
31 return as_fallible(util::forward<Other>(other) | container::to<Con>()) % [&](Con&& container) {
32 return Stack(util::move(container));
34 }
35
36 struct Iterator : public IteratorBase<Iterator, InputIteratorTag, Value, meta::ContainerSSizeType<Con>> {
37 private:
38 friend class Stack;
39
40 constexpr explicit Iterator(Stack& base) : m_base(util::addressof(base)) {}
41
42 public:
43 Iterator() = default;
44
45 constexpr auto operator*() const -> Value& { return *m_base->top(); }
46
47 constexpr void advance_one() { m_base->pop(); }
48
49 private:
50 constexpr friend auto operator==(Iterator const& a, DefaultSentinel const&) -> bool {
51 return a.m_base->empty();
52 }
53
54 Stack* m_base { nullptr };
55 };
56
57public:
58 Stack() = default;
59
60 constexpr explicit Stack(Con&& container) : m_container(util::move(container)) {}
61
62 constexpr auto top() -> Optional<Value&> { return m_container.back(); }
63 constexpr auto top() const -> Optional<Value const&> { return m_container.back(); }
64
65 constexpr auto empty() const -> bool { return size() == 0U; }
66 constexpr auto size() const { return m_container.size(); }
67
68 constexpr auto push(Value const& value) -> decltype(auto)
70 {
71 return emplace(value);
72 }
73 constexpr auto push(Value&& value) -> decltype(auto) { return emplace(util::move(value)); }
74
75 template<typename... Args>
76 requires(concepts::ConstructibleFrom<Value, Args...>)
77 constexpr auto emplace(Args&&... args) -> decltype(auto) {
78 return m_container.emplace_back(util::forward<Args>(args)...);
79 }
80
81 template<concepts::ContainerCompatible<Value> Other>
82 constexpr auto push_container(Other&& container) {
83 return m_container.append_container(util::forward<Other>(container));
84 }
85
86 constexpr auto pop() { return m_container.pop_back(); }
87
88 constexpr auto begin() { return Iterator(*this); }
89 constexpr auto end() { return default_sentinel; }
90
91 constexpr auto base() const -> Con const& { return m_container; }
92
93 constexpr void clear() { m_container.clear(); }
94
95private:
96 constexpr friend auto tag_invoke(types::Tag<util::clone>, Stack const& self) {
97 return self | container::to<Stack>();
98 }
99
100 Con m_container {};
101};
102
103template<concepts::Container Con, typename T = meta::ContainerValue<Con>>
104requires(detail::StackCompatible<Con, T>)
106
107template<concepts::InputContainer Con, typename T = meta::ContainerValue<Con>>
109}
110
111namespace di {
112using container::Stack;
113}
Definition stack.h:26
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 container.h:8
Definition operations.h:34
Definition core.h:114
Definition language.h:244
Definition sequence.h:13
Definition sequence.h:12
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 vocab.h:96
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