1#ifndef MSTL_CORE_CONTAINER_STACK_HPP__
2#define MSTL_CORE_CONTAINER_STACK_HPP__
6template <
typename T,
typename Sequence = deque<T>>
7class stack :
public icollector<stack<T, Sequence>> {
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;
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.");
23 explicit stack(
const Sequence& seq) : seq_(seq) {}
24 explicit stack(Sequence&& seq)
noexcept(is_nothrow_move_constructible_v<Sequence>)
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(); }
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(); }
34 template <
typename... Args>
35 decltype(
auto) emplace(Args&&... args) {
return seq_.emplace(
_MSTL forward<Args>(args)...); }
37 void push(
const value_type& x) { seq_.push_back(x); }
38 void push(value_type&& x) { seq_.push_back(
_MSTL move(x)); }
40 void pop() noexcept(noexcept(seq_.pop_back())) { seq_.pop_back(); }
42 void swap(stack& x)
noexcept(is_nothrow_swappable_v<Sequence>) {
46 MSTL_NODISCARD
bool operator ==(
const stack& rhs)
const
47 noexcept(
noexcept(seq_ == rhs.seq_)) {
48 return seq_ == rhs.seq_;
50 MSTL_NODISCARD
bool operator <(
const stack& rhs)
const
51 noexcept(
noexcept(seq_ < rhs.seq_)) {
52 return seq_ < rhs.seq_;
55#ifdef MSTL_SUPPORT_DEDUCTION_GUIDES__
56template <
typename Sequence>
57stack(Sequence) -> stack<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()))
检查集合是否为空