xref: /llvm-project-15.0.7/libcxx/include/stack (revision 5b08a8a4)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- stack -----------------------------------===//
33e519524SHoward Hinnant//
4*5b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
63e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source
73e519524SHoward Hinnant// License. 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:
343e519524SHoward Hinnant    explicit stack();
353e519524SHoward Hinnant    explicit stack(const container_type& c);
363e519524SHoward Hinnant    explicit stack(container_type&& c);
373e519524SHoward Hinnant    stack(stack&& s);
383e519524SHoward Hinnant    stack& operator=(stack&& s);
393e519524SHoward Hinnant    template <class Alloc> explicit stack(const Alloc& a);
403e519524SHoward Hinnant    template <class Alloc> stack(const container_type& c, const Alloc& a);
413e519524SHoward Hinnant    template <class Alloc> stack(container_type&& c, const Alloc& a);
423e519524SHoward Hinnant    template <class Alloc> stack(stack&& c, const Alloc& a);
433e519524SHoward Hinnant
443e519524SHoward Hinnant    bool empty() const;
453e519524SHoward Hinnant    size_type size() const;
463e519524SHoward Hinnant    reference top();
473e519524SHoward Hinnant    const_reference top() const;
483e519524SHoward Hinnant
493e519524SHoward Hinnant    void push(const value_type& x);
503e519524SHoward Hinnant    void push(value_type&& x);
513e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
523e519524SHoward Hinnant    void pop();
533e519524SHoward Hinnant
543e519524SHoward Hinnant    void swap(stack& c);
553e519524SHoward Hinnant};
563e519524SHoward Hinnant
573e519524SHoward Hinnanttemplate <class T, class Container>
583e519524SHoward Hinnant  bool operator==(const stack<T, Container>& x, const stack<T, Container>& y);
593e519524SHoward Hinnanttemplate <class T, class Container>
603e519524SHoward Hinnant  bool operator< (const stack<T, Container>& x, const stack<T, Container>& y);
613e519524SHoward Hinnanttemplate <class T, class Container>
623e519524SHoward Hinnant  bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y);
633e519524SHoward Hinnanttemplate <class T, class Container>
643e519524SHoward Hinnant  bool operator> (const stack<T, Container>& x, const stack<T, Container>& y);
653e519524SHoward Hinnanttemplate <class T, class Container>
663e519524SHoward Hinnant  bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y);
673e519524SHoward Hinnanttemplate <class T, class Container>
683e519524SHoward Hinnant  bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y);
693e519524SHoward Hinnant
703e519524SHoward Hinnanttemplate <class T, class Container>
713e519524SHoward Hinnant  void swap(stack<T, Container>& x, stack<T, Container>& y);
723e519524SHoward Hinnant
733e519524SHoward Hinnant}  // std
743e519524SHoward Hinnant
753e519524SHoward Hinnant*/
763e519524SHoward Hinnant
773e519524SHoward Hinnant#include <__config>
783e519524SHoward Hinnant#include <deque>
793e519524SHoward Hinnant
803e519524SHoward Hinnant#pragma GCC system_header
813e519524SHoward Hinnant
823e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
833e519524SHoward Hinnant
843e519524SHoward Hinnanttemplate <class _Tp, class _Container> class stack;
853e519524SHoward Hinnant
863e519524SHoward Hinnanttemplate <class _Tp, class _Container>
873e519524SHoward Hinnantbool
883e519524SHoward Hinnantoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
893e519524SHoward Hinnant
903e519524SHoward Hinnanttemplate <class _Tp, class _Container>
913e519524SHoward Hinnantbool
923e519524SHoward Hinnantoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
933e519524SHoward Hinnant
943e519524SHoward Hinnanttemplate <class _Tp, class _Container = deque<_Tp> >
953e519524SHoward Hinnantclass stack
963e519524SHoward Hinnant{
973e519524SHoward Hinnantpublic:
983e519524SHoward Hinnant    typedef _Container                               container_type;
993e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
1003e519524SHoward Hinnant    typedef typename container_type::reference       reference;
1013e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
1023e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
1033e519524SHoward Hinnant
1043e519524SHoward Hinnantprotected:
1053e519524SHoward Hinnant    container_type c;
1063e519524SHoward Hinnant
1073e519524SHoward Hinnantpublic:
1083e519524SHoward Hinnant    stack() : c() {}
1093e519524SHoward Hinnant    explicit stack(const container_type& __c) : c(__c) {}
1103e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
1113e519524SHoward Hinnant    explicit stack(container_type&& __c) : c(_STD::move(__c)) {}
1123e519524SHoward Hinnant    stack(stack&& __s) : c(_STD::move(__s.c)) {}
1133e519524SHoward Hinnant    stack& operator=(stack&& __s) {c = _STD::move(__s.c); return *this;}
1143e519524SHoward Hinnant#endif
1153e519524SHoward Hinnant    template <class _Alloc>
1163e519524SHoward Hinnant        explicit stack(const _Alloc& __a,
1173e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
1183e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
1193e519524SHoward Hinnant            : c(__a) {}
1203e519524SHoward Hinnant    template <class _Alloc>
1213e519524SHoward Hinnant        stack(const container_type& __c, const _Alloc& __a,
1223e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1233e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
1243e519524SHoward Hinnant            : c(__c, __a) {}
1253e519524SHoward Hinnant    template <class _Alloc>
1263e519524SHoward Hinnant        stack(const stack& __s, const _Alloc& __a,
1273e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1283e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
1293e519524SHoward Hinnant            : c(__s.c, __a) {}
1303e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
1313e519524SHoward Hinnant    template <class _Alloc>
1323e519524SHoward Hinnant        stack(container_type&& __c, const _Alloc& __a,
1333e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1343e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
1353e519524SHoward Hinnant            : c(_STD::move(__c), __a) {}
1363e519524SHoward Hinnant    template <class _Alloc>
1373e519524SHoward Hinnant        stack(stack&& __s, const _Alloc& __a,
1383e519524SHoward Hinnant              typename enable_if<uses_allocator<container_type,
1393e519524SHoward Hinnant                                                _Alloc>::value>::type* = 0)
1403e519524SHoward Hinnant            : c(_STD::move(__s.c), __a) {}
1413e519524SHoward Hinnant#endif
1423e519524SHoward Hinnant
1433e519524SHoward Hinnant    bool empty()     const      {return c.empty();}
1443e519524SHoward Hinnant    size_type size() const      {return c.size();}
1453e519524SHoward Hinnant    reference top()             {return c.back();}
1463e519524SHoward Hinnant    const_reference top() const {return c.back();}
1473e519524SHoward Hinnant
1483e519524SHoward Hinnant    void push(const value_type& __v) {c.push_back(__v);}
1493e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
1503e519524SHoward Hinnant    void push(value_type&& __v) {c.push_back(_STD::move(__v));}
1513e519524SHoward Hinnant    template <class... _Args> void emplace(_Args&&... __args)
1523e519524SHoward Hinnant        {c.emplace_back(_STD::forward<_Args>(__args)...);}
1533e519524SHoward Hinnant#endif
1543e519524SHoward Hinnant    void pop() {c.pop_back();}
1553e519524SHoward Hinnant
1563e519524SHoward Hinnant    void swap(stack& __s)
1573e519524SHoward Hinnant    {
1583e519524SHoward Hinnant        using _STD::swap;
1593e519524SHoward Hinnant        swap(c, __s.c);
1603e519524SHoward Hinnant    }
1613e519524SHoward Hinnant
1623e519524SHoward Hinnant    template <class T1, class _C1>
1633e519524SHoward Hinnant    friend
1643e519524SHoward Hinnant    bool
1653e519524SHoward Hinnant    operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
1663e519524SHoward Hinnant
1673e519524SHoward Hinnant    template <class T1, class _C1>
1683e519524SHoward Hinnant    friend
1693e519524SHoward Hinnant    bool
1703e519524SHoward Hinnant    operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
1713e519524SHoward Hinnant};
1723e519524SHoward Hinnant
1733e519524SHoward Hinnanttemplate <class _Tp, class _Container>
1743e519524SHoward Hinnantinline
1753e519524SHoward Hinnantbool
1763e519524SHoward Hinnantoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
1773e519524SHoward Hinnant{
1783e519524SHoward Hinnant    return __x.c == __y.c;
1793e519524SHoward Hinnant}
1803e519524SHoward Hinnant
1813e519524SHoward Hinnanttemplate <class _Tp, class _Container>
1823e519524SHoward Hinnantinline
1833e519524SHoward Hinnantbool
1843e519524SHoward Hinnantoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
1853e519524SHoward Hinnant{
1863e519524SHoward Hinnant    return __x.c < __y.c;
1873e519524SHoward Hinnant}
1883e519524SHoward Hinnant
1893e519524SHoward Hinnanttemplate <class _Tp, class _Container>
1903e519524SHoward Hinnantinline
1913e519524SHoward Hinnantbool
1923e519524SHoward Hinnantoperator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
1933e519524SHoward Hinnant{
1943e519524SHoward Hinnant    return !(__x == __y);
1953e519524SHoward Hinnant}
1963e519524SHoward Hinnant
1973e519524SHoward Hinnanttemplate <class _Tp, class _Container>
1983e519524SHoward Hinnantinline
1993e519524SHoward Hinnantbool
2003e519524SHoward Hinnantoperator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2013e519524SHoward Hinnant{
2023e519524SHoward Hinnant    return __y < __x;
2033e519524SHoward Hinnant}
2043e519524SHoward Hinnant
2053e519524SHoward Hinnanttemplate <class _Tp, class _Container>
2063e519524SHoward Hinnantinline
2073e519524SHoward Hinnantbool
2083e519524SHoward Hinnantoperator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2093e519524SHoward Hinnant{
2103e519524SHoward Hinnant    return !(__x < __y);
2113e519524SHoward Hinnant}
2123e519524SHoward Hinnant
2133e519524SHoward Hinnanttemplate <class _Tp, class _Container>
2143e519524SHoward Hinnantinline
2153e519524SHoward Hinnantbool
2163e519524SHoward Hinnantoperator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
2173e519524SHoward Hinnant{
2183e519524SHoward Hinnant    return !(__y < __x);
2193e519524SHoward Hinnant}
2203e519524SHoward Hinnant
2213e519524SHoward Hinnanttemplate <class _Tp, class _Container>
2223e519524SHoward Hinnantinline
2233e519524SHoward Hinnantvoid
2243e519524SHoward Hinnantswap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
2253e519524SHoward Hinnant{
2263e519524SHoward Hinnant    __x.swap(__y);
2273e519524SHoward Hinnant}
2283e519524SHoward Hinnant
2293e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Alloc>
2303e519524SHoward Hinnantstruct uses_allocator<stack<_Tp, _Container>, _Alloc>
2313e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
2323e519524SHoward Hinnant{
2333e519524SHoward Hinnant};
2343e519524SHoward Hinnant
2353e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
2363e519524SHoward Hinnant
2373e519524SHoward Hinnant#endif  // _LIBCPP_STACK
238