xref: /llvm-project-15.0.7/libcxx/include/stack (revision 5b8b8b5d)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- stack -----------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_STACK
123e519524SHoward Hinnant#define _LIBCPP_STACK
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    stack synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class T, class Container = deque<T>>
213e519524SHoward Hinnantclass stack
223e519524SHoward Hinnant{
233e519524SHoward Hinnantpublic:
243e519524SHoward Hinnant    typedef Container                                container_type;
253e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
263e519524SHoward Hinnant    typedef typename container_type::reference       reference;
273e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
283e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
293e519524SHoward Hinnant
303e519524SHoward Hinnantprotected:
313e519524SHoward Hinnant    container_type c;
323e519524SHoward Hinnant
333e519524SHoward Hinnantpublic:
34bd0c1600SHoward Hinnant    stack() = default;
35bd0c1600SHoward Hinnant    ~stack() = default;
36bd0c1600SHoward Hinnant
37bd0c1600SHoward Hinnant    stack(const stack& q) = default;
38bd0c1600SHoward Hinnant    stack(stack&& q) = default;
39bd0c1600SHoward Hinnant
40bd0c1600SHoward Hinnant    stack& operator=(const stack& q) = default;
41bd0c1600SHoward Hinnant    stack& operator=(stack&& q) = default;
42bd0c1600SHoward Hinnant
433e519524SHoward Hinnant    explicit stack(const container_type& c);
443e519524SHoward Hinnant    explicit stack(container_type&& c);
453e519524SHoward Hinnant    template <class Alloc> explicit stack(const Alloc& a);
463e519524SHoward Hinnant    template <class Alloc> stack(const container_type& c, const Alloc& a);
473e519524SHoward Hinnant    template <class Alloc> stack(container_type&& c, const Alloc& a);
48bd0c1600SHoward Hinnant    template <class Alloc> stack(const stack& c, const Alloc& a);
493e519524SHoward Hinnant    template <class Alloc> stack(stack&& c, const Alloc& a);
503e519524SHoward Hinnant
513e519524SHoward Hinnant    bool empty() const;
523e519524SHoward Hinnant    size_type size() const;
533e519524SHoward Hinnant    reference top();
543e519524SHoward Hinnant    const_reference top() const;
553e519524SHoward Hinnant
563e519524SHoward Hinnant    void push(const value_type& x);
573e519524SHoward Hinnant    void push(value_type&& x);
5863b560beSMarshall Clow    template <class... Args> reference emplace(Args&&... args); // reference in C++17
593e519524SHoward Hinnant    void pop();
603e519524SHoward Hinnant
61f07dd8d0SEric Fiselier    void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>)
623e519524SHoward Hinnant};
633e519524SHoward Hinnant
64*5b8b8b5dSMarshall Clowtemplate<class Container>
65*5b8b8b5dSMarshall Clow  stack(Container) -> stack<typename Container::value_type, Container>;  // C++17
66*5b8b8b5dSMarshall Clow
67*5b8b8b5dSMarshall Clowtemplate<class Container, class Allocator>
68*5b8b8b5dSMarshall Clow  stack(Container, Allocator) -> stack<typename Container::value_type, Container>; // C++17
69*5b8b8b5dSMarshall Clow
703e519524SHoward Hinnanttemplate <class T, class Container>
713e519524SHoward Hinnant  bool operator==(const stack<T, Container>& x, const stack<T, Container>& y);
723e519524SHoward Hinnanttemplate <class T, class Container>
733e519524SHoward Hinnant  bool operator< (const stack<T, Container>& x, const stack<T, Container>& y);
743e519524SHoward Hinnanttemplate <class T, class Container>
753e519524SHoward Hinnant  bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y);
763e519524SHoward Hinnanttemplate <class T, class Container>
773e519524SHoward Hinnant  bool operator> (const stack<T, Container>& x, const stack<T, Container>& y);
783e519524SHoward Hinnanttemplate <class T, class Container>
793e519524SHoward Hinnant  bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y);
803e519524SHoward Hinnanttemplate <class T, class Container>
813e519524SHoward Hinnant  bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y);
823e519524SHoward Hinnant
833e519524SHoward Hinnanttemplate <class T, class Container>
84bd0c1600SHoward Hinnant  void swap(stack<T, Container>& x, stack<T, Container>& y)
85bd0c1600SHoward Hinnant  noexcept(noexcept(x.swap(y)));
863e519524SHoward Hinnant
873e519524SHoward Hinnant}  // std
883e519524SHoward Hinnant
893e519524SHoward Hinnant*/
903e519524SHoward Hinnant
913e519524SHoward Hinnant#include <__config>
923e519524SHoward Hinnant#include <deque>
933e519524SHoward Hinnant
94073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
953e519524SHoward Hinnant#pragma GCC system_header
96073458b1SHoward Hinnant#endif
973e519524SHoward Hinnant
983e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
993e519524SHoward Hinnant
100e2f2d1edSEric Fiseliertemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack;
1013e519524SHoward Hinnant
1023e519524SHoward Hinnanttemplate <class _Tp, class _Container>
103aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
1043e519524SHoward Hinnantbool
1053e519524SHoward Hinnantoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
1063e519524SHoward Hinnant
1073e519524SHoward Hinnanttemplate <class _Tp, class _Container>
108aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
1093e519524SHoward Hinnantbool
1103e519524SHoward Hinnantoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
1113e519524SHoward Hinnant
1123afa22a3SMarshall Clowtemplate <class _Tp, class _Container /*= deque<_Tp>*/>
113e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS stack
1143e519524SHoward Hinnant{
1153e519524SHoward Hinnantpublic:
1163e519524SHoward Hinnant    typedef _Container                               container_type;
1173e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
1183e519524SHoward Hinnant    typedef typename container_type::reference       reference;
1193e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
1203e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
121c1fe2c43SMarshall Clow    static_assert((is_same<_Tp, value_type>::value), "" );
1223e519524SHoward Hinnant
1233e519524SHoward Hinnantprotected:
1243e519524SHoward Hinnant    container_type c;
1253e519524SHoward Hinnant
1263e519524SHoward Hinnantpublic:
127e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
128bd0c1600SHoward Hinnant    stack()
129bd0c1600SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
130bd0c1600SHoward Hinnant        : c() {}
131bd0c1600SHoward Hinnant
132bd0c1600SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
133bd0c1600SHoward Hinnant    stack(const stack& __q) : c(__q.c) {}
134bd0c1600SHoward Hinnant
1357196ee31SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1367196ee31SEric Fiselier    stack& operator=(const stack& __q) {c = __q.c; return *this;}
1377196ee31SEric Fiselier
1387196ee31SEric Fiselier
1397196ee31SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
140bd0c1600SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
141bd0c1600SHoward Hinnant    stack(stack&& __q)
142bd0c1600SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
143ce48a113SHoward Hinnant        : c(_VSTD::move(__q.c)) {}
144bd0c1600SHoward Hinnant
145bd0c1600SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
146bd0c1600SHoward Hinnant    stack& operator=(stack&& __q)
147bd0c1600SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
148ce48a113SHoward Hinnant        {c = _VSTD::move(__q.c); return *this;}
1497196ee31SEric Fiselier
1507196ee31SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1517196ee31SEric Fiselier    explicit stack(container_type&& __c) : c(_VSTD::move(__c)) {}
1527196ee31SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
153bd0c1600SHoward Hinnant
154e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1553e519524SHoward Hinnant    explicit stack(const container_type& __c) : c(__c) {}
1567196ee31SEric Fiselier
1573e519524SHoward Hinnant    template <class _Alloc>
158e0601335SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1593e519524SHoward Hinnant        explicit stack(const _Alloc& __a,
1603e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
1613e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
1623e519524SHoward Hinnant            : c(__a) {}
1633e519524SHoward Hinnant    template <class _Alloc>
164e0601335SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1653e519524SHoward Hinnant        stack(const container_type& __c, const _Alloc& __a,
1663e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1673e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
1683e519524SHoward Hinnant            : c(__c, __a) {}
1693e519524SHoward Hinnant    template <class _Alloc>
170e0601335SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1713e519524SHoward Hinnant        stack(const stack& __s, const _Alloc& __a,
1723e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1733e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
1743e519524SHoward Hinnant            : c(__s.c, __a) {}
1757196ee31SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1763e519524SHoward Hinnant    template <class _Alloc>
177e0601335SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1783e519524SHoward Hinnant        stack(container_type&& __c, const _Alloc& __a,
1793e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1803e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
181ce48a113SHoward Hinnant            : c(_VSTD::move(__c), __a) {}
1823e519524SHoward Hinnant    template <class _Alloc>
183e0601335SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1843e519524SHoward Hinnant        stack(stack&& __s, const _Alloc& __a,
1853e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1863e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
187ce48a113SHoward Hinnant            : c(_VSTD::move(__s.c), __a) {}
1887196ee31SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
1893e519524SHoward Hinnant
19072c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
1913e519524SHoward Hinnant    bool empty()     const      {return c.empty();}
192e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1933e519524SHoward Hinnant    size_type size() const      {return c.size();}
194e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1953e519524SHoward Hinnant    reference top()             {return c.back();}
196e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1973e519524SHoward Hinnant    const_reference top() const {return c.back();}
1983e519524SHoward Hinnant
199e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2003e519524SHoward Hinnant    void push(const value_type& __v) {c.push_back(__v);}
2017196ee31SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
202e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
203ce48a113SHoward Hinnant    void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
2047196ee31SEric Fiselier
205e0601335SHoward Hinnant    template <class... _Args>
206e0601335SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
20763b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
208e34f5ffeSMarshall Clow        decltype(auto) emplace(_Args&&... __args)
2090e411641SEric Fiselier        { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
21063b560beSMarshall Clow#else
21163b560beSMarshall Clow        void      emplace(_Args&&... __args)
21263b560beSMarshall Clow        {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
21363b560beSMarshall Clow#endif
2147196ee31SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
2157196ee31SEric Fiselier
216e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2173e519524SHoward Hinnant    void pop() {c.pop_back();}
2183e519524SHoward Hinnant
219e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2203e519524SHoward Hinnant    void swap(stack& __s)
221bd0c1600SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
2223e519524SHoward Hinnant    {
223ce48a113SHoward Hinnant        using _VSTD::swap;
2243e519524SHoward Hinnant        swap(c, __s.c);
2253e519524SHoward Hinnant    }
2263e519524SHoward Hinnant
2273e519524SHoward Hinnant    template <class T1, class _C1>
2283e519524SHoward Hinnant    friend
2293e519524SHoward Hinnant    bool
2303e519524SHoward Hinnant    operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
2313e519524SHoward Hinnant
2323e519524SHoward Hinnant    template <class T1, class _C1>
2333e519524SHoward Hinnant    friend
2343e519524SHoward Hinnant    bool
2353e519524SHoward Hinnant    operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
2363e519524SHoward Hinnant};
2373e519524SHoward Hinnant
238*5b8b8b5dSMarshall Clow#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
239*5b8b8b5dSMarshall Clowtemplate<class _Container,
240*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
241*5b8b8b5dSMarshall Clow>
242*5b8b8b5dSMarshall Clowstack(_Container)
243*5b8b8b5dSMarshall Clow    -> stack<typename _Container::value_type, _Container>;
244*5b8b8b5dSMarshall Clow
245*5b8b8b5dSMarshall Clowtemplate<class _Container,
246*5b8b8b5dSMarshall Clow         class _Alloc,
247*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
248*5b8b8b5dSMarshall Clow         class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
249*5b8b8b5dSMarshall Clow         >
250*5b8b8b5dSMarshall Clowstack(_Container, _Alloc)
251*5b8b8b5dSMarshall Clow    -> stack<typename _Container::value_type, _Container>;
252*5b8b8b5dSMarshall Clow#endif
253*5b8b8b5dSMarshall Clow
2543e519524SHoward Hinnanttemplate <class _Tp, class _Container>
255e0601335SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2563e519524SHoward Hinnantbool
2573e519524SHoward Hinnantoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2583e519524SHoward Hinnant{
2593e519524SHoward Hinnant    return __x.c == __y.c;
2603e519524SHoward Hinnant}
2613e519524SHoward Hinnant
2623e519524SHoward Hinnanttemplate <class _Tp, class _Container>
263e0601335SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2643e519524SHoward Hinnantbool
2653e519524SHoward Hinnantoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2663e519524SHoward Hinnant{
2673e519524SHoward Hinnant    return __x.c < __y.c;
2683e519524SHoward Hinnant}
2693e519524SHoward Hinnant
2703e519524SHoward Hinnanttemplate <class _Tp, class _Container>
271e0601335SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2723e519524SHoward Hinnantbool
2733e519524SHoward Hinnantoperator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2743e519524SHoward Hinnant{
2753e519524SHoward Hinnant    return !(__x == __y);
2763e519524SHoward Hinnant}
2773e519524SHoward Hinnant
2783e519524SHoward Hinnanttemplate <class _Tp, class _Container>
279e0601335SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2803e519524SHoward Hinnantbool
2813e519524SHoward Hinnantoperator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2823e519524SHoward Hinnant{
2833e519524SHoward Hinnant    return __y < __x;
2843e519524SHoward Hinnant}
2853e519524SHoward Hinnant
2863e519524SHoward Hinnanttemplate <class _Tp, class _Container>
287e0601335SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2883e519524SHoward Hinnantbool
2893e519524SHoward Hinnantoperator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2903e519524SHoward Hinnant{
2913e519524SHoward Hinnant    return !(__x < __y);
2923e519524SHoward Hinnant}
2933e519524SHoward Hinnant
2943e519524SHoward Hinnanttemplate <class _Tp, class _Container>
295e0601335SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2963e519524SHoward Hinnantbool
2973e519524SHoward Hinnantoperator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2983e519524SHoward Hinnant{
2993e519524SHoward Hinnant    return !(__y < __x);
3003e519524SHoward Hinnant}
3013e519524SHoward Hinnant
3023e519524SHoward Hinnanttemplate <class _Tp, class _Container>
303e0601335SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
304f07dd8d0SEric Fiseliertypename enable_if<
305f07dd8d0SEric Fiselier    __is_swappable<_Container>::value,
3063e519524SHoward Hinnant    void
307f07dd8d0SEric Fiselier>::type
3083e519524SHoward Hinnantswap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
309bd0c1600SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
3103e519524SHoward Hinnant{
3113e519524SHoward Hinnant    __x.swap(__y);
3123e519524SHoward Hinnant}
3133e519524SHoward Hinnant
3143e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Alloc>
315e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc>
3163e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
3173e519524SHoward Hinnant{
3183e519524SHoward Hinnant};
3193e519524SHoward Hinnant
3203e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
3213e519524SHoward Hinnant
3223e519524SHoward Hinnant#endif  // _LIBCPP_STACK
323