DSA - Data Structures and Algorithms
Loading...
Searching...
No Matches
queue.h
Go to the documentation of this file.
1
11
12#ifndef QUEUE_H
13#define QUEUE_H
14
15#include "list.h"
16
17#include <initializer_list>
18#include <iostream>
19#include <utility>
20
21namespace dsa
22{
23 template<typename T>
24 class Queue;
25
26 template<typename T>
27 auto operator==(const Queue<T>& queue1, const Queue<T>& queue2) -> bool;
28
29 template<typename T>
30 auto operator<(const Queue<T>& queue1, const Queue<T>& queue2) -> bool;
31
41 template<typename T>
42 class Queue
43 {
44 public:
45
51 using value_type = T;
52
58 using reference = T&;
59
65 using const_reference = const T&;
66
71 Queue() = default;
72
78 Queue(const std::initializer_list<T>& init_list);
79
85 Queue(const Queue<T>& other);
86
93 auto operator=(const Queue<T>& other) -> Queue&;
94
101 Queue(Queue<T>&& other) noexcept;
102
110 auto operator=(Queue<T>&& other) noexcept -> Queue&;
111
115 ~Queue() = default;
116
122 auto front() -> reference;
123
129 [[nodiscard]] auto front() const -> const_reference;
130
136 auto back() -> reference;
137
143 [[nodiscard]] auto back() const -> const_reference;
144
151 [[nodiscard]] auto empty() const -> bool;
152
158 [[nodiscard]] auto size() const -> size_t;
159
165 void push(const_reference value);
166
172 void push(T&& value);
173
177 void pop();
178
184 void swap(Queue<T>& other) noexcept;
185
192 auto operator+=(const Queue<T>& other) -> Queue<T>&;
193
200 auto operator+=(const std::initializer_list<T>& init_list) -> Queue<T>&;
201
202 private:
203
207 friend auto operator==<T>(const Queue<T>& queue1, const Queue<T>& queue2) -> bool;
208
212 friend auto operator< <T>(const Queue<T>& queue1, const Queue<T>& queue2) -> bool;
213
214 List<T> container{};
215 };
216
217 template<typename T>
218 Queue<T>::Queue(const std::initializer_list<T>& init_list)
219 {
220 for (const auto& item : init_list)
221 {
222 container.push_back(item);
223 }
224 }
225
226 template<typename T>
228 {
229 if (other.size() >= 1)
230 {
231 for (const auto& item : other.container)
232 {
233 container.push_back(item);
234 }
235 }
236 }
237
238 template<typename T>
239 auto Queue<T>::operator=(const Queue<T>& other) -> Queue<T>&
240 {
241 if (&other != this)
242 {
243 while (!container.empty())
244 {
245 container.pop_front();
246 }
247
248 for (const auto& item : other.container)
249 {
250 container.push_back(item);
251 }
252 }
253
254 return *this;
255 }
256
257 template<typename T>
258 Queue<T>::Queue(Queue<T>&& other) noexcept
259 : container{ std::move(other.container) }
260 {
261 }
262
263 template<typename T>
264 auto Queue<T>::operator=(Queue<T>&& other) noexcept -> Queue<T>&
265 {
266 if (&other != this)
267 {
268 container = std::move(other.container);
269 }
270
271 return *this;
272 }
273
274 template<typename T>
276 {
277 return container.front();
278 }
279
280 template<typename T>
281 auto Queue<T>::front() const -> typename Queue<T>::const_reference
282 {
283 return container.front();
284 }
285
286 template<typename T>
288 {
289 return container.back();
290 }
291
292 template<typename T>
293 auto Queue<T>::back() const -> typename Queue<T>::const_reference
294 {
295 return container.back();
296 }
297
298 template<typename T>
299 auto Queue<T>::empty() const -> bool
300 {
301 return container.size() == 0;
302 }
303
304 template<typename T>
305 auto Queue<T>::size() const -> size_t
306 {
307 return container.size();
308 }
309
310 template<typename T>
312 {
313 container.push_back(value);
314 }
315
316 template<typename T>
317 void Queue<T>::push(T&& value)
318 {
319 container.push_back(std::move(value));
320 }
321
322 template<typename T>
324 {
325 container.pop_front();
326 }
327
328 template<typename T>
329 void Queue<T>::swap(Queue<T>& other) noexcept
330 {
331 if (&other != this)
332 {
333 std::swap(container, other.container);
334 }
335 }
336
337 template<typename T>
339 {
340 for (const auto& item : other.container)
341 {
342 push(item);
343 }
344
345 return *this;
346 }
347
356 template<typename T>
357 auto operator<<(std::ostream& out, const Queue<T>& queue) -> std::ostream&
358 {
359 Queue<T> temp{ queue };
360
361 while (!temp.empty())
362 {
363 out << temp.front() << ' ';
364 temp.pop();
365 }
366
367 return out;
368 }
369
379 template<typename T>
380 auto operator==(const Queue<T>& queue1, const Queue<T>& queue2) -> bool
381 {
382 return queue1.container == queue2.container;
383 }
384
394 template<typename T>
395 auto operator!=(const Queue<T>& queue1, const Queue<T>& queue2) -> bool
396 {
397 return !(operator==(queue1, queue2));
398 }
399
410 template<typename T>
411 auto operator<(const Queue<T>& queue1, const Queue<T>& queue2) -> bool
412 {
413 return queue1.container < queue2.container;
414 }
415
426 template<typename T>
427 auto operator>(const Queue<T>& queue1, const Queue<T>& queue2) -> bool
428 {
429 return operator<(queue2, queue1);
430 }
431
442 template<typename T>
443 auto operator<=(const Queue<T>& queue1, const Queue<T>& queue2) -> bool
444 {
445 return !(operator>(queue1, queue2));
446 }
447
458 template<typename T>
459 auto operator>=(const Queue<T>& queue1, const Queue<T>& queue2) -> bool
460 {
461 return !(operator<(queue1, queue2));
462 }
463
464}
465#endif // !QUEUE_H
constexpr auto operator==(const Array< T, N > &lhs, const Array< T, N > &rhs) noexcept(noexcept(*lhs.begin()== *rhs.begin())) -> bool
The relational operator compares two Array objects.
Definition array.h:591
auto operator<<(std::ostream &out, const Array< T, N > &array) -> std::ostream &
Overloads operator to print all elements of Array.
Definition array.h:572
Implements List using Node with pointer to adjacent elements as internal base.
Definition list.h:57
Implements Queue class.
Definition queue.h:43
auto operator=(const Queue< T > &other) -> Queue &
Constructs Queue using copy assignment.
Definition queue.h:239
void push(const_reference value)
Function add new element at the end of Queue.
Definition queue.h:311
auto empty() const -> bool
Function checks if container has no elements.
Definition queue.h:299
T & reference
Alias for reference to data type used in class.
Definition queue.h:58
void pop()
Function removes the first element of Queue.
Definition queue.h:323
auto back() -> reference
Function returns pointer to Queue last object.
Definition queue.h:287
void swap(Queue< T > &other) noexcept
Function swaps content of two Queue objects.
Definition queue.h:329
T value_type
Alias for data type used in class.
Definition queue.h:51
const T & const_reference
Alias for const reference to data type used in class.
Definition queue.h:65
friend auto operator==(const Queue< T > &queue1, const Queue< T > &queue2) -> bool
Forward friend declaration to access internal container comparison operator.
Definition queue.h:380
auto front() -> reference
Function returns pointer to Queue first object.
Definition queue.h:275
~Queue()=default
Destroy the Queue object.
friend auto operator<(const Queue< T > &queue1, const Queue< T > &queue2) -> bool
Forward friend declaration to access internal container comparison operator.
Definition queue.h:411
auto size() const -> size_t
Function returns Queue size.
Definition queue.h:305
Queue()=default
Construct a new Queue object.
auto operator+=(const Queue< T > &other) -> Queue< T > &
Function add range of elements at the end of Queue.
Definition queue.h:338
This file contains implementation of List class.
auto operator>(const List< T > &list1, const List< T > &list2) -> bool
The relational operator compares two List objects.
Definition list.h:1980
auto operator>=(const List< T > &list1, const List< T > &list2) -> bool
The relational operator compares two List objects.
Definition list.h:2012
auto operator<=(const List< T > &list1, const List< T > &list2) -> bool
The relational operator compares two List objects.
Definition list.h:1996
auto operator!=(const List< T > &list1, const List< T > &list2) -> bool
The relational operator compares two List objects.
Definition list.h:1928
auto operator<(const List< T > &list1, const List< T > &list2) -> bool
The relational operator compares two List objects.
Definition list.h:1944