Iros
 
Loading...
Searching...
No Matches
queue.h
Go to the documentation of this file.
1#pragma once
2
10
11namespace di::container {
12namespace detail {
13 template<typename Con, typename Value>
15 requires(Con& container, Value&& value) {
17 { util::as_const(container).front() } -> concepts::SameAs<Optional<Value const&>>;
18 container.pop_front();
19 };
20}
21
22template<typename Value, detail::QueueCompatible<Value> Con = container::Ring<Value>>
23class Queue {
24private:
25 Con m_container {};
26
27 template<concepts::InputContainer Other>
29 constexpr friend auto tag_invoke(types::Tag<util::create_in_place>, InPlaceType<Queue>, Other&& other) {
30 return as_fallible(util::forward<Other>(other) | container::to<Con>()) % [&](Con&& container) {
31 return Queue(util::move(container));
33 }
34
35 struct Iterator : public IteratorBase<Iterator, InputIteratorTag, Value, meta::ContainerSSizeType<Con>> {
36 private:
37 friend class Queue;
38
39 constexpr explicit Iterator(Queue& base) : m_base(util::addressof(base)) {}
40
41 public:
42 Iterator() = default;
43
44 constexpr auto operator*() const -> Value& { return *m_base->front(); }
45
46 constexpr void advance_one() { m_base->pop(); }
47
48 private:
49 constexpr friend auto operator==(Iterator const& a, DefaultSentinel const&) -> bool {
50 return a.m_base->empty();
51 }
52
53 Queue* m_base { nullptr };
54 };
55
56public:
57 Queue() = default;
58
59 Queue(Queue&&) = default;
60
61 constexpr explicit Queue(Con&& container) : m_container(util::move(container)) {}
62
63 ~Queue() = default;
64
65 auto operator=(Queue&&) -> Queue& = default;
66
67 constexpr auto front() { return m_container.front(); }
68 constexpr auto front() const { return m_container.front(); }
69
70 constexpr auto back()
71 requires(requires { m_container.back(); })
72 {
73 return m_container.back();
74 }
75 constexpr auto back() const
76 requires(requires { m_container.back(); })
77 {
78 return m_container.back();
79 }
80
81 constexpr auto empty() const -> bool { return m_container.empty(); }
82 constexpr auto size() const
83 requires(concepts::SizedContainer<Con>)
84 {
85 return m_container.size();
86 }
87
88 constexpr auto push(Value& value) -> decltype(auto)
90 {
91 return m_container.push_back(value);
92 }
93
94 constexpr auto push(Value const& value) -> decltype(auto)
96 {
97 return m_container.push_back(value);
98 }
99
100 constexpr auto push(Value&& value) -> decltype(auto)
102 {
103 return m_container.push_back(util::move(value));
104 }
105
106 template<typename... Args>
107 constexpr auto emplace(Args&&... args) -> decltype(auto)
108 requires(requires { m_container.emplace_back(util::forward<Args>(args)...); })
109 {
110 return m_container.emplace_back(util::forward<Args>(args)...);
111 }
112
113 template<concepts::ContainerCompatible<Value> Other>
114 requires(requires { m_container.append_container(util::forward<Other>(m_container)); })
115 constexpr auto push_container(Other&& container) {
116 return m_container.append_container(util::forward<Other>(container));
117 }
118
119 constexpr auto pop() { return m_container.pop_front(); }
120
121 constexpr auto begin() { return Iterator(*this); }
122 constexpr auto end() { return default_sentinel; }
123
124 constexpr auto base() const -> Con const& { return m_container; }
125
126 constexpr void clear() { m_container.clear(); }
127
128private:
129 constexpr friend auto tag_invoke(types::Tag<util::clone>, Queue const& self)
131 {
132 return self | container::to<Queue>();
133 }
134};
135
136template<concepts::Container Con, typename T = meta::ContainerValue<Con>>
137requires(detail::QueueCompatible<Con, T>)
139
140template<concepts::InputContainer Con, typename T = meta::ContainerValue<Con>>
142}
143
144namespace di {
145using container::Queue;
146}
Definition queue.h:23
constexpr void clear()
Definition queue.h:126
constexpr auto push(Value &value) -> decltype(auto) requires(!concepts::CopyConstructible< Value > &&!concepts::MoveConstructible< Value >)
Definition queue.h:88
constexpr auto back()
Definition queue.h:70
constexpr friend auto tag_invoke(types::Tag< util::clone >, Queue const &self)
Definition queue.h:129
constexpr auto push(Value const &value) -> decltype(auto) requires(concepts::CopyConstructible< Value >)
Definition queue.h:94
constexpr auto begin()
Definition queue.h:121
constexpr auto push(Value &&value) -> decltype(auto) requires(concepts::MoveConstructible< Value >)
Definition queue.h:100
constexpr auto base() const -> Con const &
Definition queue.h:124
constexpr auto size() const
Definition queue.h:82
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< Queue >, Other &&other)
Definition queue.h:29
constexpr auto empty() const -> bool
Definition queue.h:81
constexpr auto front()
Definition queue.h:67
Queue(Queue &&)=default
constexpr auto back() const
Definition queue.h:75
auto operator=(Queue &&) -> Queue &=default
constexpr auto pop()
Definition queue.h:119
constexpr auto front() const
Definition queue.h:68
constexpr auto emplace(Args &&... args) -> decltype(auto) requires(
Definition queue.h:107
constexpr Queue(Con &&container)
Definition queue.h:61
constexpr auto push_container(Other &&container)
Definition queue.h:115
constexpr auto end()
Definition queue.h:122
Definition clone.h:44
Definition container_compatible.h:9
Definition container.h:8
Definition operations.h:34
Definition operations.h:43
Definition core.h:114
Definition any_storable.h:9
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
Queue(Con) -> Queue< 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