NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
queue.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_QUEUE_HPP__
2#define NEFORCE_CORE_CONTAINER_QUEUE_HPP__
3
12
14NEFORCE_BEGIN_NAMESPACE__
15
21
35template <typename T, typename Sequence = deque<T>>
36class queue : public icollector<queue<T, Sequence>> {
37 static_assert(is_object_v<T>, "queue only contains object types.");
38 static_assert(is_same_v<T, typename Sequence::value_type>, "queue require consistent types.");
39
40public:
41 using value_type = typename Sequence::value_type;
42 using difference_type = typename Sequence::difference_type;
43 using size_type = typename Sequence::size_type;
44 using reference = typename Sequence::reference;
45 using const_reference = typename Sequence::const_reference;
46 using iterator = typename Sequence::iterator;
47 using const_iterator = typename Sequence::const_iterator;
48
49private:
50 Sequence seq_{};
51
52public:
58 queue() = default;
59
64 explicit queue(const Sequence& other) :
65 seq_(other) {}
66
71 explicit queue(Sequence&& other) noexcept(is_nothrow_move_constructible_v<Sequence>) :
72 seq_(_NEFORCE move(other)) {}
73
77 ~queue() = default;
78
83 NEFORCE_NODISCARD size_type size() const noexcept(noexcept(seq_.size())) { return seq_.size(); }
84
89 NEFORCE_NODISCARD bool empty() const noexcept(noexcept(seq_.empty())) { return seq_.empty(); }
90
95 NEFORCE_NODISCARD reference front() noexcept(noexcept(seq_.front())) { return seq_.front(); }
96
101 NEFORCE_NODISCARD const_reference front() const noexcept(noexcept(seq_.front())) { return seq_.front(); }
102
107 NEFORCE_NODISCARD reference back() noexcept(noexcept(seq_.back())) { return seq_.back(); }
108
113 NEFORCE_NODISCARD const_reference back() const noexcept(noexcept(seq_.back())) { return seq_.back(); }
114
119 NEFORCE_NODISCARD iterator begin() noexcept(noexcept(seq_.begin())) { return seq_.begin(); }
120
125 NEFORCE_NODISCARD iterator end() noexcept(noexcept(seq_.end())) { return seq_.end(); }
126
131 NEFORCE_NODISCARD const_iterator begin() const noexcept(noexcept(seq_.begin())) { return seq_.begin(); }
132
137 NEFORCE_NODISCARD const_iterator end() const noexcept(noexcept(seq_.end())) { return seq_.end(); }
138
143 NEFORCE_NODISCARD const_iterator cbegin() const noexcept(noexcept(seq_.cbegin())) { return seq_.cbegin(); }
144
149 NEFORCE_NODISCARD const_iterator cend() const noexcept(noexcept(seq_.cend())) { return seq_.cend(); }
150
157 void push(const T& value) { seq_.push_back(value); }
158
165 void push(T&& value) { seq_.push_back(_NEFORCE move(value)); }
166
172 void pop() noexcept(noexcept(seq_.pop_front())) { seq_.pop_front(); }
173
180 template <typename... Args>
181 decltype(auto) emplace(Args&&... args) {
182 return seq_.emplace_back(_NEFORCE forward<Args>(args)...);
183 }
184
189 void swap(queue& other) noexcept(is_nothrow_swappable_v<Sequence>) { _NEFORCE swap(seq_, other.seq_); }
190
196 NEFORCE_NODISCARD bool operator==(const queue& rhs) const noexcept(noexcept(seq_ == rhs.seq_)) {
197 return seq_ == rhs.seq_;
198 }
199
205 NEFORCE_NODISCARD bool operator<(const queue& rhs) const noexcept(noexcept(seq_ < rhs.seq_)) {
206 return seq_ < rhs.seq_;
207 }
208};
209
210#ifdef NEFORCE_STANDARD_17
211template <typename Sequence>
213#endif
214 // Container
216
217NEFORCE_END_NAMESPACE__
218#endif // NEFORCE_CORE_CONTAINER_QUEUE_HPP__
队列容器适配器
NEFORCE_NODISCARD const_reference back() const noexcept(noexcept(seq_.back()))
常量版本,访问队尾元素
typename Sequence::difference_type difference_type
差值类型
NEFORCE_NODISCARD bool operator==(const queue &rhs) const noexcept(noexcept(seq_==rhs.seq_))
相等比较操作符
NEFORCE_NODISCARD iterator begin() noexcept(noexcept(seq_.begin()))
获取起始迭代器
NEFORCE_NODISCARD reference back() noexcept(noexcept(seq_.back()))
访问队尾元素
NEFORCE_NODISCARD const_iterator begin() const noexcept(noexcept(seq_.begin()))
获取常量起始迭代器
typename Sequence::iterator iterator
迭代器类型
NEFORCE_NODISCARD bool empty() const noexcept(noexcept(seq_.empty()))
检查队列是否为空
NEFORCE_NODISCARD iterator end() noexcept(noexcept(seq_.end()))
获取结束迭代器
NEFORCE_NODISCARD reference front() noexcept(noexcept(seq_.front()))
访问队首元素
NEFORCE_NODISCARD const_iterator cend() const noexcept(noexcept(seq_.cend()))
获取常量结束迭代器
queue(Sequence &&other) noexcept(is_nothrow_move_constructible_v< Sequence >)
移动构造函数,使用指定的底层容器
typename Sequence::size_type size_type
大小类型
typename Sequence::const_reference const_reference
常量引用类型
void push(T &&value)
入队操作(移动版本)
typename Sequence::value_type value_type
值类型
NEFORCE_NODISCARD bool operator<(const queue &rhs) const noexcept(noexcept(seq_< rhs.seq_))
小于比较操作符
~queue()=default
析构函数
void pop() noexcept(noexcept(seq_.pop_front()))
出队操作
NEFORCE_NODISCARD const_iterator end() const noexcept(noexcept(seq_.end()))
获取常量结束迭代器
NEFORCE_NODISCARD const_reference front() const noexcept(noexcept(seq_.front()))
常量版本,访问队首元素
queue()=default
默认构造函数
void push(const T &value)
入队操作(拷贝版本)
NEFORCE_NODISCARD size_type size() const noexcept(noexcept(seq_.size()))
获取队列大小
decltype(auto) emplace(Args &&... args)
在队尾就地构造元素
void swap(queue &other) noexcept(is_nothrow_swappable_v< Sequence >)
交换两个队列的内容
typename Sequence::reference reference
引用类型
typename Sequence::const_iterator const_iterator
常量迭代器类型
NEFORCE_NODISCARD const_iterator cbegin() const noexcept(noexcept(seq_.cbegin()))
获取常量起始迭代器
queue(const Sequence &other)
构造函数,使用指定的底层容器副本
双端队列容器
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_INLINE17 constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
集合器接口模板