xref: /openbsd/gnu/llvm/libcxx/include/stack (revision 46035553)
1*46035553Spatrick// -*- C++ -*-
2*46035553Spatrick//===---------------------------- stack -----------------------------------===//
3*46035553Spatrick//
4*46035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*46035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
6*46035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*46035553Spatrick//
8*46035553Spatrick//===----------------------------------------------------------------------===//
9*46035553Spatrick
10*46035553Spatrick#ifndef _LIBCPP_STACK
11*46035553Spatrick#define _LIBCPP_STACK
12*46035553Spatrick
13*46035553Spatrick/*
14*46035553Spatrick    stack synopsis
15*46035553Spatrick
16*46035553Spatricknamespace std
17*46035553Spatrick{
18*46035553Spatrick
19*46035553Spatricktemplate <class T, class Container = deque<T>>
20*46035553Spatrickclass stack
21*46035553Spatrick{
22*46035553Spatrickpublic:
23*46035553Spatrick    typedef Container                                container_type;
24*46035553Spatrick    typedef typename container_type::value_type      value_type;
25*46035553Spatrick    typedef typename container_type::reference       reference;
26*46035553Spatrick    typedef typename container_type::const_reference const_reference;
27*46035553Spatrick    typedef typename container_type::size_type       size_type;
28*46035553Spatrick
29*46035553Spatrickprotected:
30*46035553Spatrick    container_type c;
31*46035553Spatrick
32*46035553Spatrickpublic:
33*46035553Spatrick    stack() = default;
34*46035553Spatrick    ~stack() = default;
35*46035553Spatrick
36*46035553Spatrick    stack(const stack& q) = default;
37*46035553Spatrick    stack(stack&& q) = default;
38*46035553Spatrick
39*46035553Spatrick    stack& operator=(const stack& q) = default;
40*46035553Spatrick    stack& operator=(stack&& q) = default;
41*46035553Spatrick
42*46035553Spatrick    explicit stack(const container_type& c);
43*46035553Spatrick    explicit stack(container_type&& c);
44*46035553Spatrick    template <class Alloc> explicit stack(const Alloc& a);
45*46035553Spatrick    template <class Alloc> stack(const container_type& c, const Alloc& a);
46*46035553Spatrick    template <class Alloc> stack(container_type&& c, const Alloc& a);
47*46035553Spatrick    template <class Alloc> stack(const stack& c, const Alloc& a);
48*46035553Spatrick    template <class Alloc> stack(stack&& c, const Alloc& a);
49*46035553Spatrick
50*46035553Spatrick    bool empty() const;
51*46035553Spatrick    size_type size() const;
52*46035553Spatrick    reference top();
53*46035553Spatrick    const_reference top() const;
54*46035553Spatrick
55*46035553Spatrick    void push(const value_type& x);
56*46035553Spatrick    void push(value_type&& x);
57*46035553Spatrick    template <class... Args> reference emplace(Args&&... args); // reference in C++17
58*46035553Spatrick    void pop();
59*46035553Spatrick
60*46035553Spatrick    void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>)
61*46035553Spatrick};
62*46035553Spatrick
63*46035553Spatricktemplate<class Container>
64*46035553Spatrick  stack(Container) -> stack<typename Container::value_type, Container>;  // C++17
65*46035553Spatrick
66*46035553Spatricktemplate<class Container, class Allocator>
67*46035553Spatrick  stack(Container, Allocator) -> stack<typename Container::value_type, Container>; // C++17
68*46035553Spatrick
69*46035553Spatricktemplate <class T, class Container>
70*46035553Spatrick  bool operator==(const stack<T, Container>& x, const stack<T, Container>& y);
71*46035553Spatricktemplate <class T, class Container>
72*46035553Spatrick  bool operator< (const stack<T, Container>& x, const stack<T, Container>& y);
73*46035553Spatricktemplate <class T, class Container>
74*46035553Spatrick  bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y);
75*46035553Spatricktemplate <class T, class Container>
76*46035553Spatrick  bool operator> (const stack<T, Container>& x, const stack<T, Container>& y);
77*46035553Spatricktemplate <class T, class Container>
78*46035553Spatrick  bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y);
79*46035553Spatricktemplate <class T, class Container>
80*46035553Spatrick  bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y);
81*46035553Spatrick
82*46035553Spatricktemplate <class T, class Container>
83*46035553Spatrick  void swap(stack<T, Container>& x, stack<T, Container>& y)
84*46035553Spatrick  noexcept(noexcept(x.swap(y)));
85*46035553Spatrick
86*46035553Spatrick}  // std
87*46035553Spatrick
88*46035553Spatrick*/
89*46035553Spatrick
90*46035553Spatrick#include <__config>
91*46035553Spatrick#include <deque>
92*46035553Spatrick
93*46035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
94*46035553Spatrick#pragma GCC system_header
95*46035553Spatrick#endif
96*46035553Spatrick
97*46035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
98*46035553Spatrick
99*46035553Spatricktemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack;
100*46035553Spatrick
101*46035553Spatricktemplate <class _Tp, class _Container>
102*46035553Spatrick_LIBCPP_INLINE_VISIBILITY
103*46035553Spatrickbool
104*46035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
105*46035553Spatrick
106*46035553Spatricktemplate <class _Tp, class _Container>
107*46035553Spatrick_LIBCPP_INLINE_VISIBILITY
108*46035553Spatrickbool
109*46035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
110*46035553Spatrick
111*46035553Spatricktemplate <class _Tp, class _Container /*= deque<_Tp>*/>
112*46035553Spatrickclass _LIBCPP_TEMPLATE_VIS stack
113*46035553Spatrick{
114*46035553Spatrickpublic:
115*46035553Spatrick    typedef _Container                               container_type;
116*46035553Spatrick    typedef typename container_type::value_type      value_type;
117*46035553Spatrick    typedef typename container_type::reference       reference;
118*46035553Spatrick    typedef typename container_type::const_reference const_reference;
119*46035553Spatrick    typedef typename container_type::size_type       size_type;
120*46035553Spatrick    static_assert((is_same<_Tp, value_type>::value), "" );
121*46035553Spatrick
122*46035553Spatrickprotected:
123*46035553Spatrick    container_type c;
124*46035553Spatrick
125*46035553Spatrickpublic:
126*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
127*46035553Spatrick    stack()
128*46035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
129*46035553Spatrick        : c() {}
130*46035553Spatrick
131*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
132*46035553Spatrick    stack(const stack& __q) : c(__q.c) {}
133*46035553Spatrick
134*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
135*46035553Spatrick    stack& operator=(const stack& __q) {c = __q.c; return *this;}
136*46035553Spatrick
137*46035553Spatrick
138*46035553Spatrick#ifndef _LIBCPP_CXX03_LANG
139*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
140*46035553Spatrick    stack(stack&& __q)
141*46035553Spatrick        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
142*46035553Spatrick        : c(_VSTD::move(__q.c)) {}
143*46035553Spatrick
144*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
145*46035553Spatrick    stack& operator=(stack&& __q)
146*46035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
147*46035553Spatrick        {c = _VSTD::move(__q.c); return *this;}
148*46035553Spatrick
149*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
150*46035553Spatrick    explicit stack(container_type&& __c) : c(_VSTD::move(__c)) {}
151*46035553Spatrick#endif  // _LIBCPP_CXX03_LANG
152*46035553Spatrick
153*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
154*46035553Spatrick    explicit stack(const container_type& __c) : c(__c) {}
155*46035553Spatrick
156*46035553Spatrick    template <class _Alloc>
157*46035553Spatrick        _LIBCPP_INLINE_VISIBILITY
158*46035553Spatrick        explicit stack(const _Alloc& __a,
159*46035553Spatrick                       typename enable_if<uses_allocator<container_type,
160*46035553Spatrick                                                         _Alloc>::value>::type* = 0)
161*46035553Spatrick            : c(__a) {}
162*46035553Spatrick    template <class _Alloc>
163*46035553Spatrick        _LIBCPP_INLINE_VISIBILITY
164*46035553Spatrick        stack(const container_type& __c, const _Alloc& __a,
165*46035553Spatrick              typename enable_if<uses_allocator<container_type,
166*46035553Spatrick                                                _Alloc>::value>::type* = 0)
167*46035553Spatrick            : c(__c, __a) {}
168*46035553Spatrick    template <class _Alloc>
169*46035553Spatrick        _LIBCPP_INLINE_VISIBILITY
170*46035553Spatrick        stack(const stack& __s, const _Alloc& __a,
171*46035553Spatrick              typename enable_if<uses_allocator<container_type,
172*46035553Spatrick                                                _Alloc>::value>::type* = 0)
173*46035553Spatrick            : c(__s.c, __a) {}
174*46035553Spatrick#ifndef _LIBCPP_CXX03_LANG
175*46035553Spatrick    template <class _Alloc>
176*46035553Spatrick        _LIBCPP_INLINE_VISIBILITY
177*46035553Spatrick        stack(container_type&& __c, const _Alloc& __a,
178*46035553Spatrick              typename enable_if<uses_allocator<container_type,
179*46035553Spatrick                                                _Alloc>::value>::type* = 0)
180*46035553Spatrick            : c(_VSTD::move(__c), __a) {}
181*46035553Spatrick    template <class _Alloc>
182*46035553Spatrick        _LIBCPP_INLINE_VISIBILITY
183*46035553Spatrick        stack(stack&& __s, const _Alloc& __a,
184*46035553Spatrick              typename enable_if<uses_allocator<container_type,
185*46035553Spatrick                                                _Alloc>::value>::type* = 0)
186*46035553Spatrick            : c(_VSTD::move(__s.c), __a) {}
187*46035553Spatrick#endif  // _LIBCPP_CXX03_LANG
188*46035553Spatrick
189*46035553Spatrick    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
190*46035553Spatrick    bool empty()     const      {return c.empty();}
191*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
192*46035553Spatrick    size_type size() const      {return c.size();}
193*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
194*46035553Spatrick    reference top()             {return c.back();}
195*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
196*46035553Spatrick    const_reference top() const {return c.back();}
197*46035553Spatrick
198*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
199*46035553Spatrick    void push(const value_type& __v) {c.push_back(__v);}
200*46035553Spatrick#ifndef _LIBCPP_CXX03_LANG
201*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
202*46035553Spatrick    void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
203*46035553Spatrick
204*46035553Spatrick    template <class... _Args>
205*46035553Spatrick        _LIBCPP_INLINE_VISIBILITY
206*46035553Spatrick#if _LIBCPP_STD_VER > 14
207*46035553Spatrick        decltype(auto) emplace(_Args&&... __args)
208*46035553Spatrick        { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
209*46035553Spatrick#else
210*46035553Spatrick        void      emplace(_Args&&... __args)
211*46035553Spatrick        {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
212*46035553Spatrick#endif
213*46035553Spatrick#endif  // _LIBCPP_CXX03_LANG
214*46035553Spatrick
215*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
216*46035553Spatrick    void pop() {c.pop_back();}
217*46035553Spatrick
218*46035553Spatrick    _LIBCPP_INLINE_VISIBILITY
219*46035553Spatrick    void swap(stack& __s)
220*46035553Spatrick        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
221*46035553Spatrick    {
222*46035553Spatrick        using _VSTD::swap;
223*46035553Spatrick        swap(c, __s.c);
224*46035553Spatrick    }
225*46035553Spatrick
226*46035553Spatrick    template <class T1, class _C1>
227*46035553Spatrick    friend
228*46035553Spatrick    bool
229*46035553Spatrick    operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
230*46035553Spatrick
231*46035553Spatrick    template <class T1, class _C1>
232*46035553Spatrick    friend
233*46035553Spatrick    bool
234*46035553Spatrick    operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
235*46035553Spatrick};
236*46035553Spatrick
237*46035553Spatrick#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
238*46035553Spatricktemplate<class _Container,
239*46035553Spatrick         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
240*46035553Spatrick>
241*46035553Spatrickstack(_Container)
242*46035553Spatrick    -> stack<typename _Container::value_type, _Container>;
243*46035553Spatrick
244*46035553Spatricktemplate<class _Container,
245*46035553Spatrick         class _Alloc,
246*46035553Spatrick         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
247*46035553Spatrick         class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
248*46035553Spatrick         >
249*46035553Spatrickstack(_Container, _Alloc)
250*46035553Spatrick    -> stack<typename _Container::value_type, _Container>;
251*46035553Spatrick#endif
252*46035553Spatrick
253*46035553Spatricktemplate <class _Tp, class _Container>
254*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
255*46035553Spatrickbool
256*46035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
257*46035553Spatrick{
258*46035553Spatrick    return __x.c == __y.c;
259*46035553Spatrick}
260*46035553Spatrick
261*46035553Spatricktemplate <class _Tp, class _Container>
262*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
263*46035553Spatrickbool
264*46035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
265*46035553Spatrick{
266*46035553Spatrick    return __x.c < __y.c;
267*46035553Spatrick}
268*46035553Spatrick
269*46035553Spatricktemplate <class _Tp, class _Container>
270*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
271*46035553Spatrickbool
272*46035553Spatrickoperator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
273*46035553Spatrick{
274*46035553Spatrick    return !(__x == __y);
275*46035553Spatrick}
276*46035553Spatrick
277*46035553Spatricktemplate <class _Tp, class _Container>
278*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
279*46035553Spatrickbool
280*46035553Spatrickoperator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
281*46035553Spatrick{
282*46035553Spatrick    return __y < __x;
283*46035553Spatrick}
284*46035553Spatrick
285*46035553Spatricktemplate <class _Tp, class _Container>
286*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
287*46035553Spatrickbool
288*46035553Spatrickoperator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
289*46035553Spatrick{
290*46035553Spatrick    return !(__x < __y);
291*46035553Spatrick}
292*46035553Spatrick
293*46035553Spatricktemplate <class _Tp, class _Container>
294*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
295*46035553Spatrickbool
296*46035553Spatrickoperator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
297*46035553Spatrick{
298*46035553Spatrick    return !(__y < __x);
299*46035553Spatrick}
300*46035553Spatrick
301*46035553Spatricktemplate <class _Tp, class _Container>
302*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
303*46035553Spatricktypename enable_if<
304*46035553Spatrick    __is_swappable<_Container>::value,
305*46035553Spatrick    void
306*46035553Spatrick>::type
307*46035553Spatrickswap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
308*46035553Spatrick    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
309*46035553Spatrick{
310*46035553Spatrick    __x.swap(__y);
311*46035553Spatrick}
312*46035553Spatrick
313*46035553Spatricktemplate <class _Tp, class _Container, class _Alloc>
314*46035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc>
315*46035553Spatrick    : public uses_allocator<_Container, _Alloc>
316*46035553Spatrick{
317*46035553Spatrick};
318*46035553Spatrick
319*46035553Spatrick_LIBCPP_END_NAMESPACE_STD
320*46035553Spatrick
321*46035553Spatrick#endif  // _LIBCPP_STACK
322