MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
stack.hpp
1#ifndef MSTL_CORE_CONTAINER_STACK_HPP__
2#define MSTL_CORE_CONTAINER_STACK_HPP__
3#include "deque.hpp"
5
6template <typename T, typename Sequence = deque<T>>
7class stack : public icollector<stack<T, Sequence>> {
8public:
9 using value_type = typename Sequence::value_type;
10 using difference_type = typename Sequence::difference_type;
11 using size_type = typename Sequence::size_type;
12 using reference = typename Sequence::reference;
13 using const_reference = typename Sequence::const_reference;
14
15 static_assert(is_object_v<T>, "stack only contains object types.");
16 static_assert(is_same_v<T, value_type>, "stack require consistent types.");
17
18private:
19 Sequence seq_;
20
21public:
22 stack() = default;
23 explicit stack(const Sequence& seq) : seq_(seq) {}
24 explicit stack(Sequence&& seq) noexcept(is_nothrow_move_constructible_v<Sequence>)
25 : seq_(_MSTL move(seq)) {}
26 ~stack() = default;
27
28 MSTL_NODISCARD size_type size() const noexcept(noexcept(seq_.size())) { return seq_.size(); }
29 MSTL_NODISCARD bool empty() const noexcept(noexcept(seq_.empty())) { return seq_.empty(); }
30
31 MSTL_NODISCARD reference top() noexcept(noexcept(seq_.back())) { return seq_.back(); }
32 MSTL_NODISCARD const_reference top() const noexcept(noexcept(seq_.back())) { return seq_.back(); }
33
34 template <typename... Args>
35 decltype(auto) emplace(Args&&... args) { return seq_.emplace(_MSTL forward<Args>(args)...); }
36
37 void push(const value_type& x) { seq_.push_back(x); }
38 void push(value_type&& x) { seq_.push_back(_MSTL move(x)); }
39
40 void pop() noexcept(noexcept(seq_.pop_back())) { seq_.pop_back(); }
41
42 void swap(stack& x) noexcept(is_nothrow_swappable_v<Sequence>) {
43 _MSTL swap(seq_, x.seq_);
44 }
45
46 MSTL_NODISCARD bool operator ==(const stack& rhs) const
47 noexcept(noexcept(seq_ == rhs.seq_)) {
48 return seq_ == rhs.seq_;
49 }
50 MSTL_NODISCARD bool operator <(const stack& rhs) const
51 noexcept(noexcept(seq_ < rhs.seq_)) {
52 return seq_ < rhs.seq_;
53 }
54};
55#ifdef MSTL_SUPPORT_DEDUCTION_GUIDES__
56template <typename Sequence>
57stack(Sequence) -> stack<typename Sequence::value_type, Sequence>;
58#endif
59
61#endif // MSTL_CORE_CONTAINER_STACK_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()))
检查集合是否为空