xref: /openbsd/gnu/llvm/libcxx/include/stack (revision 76d0caae)
146035553Spatrick// -*- C++ -*-
246035553Spatrick//===---------------------------- stack -----------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_STACK
1146035553Spatrick#define _LIBCPP_STACK
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    stack synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatricktemplate <class T, class Container = deque<T>>
2046035553Spatrickclass stack
2146035553Spatrick{
2246035553Spatrickpublic:
2346035553Spatrick    typedef Container                                container_type;
2446035553Spatrick    typedef typename container_type::value_type      value_type;
2546035553Spatrick    typedef typename container_type::reference       reference;
2646035553Spatrick    typedef typename container_type::const_reference const_reference;
2746035553Spatrick    typedef typename container_type::size_type       size_type;
2846035553Spatrick
2946035553Spatrickprotected:
3046035553Spatrick    container_type c;
3146035553Spatrick
3246035553Spatrickpublic:
3346035553Spatrick    stack() = default;
3446035553Spatrick    ~stack() = default;
3546035553Spatrick
3646035553Spatrick    stack(const stack& q) = default;
3746035553Spatrick    stack(stack&& q) = default;
3846035553Spatrick
3946035553Spatrick    stack& operator=(const stack& q) = default;
4046035553Spatrick    stack& operator=(stack&& q) = default;
4146035553Spatrick
4246035553Spatrick    explicit stack(const container_type& c);
4346035553Spatrick    explicit stack(container_type&& c);
4446035553Spatrick    template <class Alloc> explicit stack(const Alloc& a);
4546035553Spatrick    template <class Alloc> stack(const container_type& c, const Alloc& a);
4646035553Spatrick    template <class Alloc> stack(container_type&& c, const Alloc& a);
4746035553Spatrick    template <class Alloc> stack(const stack& c, const Alloc& a);
4846035553Spatrick    template <class Alloc> stack(stack&& c, const Alloc& a);
4946035553Spatrick
5046035553Spatrick    bool empty() const;
5146035553Spatrick    size_type size() const;
5246035553Spatrick    reference top();
5346035553Spatrick    const_reference top() const;
5446035553Spatrick
5546035553Spatrick    void push(const value_type& x);
5646035553Spatrick    void push(value_type&& x);
5746035553Spatrick    template <class... Args> reference emplace(Args&&... args); // reference in C++17
5846035553Spatrick    void pop();
5946035553Spatrick
6046035553Spatrick    void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>)
6146035553Spatrick};
6246035553Spatrick
6346035553Spatricktemplate<class Container>
6446035553Spatrick  stack(Container) -> stack<typename Container::value_type, Container>;  // C++17
6546035553Spatrick
6646035553Spatricktemplate<class Container, class Allocator>
6746035553Spatrick  stack(Container, Allocator) -> stack<typename Container::value_type, Container>; // C++17
6846035553Spatrick
6946035553Spatricktemplate <class T, class Container>
7046035553Spatrick  bool operator==(const stack<T, Container>& x, const stack<T, Container>& y);
7146035553Spatricktemplate <class T, class Container>
7246035553Spatrick  bool operator< (const stack<T, Container>& x, const stack<T, Container>& y);
7346035553Spatricktemplate <class T, class Container>
7446035553Spatrick  bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y);
7546035553Spatricktemplate <class T, class Container>
7646035553Spatrick  bool operator> (const stack<T, Container>& x, const stack<T, Container>& y);
7746035553Spatricktemplate <class T, class Container>
7846035553Spatrick  bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y);
7946035553Spatricktemplate <class T, class Container>
8046035553Spatrick  bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y);
8146035553Spatrick
8246035553Spatricktemplate <class T, class Container>
8346035553Spatrick  void swap(stack<T, Container>& x, stack<T, Container>& y)
8446035553Spatrick  noexcept(noexcept(x.swap(y)));
8546035553Spatrick
8646035553Spatrick}  // std
8746035553Spatrick
8846035553Spatrick*/
8946035553Spatrick
9046035553Spatrick#include <__config>
91*76d0caaeSpatrick#include <__memory/uses_allocator.h>
92*76d0caaeSpatrick#include <__utility/forward.h>
9346035553Spatrick#include <deque>
9446035553Spatrick
9546035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
9646035553Spatrick#pragma GCC system_header
9746035553Spatrick#endif
9846035553Spatrick
9946035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
10046035553Spatrick
10146035553Spatricktemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack;
10246035553Spatrick
10346035553Spatricktemplate <class _Tp, class _Container>
10446035553Spatrick_LIBCPP_INLINE_VISIBILITY
10546035553Spatrickbool
10646035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
10746035553Spatrick
10846035553Spatricktemplate <class _Tp, class _Container>
10946035553Spatrick_LIBCPP_INLINE_VISIBILITY
11046035553Spatrickbool
11146035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
11246035553Spatrick
11346035553Spatricktemplate <class _Tp, class _Container /*= deque<_Tp>*/>
11446035553Spatrickclass _LIBCPP_TEMPLATE_VIS stack
11546035553Spatrick{
11646035553Spatrickpublic:
11746035553Spatrick    typedef _Container                               container_type;
11846035553Spatrick    typedef typename container_type::value_type      value_type;
11946035553Spatrick    typedef typename container_type::reference       reference;
12046035553Spatrick    typedef typename container_type::const_reference const_reference;
12146035553Spatrick    typedef typename container_type::size_type       size_type;
12246035553Spatrick    static_assert((is_same<_Tp, value_type>::value), "" );
12346035553Spatrick
12446035553Spatrickprotected:
12546035553Spatrick    container_type c;
12646035553Spatrick
12746035553Spatrickpublic:
12846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
12946035553Spatrick    stack()
13046035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
13146035553Spatrick        : c() {}
13246035553Spatrick
13346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
13446035553Spatrick    stack(const stack& __q) : c(__q.c) {}
13546035553Spatrick
13646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
13746035553Spatrick    stack& operator=(const stack& __q) {c = __q.c; return *this;}
13846035553Spatrick
13946035553Spatrick
14046035553Spatrick#ifndef _LIBCPP_CXX03_LANG
14146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
14246035553Spatrick    stack(stack&& __q)
14346035553Spatrick        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
14446035553Spatrick        : c(_VSTD::move(__q.c)) {}
14546035553Spatrick
14646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
14746035553Spatrick    stack& operator=(stack&& __q)
14846035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
14946035553Spatrick        {c = _VSTD::move(__q.c); return *this;}
15046035553Spatrick
15146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
15246035553Spatrick    explicit stack(container_type&& __c) : c(_VSTD::move(__c)) {}
15346035553Spatrick#endif // _LIBCPP_CXX03_LANG
15446035553Spatrick
15546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
15646035553Spatrick    explicit stack(const container_type& __c) : c(__c) {}
15746035553Spatrick
15846035553Spatrick    template <class _Alloc>
15946035553Spatrick        _LIBCPP_INLINE_VISIBILITY
16046035553Spatrick        explicit stack(const _Alloc& __a,
161*76d0caaeSpatrick                       _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0)
16246035553Spatrick            : c(__a) {}
16346035553Spatrick    template <class _Alloc>
16446035553Spatrick        _LIBCPP_INLINE_VISIBILITY
16546035553Spatrick        stack(const container_type& __c, const _Alloc& __a,
166*76d0caaeSpatrick              _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0)
16746035553Spatrick            : c(__c, __a) {}
16846035553Spatrick    template <class _Alloc>
16946035553Spatrick        _LIBCPP_INLINE_VISIBILITY
17046035553Spatrick        stack(const stack& __s, const _Alloc& __a,
171*76d0caaeSpatrick              _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0)
17246035553Spatrick            : c(__s.c, __a) {}
17346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
17446035553Spatrick    template <class _Alloc>
17546035553Spatrick        _LIBCPP_INLINE_VISIBILITY
17646035553Spatrick        stack(container_type&& __c, const _Alloc& __a,
177*76d0caaeSpatrick              _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0)
17846035553Spatrick            : c(_VSTD::move(__c), __a) {}
17946035553Spatrick    template <class _Alloc>
18046035553Spatrick        _LIBCPP_INLINE_VISIBILITY
18146035553Spatrick        stack(stack&& __s, const _Alloc& __a,
182*76d0caaeSpatrick              _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0)
18346035553Spatrick            : c(_VSTD::move(__s.c), __a) {}
18446035553Spatrick#endif // _LIBCPP_CXX03_LANG
18546035553Spatrick
18646035553Spatrick    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
18746035553Spatrick    bool empty()     const      {return c.empty();}
18846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
18946035553Spatrick    size_type size() const      {return c.size();}
19046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
19146035553Spatrick    reference top()             {return c.back();}
19246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
19346035553Spatrick    const_reference top() const {return c.back();}
19446035553Spatrick
19546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
19646035553Spatrick    void push(const value_type& __v) {c.push_back(__v);}
19746035553Spatrick#ifndef _LIBCPP_CXX03_LANG
19846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
19946035553Spatrick    void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
20046035553Spatrick
20146035553Spatrick    template <class... _Args>
20246035553Spatrick        _LIBCPP_INLINE_VISIBILITY
20346035553Spatrick#if _LIBCPP_STD_VER > 14
20446035553Spatrick        decltype(auto) emplace(_Args&&... __args)
20546035553Spatrick        { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
20646035553Spatrick#else
20746035553Spatrick        void      emplace(_Args&&... __args)
20846035553Spatrick        {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
20946035553Spatrick#endif
21046035553Spatrick#endif // _LIBCPP_CXX03_LANG
21146035553Spatrick
21246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
21346035553Spatrick    void pop() {c.pop_back();}
21446035553Spatrick
21546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
21646035553Spatrick    void swap(stack& __s)
21746035553Spatrick        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
21846035553Spatrick    {
21946035553Spatrick        using _VSTD::swap;
22046035553Spatrick        swap(c, __s.c);
22146035553Spatrick    }
22246035553Spatrick
22346035553Spatrick    template <class T1, class _C1>
22446035553Spatrick    friend
22546035553Spatrick    bool
22646035553Spatrick    operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
22746035553Spatrick
22846035553Spatrick    template <class T1, class _C1>
22946035553Spatrick    friend
23046035553Spatrick    bool
23146035553Spatrick    operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
23246035553Spatrick};
23346035553Spatrick
23446035553Spatrick#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
23546035553Spatricktemplate<class _Container,
236*76d0caaeSpatrick         class = _EnableIf<!__is_allocator<_Container>::value>
23746035553Spatrick>
23846035553Spatrickstack(_Container)
23946035553Spatrick    -> stack<typename _Container::value_type, _Container>;
24046035553Spatrick
24146035553Spatricktemplate<class _Container,
24246035553Spatrick         class _Alloc,
243*76d0caaeSpatrick         class = _EnableIf<!__is_allocator<_Container>::value>,
244*76d0caaeSpatrick         class = _EnableIf<uses_allocator<_Container, _Alloc>::value>
24546035553Spatrick         >
24646035553Spatrickstack(_Container, _Alloc)
24746035553Spatrick    -> stack<typename _Container::value_type, _Container>;
24846035553Spatrick#endif
24946035553Spatrick
25046035553Spatricktemplate <class _Tp, class _Container>
25146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
25246035553Spatrickbool
25346035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
25446035553Spatrick{
25546035553Spatrick    return __x.c == __y.c;
25646035553Spatrick}
25746035553Spatrick
25846035553Spatricktemplate <class _Tp, class _Container>
25946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
26046035553Spatrickbool
26146035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
26246035553Spatrick{
26346035553Spatrick    return __x.c < __y.c;
26446035553Spatrick}
26546035553Spatrick
26646035553Spatricktemplate <class _Tp, class _Container>
26746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
26846035553Spatrickbool
26946035553Spatrickoperator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
27046035553Spatrick{
27146035553Spatrick    return !(__x == __y);
27246035553Spatrick}
27346035553Spatrick
27446035553Spatricktemplate <class _Tp, class _Container>
27546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
27646035553Spatrickbool
27746035553Spatrickoperator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
27846035553Spatrick{
27946035553Spatrick    return __y < __x;
28046035553Spatrick}
28146035553Spatrick
28246035553Spatricktemplate <class _Tp, class _Container>
28346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
28446035553Spatrickbool
28546035553Spatrickoperator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
28646035553Spatrick{
28746035553Spatrick    return !(__x < __y);
28846035553Spatrick}
28946035553Spatrick
29046035553Spatricktemplate <class _Tp, class _Container>
29146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
29246035553Spatrickbool
29346035553Spatrickoperator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
29446035553Spatrick{
29546035553Spatrick    return !(__y < __x);
29646035553Spatrick}
29746035553Spatrick
29846035553Spatricktemplate <class _Tp, class _Container>
29946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
300*76d0caaeSpatrick_EnableIf<__is_swappable<_Container>::value, void>
30146035553Spatrickswap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
30246035553Spatrick    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
30346035553Spatrick{
30446035553Spatrick    __x.swap(__y);
30546035553Spatrick}
30646035553Spatrick
30746035553Spatricktemplate <class _Tp, class _Container, class _Alloc>
30846035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc>
30946035553Spatrick    : public uses_allocator<_Container, _Alloc>
31046035553Spatrick{
31146035553Spatrick};
31246035553Spatrick
31346035553Spatrick_LIBCPP_END_NAMESPACE_STD
31446035553Spatrick
31546035553Spatrick#endif // _LIBCPP_STACK
316