MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
queue.hpp
1#ifndef MSTL_CORE_CONTAINER_QUEUE_HPP__
2#define MSTL_CORE_CONTAINER_QUEUE_HPP__
3#include "deque.hpp"
5
6template <typename T, typename Sequence = deque<T>>
7class queue : public icollector<queue<T, Sequence>> {
8 using super = icollector<queue>;
9
10public:
11 using value_type = typename Sequence::value_type;
12 using difference_type = typename Sequence::difference_type;
13 using size_type = typename Sequence::size_type;
14 using reference = typename Sequence::reference;
15 using const_reference = typename Sequence::const_reference;
16
17 using iterator = typename Sequence::iterator;
18 using const_iterator = typename Sequence::const_iterator;
19
20 static_assert(is_object_v<T>, "queue only contains object types.");
21 static_assert(is_same_v<T, value_type>, "queue require consistent types.");
22
23private:
24 Sequence seq_;
25
26public:
27
28 queue() = default;
29 explicit queue(const Sequence& x) : seq_(x) {}
30 explicit queue(Sequence&& x) noexcept(is_nothrow_move_constructible_v<Sequence>)
31 : seq_(_MSTL move(x)) {}
32 ~queue() = default;
33
34 MSTL_NODISCARD size_type size() const noexcept(noexcept(seq_.size())) { return seq_.size(); }
35 MSTL_NODISCARD bool empty() const noexcept(noexcept(seq_.empty())) { return seq_.empty(); }
36
37 MSTL_NODISCARD reference front() noexcept(noexcept(seq_.front())) { return seq_.front(); }
38 MSTL_NODISCARD const_reference front() const noexcept(noexcept(seq_.front())) { return seq_.front(); }
39 MSTL_NODISCARD reference back() noexcept(noexcept(seq_.back())) { return seq_.back(); }
40 MSTL_NODISCARD const_reference back() const noexcept(noexcept(seq_.back())) { return seq_.back(); }
41
42 MSTL_NODISCARD iterator begin() noexcept(noexcept(seq_.begin())) { return seq_.begin(); }
43 MSTL_NODISCARD iterator end() noexcept(noexcept(seq_.end())) { return seq_.end(); }
44 MSTL_NODISCARD const_iterator begin() const noexcept(noexcept(seq_.begin())) { return seq_.begin(); }
45 MSTL_NODISCARD const_iterator end() const noexcept(noexcept(seq_.end())) { return seq_.end(); }
46 MSTL_NODISCARD const_iterator cbegin() const noexcept(noexcept(seq_.cbegin())) { return seq_.cbegin(); }
47 MSTL_NODISCARD const_iterator cend() const noexcept(noexcept(seq_.cend())) { return seq_.cend(); }
48
49 void push(const T& x) { seq_.push_back(x); }
50 void push(T&& x) { seq_.push_back(_MSTL move(x)); }
51
52 void pop() noexcept(noexcept(seq_.pop_front())) { seq_.pop_front(); }
53
54 template <typename... Args>
55 decltype(auto) emplace(Args&&... args) { return seq_.emplace_back(_MSTL forward<Args>(args)...); }
56
57 void swap(queue& x) noexcept(is_nothrow_swappable_v<Sequence>) {
58 _MSTL swap(seq_, x.seq_);
59 }
60
61 MSTL_NODISCARD bool operator ==(const queue& rhs) const
62 noexcept(noexcept(seq_ == rhs.seq_)) {
63 return seq_ == rhs.seq_;
64 }
65 MSTL_NODISCARD bool operator <(const queue& rhs) const
66 noexcept(noexcept(seq_ < rhs.seq_)) {
67 return seq_ < rhs.seq_;
68 }
69};
70#if MSTL_SUPPORT_DEDUCTION_GUIDES__
71template <typename Sequence>
72queue(Sequence) -> queue<typename Sequence::value_type, Sequence>;
73#endif
74
76#endif // MSTL_CORE_CONTAINER_QUEUE_HPP__
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
void swap()=delete
删除无参数的swap重载
集合器接口模板
MSTL_NODISCARD constexpr decltype(auto) size() const noexcept(noexcept(derived().size()))
获取集合大小
MSTL_NODISCARD constexpr bool empty() const noexcept(noexcept(derived().empty()))
检查集合是否为空