1#ifndef MSTL_CORE_CONTAINER_QUEUE_HPP__
2#define MSTL_CORE_CONTAINER_QUEUE_HPP__
6template <
typename T,
typename Sequence = deque<T>>
7class queue :
public icollector<queue<T, Sequence>> {
8 using super = icollector<queue>;
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;
17 using iterator =
typename Sequence::iterator;
18 using const_iterator =
typename Sequence::const_iterator;
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.");
29 explicit queue(
const Sequence& x) : seq_(x) {}
30 explicit queue(Sequence&& x)
noexcept(is_nothrow_move_constructible_v<Sequence>)
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(); }
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(); }
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(); }
49 void push(
const T& x) { seq_.push_back(x); }
50 void push(T&& x) { seq_.push_back(
_MSTL move(x)); }
52 void pop() noexcept(noexcept(seq_.pop_front())) { seq_.pop_front(); }
54 template <
typename... Args>
55 decltype(
auto) emplace(Args&&... args) {
return seq_.emplace_back(
_MSTL forward<Args>(args)...); }
57 void swap(queue& x)
noexcept(is_nothrow_swappable_v<Sequence>) {
61 MSTL_NODISCARD
bool operator ==(
const queue& rhs)
const
62 noexcept(
noexcept(seq_ == rhs.seq_)) {
63 return seq_ == rhs.seq_;
65 MSTL_NODISCARD
bool operator <(
const queue& rhs)
const
66 noexcept(
noexcept(seq_ < rhs.seq_)) {
67 return seq_ < rhs.seq_;
70#if MSTL_SUPPORT_DEDUCTION_GUIDES__
71template <
typename Sequence>
72queue(Sequence) -> queue<typename Sequence::value_type, Sequence>;
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()))
检查集合是否为空