xref: /openbsd/gnu/llvm/libcxx/include/stack (revision 4bdff4be)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
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);
44*4bdff4beSrobert    template <class InputIterator> stack(InputIterator first, InputIterator last); // since C++23
4546035553Spatrick    template <class Alloc> explicit stack(const Alloc& a);
4646035553Spatrick    template <class Alloc> stack(const container_type& c, const Alloc& a);
4746035553Spatrick    template <class Alloc> stack(container_type&& c, const Alloc& a);
4846035553Spatrick    template <class Alloc> stack(const stack& c, const Alloc& a);
4946035553Spatrick    template <class Alloc> stack(stack&& c, const Alloc& a);
50*4bdff4beSrobert    template<class InputIterator, class Alloc>
51*4bdff4beSrobert    stack(InputIterator first, InputIterator last, const Alloc&); // since C++23
5246035553Spatrick
5346035553Spatrick    bool empty() const;
5446035553Spatrick    size_type size() const;
5546035553Spatrick    reference top();
5646035553Spatrick    const_reference top() const;
5746035553Spatrick
5846035553Spatrick    void push(const value_type& x);
5946035553Spatrick    void push(value_type&& x);
6046035553Spatrick    template <class... Args> reference emplace(Args&&... args); // reference in C++17
6146035553Spatrick    void pop();
6246035553Spatrick
6346035553Spatrick    void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>)
6446035553Spatrick};
6546035553Spatrick
6646035553Spatricktemplate<class Container>
6746035553Spatrick  stack(Container) -> stack<typename Container::value_type, Container>;  // C++17
6846035553Spatrick
69*4bdff4beSroberttemplate<class InputIterator>
70*4bdff4beSrobert  stack(InputIterator, InputIterator) -> stack<iter-value-type<InputIterator>>; // since C++23
71*4bdff4beSrobert
7246035553Spatricktemplate<class Container, class Allocator>
7346035553Spatrick  stack(Container, Allocator) -> stack<typename Container::value_type, Container>; // C++17
7446035553Spatrick
75*4bdff4beSroberttemplate<class InputIterator, class Allocator>
76*4bdff4beSrobert  stack(InputIterator, InputIterator, Allocator)
77*4bdff4beSrobert    -> stack<iter-value-type<InputIterator>,
78*4bdff4beSrobert             deque<iter-value-type<InputIterator>, Allocator>>; // since C++23
79*4bdff4beSrobert
8046035553Spatricktemplate <class T, class Container>
8146035553Spatrick  bool operator==(const stack<T, Container>& x, const stack<T, Container>& y);
8246035553Spatricktemplate <class T, class Container>
8346035553Spatrick  bool operator< (const stack<T, Container>& x, const stack<T, Container>& y);
8446035553Spatricktemplate <class T, class Container>
8546035553Spatrick  bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y);
8646035553Spatricktemplate <class T, class Container>
8746035553Spatrick  bool operator> (const stack<T, Container>& x, const stack<T, Container>& y);
8846035553Spatricktemplate <class T, class Container>
8946035553Spatrick  bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y);
9046035553Spatricktemplate <class T, class Container>
9146035553Spatrick  bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y);
9246035553Spatrick
9346035553Spatricktemplate <class T, class Container>
9446035553Spatrick  void swap(stack<T, Container>& x, stack<T, Container>& y)
9546035553Spatrick  noexcept(noexcept(x.swap(y)));
9646035553Spatrick
9746035553Spatrick}  // std
9846035553Spatrick
9946035553Spatrick*/
10046035553Spatrick
101*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
10246035553Spatrick#include <__config>
103*4bdff4beSrobert#include <__iterator/iterator_traits.h>
10476d0caaeSpatrick#include <__memory/uses_allocator.h>
10576d0caaeSpatrick#include <__utility/forward.h>
10646035553Spatrick#include <deque>
107*4bdff4beSrobert#include <type_traits>
108*4bdff4beSrobert#include <version>
109*4bdff4beSrobert
110*4bdff4beSrobert// standard-mandated includes
111*4bdff4beSrobert
112*4bdff4beSrobert// [stack.syn]
113*4bdff4beSrobert#include <compare>
114*4bdff4beSrobert#include <initializer_list>
11546035553Spatrick
11646035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
11746035553Spatrick#  pragma GCC system_header
11846035553Spatrick#endif
11946035553Spatrick
12046035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
12146035553Spatrick
12246035553Spatricktemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack;
12346035553Spatrick
12446035553Spatricktemplate <class _Tp, class _Container>
12546035553Spatrick_LIBCPP_INLINE_VISIBILITY
12646035553Spatrickbool
12746035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
12846035553Spatrick
12946035553Spatricktemplate <class _Tp, class _Container>
13046035553Spatrick_LIBCPP_INLINE_VISIBILITY
13146035553Spatrickbool
13246035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
13346035553Spatrick
13446035553Spatricktemplate <class _Tp, class _Container /*= deque<_Tp>*/>
13546035553Spatrickclass _LIBCPP_TEMPLATE_VIS stack
13646035553Spatrick{
13746035553Spatrickpublic:
13846035553Spatrick    typedef _Container                               container_type;
13946035553Spatrick    typedef typename container_type::value_type      value_type;
14046035553Spatrick    typedef typename container_type::reference       reference;
14146035553Spatrick    typedef typename container_type::const_reference const_reference;
14246035553Spatrick    typedef typename container_type::size_type       size_type;
14346035553Spatrick    static_assert((is_same<_Tp, value_type>::value), "" );
14446035553Spatrick
14546035553Spatrickprotected:
14646035553Spatrick    container_type c;
14746035553Spatrick
14846035553Spatrickpublic:
14946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
15046035553Spatrick    stack()
15146035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
15246035553Spatrick        : c() {}
15346035553Spatrick
15446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
15546035553Spatrick    stack(const stack& __q) : c(__q.c) {}
15646035553Spatrick
15746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
15846035553Spatrick    stack& operator=(const stack& __q) {c = __q.c; return *this;}
15946035553Spatrick
16046035553Spatrick
16146035553Spatrick#ifndef _LIBCPP_CXX03_LANG
16246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
16346035553Spatrick    stack(stack&& __q)
16446035553Spatrick        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
16546035553Spatrick        : c(_VSTD::move(__q.c)) {}
16646035553Spatrick
16746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
16846035553Spatrick    stack& operator=(stack&& __q)
16946035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
17046035553Spatrick        {c = _VSTD::move(__q.c); return *this;}
17146035553Spatrick
17246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
17346035553Spatrick    explicit stack(container_type&& __c) : c(_VSTD::move(__c)) {}
17446035553Spatrick#endif // _LIBCPP_CXX03_LANG
17546035553Spatrick
17646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
17746035553Spatrick    explicit stack(const container_type& __c) : c(__c) {}
17846035553Spatrick
17946035553Spatrick    template <class _Alloc>
18046035553Spatrick        _LIBCPP_INLINE_VISIBILITY
18146035553Spatrick        explicit stack(const _Alloc& __a,
182*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
18346035553Spatrick            : c(__a) {}
18446035553Spatrick    template <class _Alloc>
18546035553Spatrick        _LIBCPP_INLINE_VISIBILITY
18646035553Spatrick        stack(const container_type& __c, const _Alloc& __a,
187*4bdff4beSrobert              __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
18846035553Spatrick            : c(__c, __a) {}
18946035553Spatrick    template <class _Alloc>
19046035553Spatrick        _LIBCPP_INLINE_VISIBILITY
19146035553Spatrick        stack(const stack& __s, const _Alloc& __a,
192*4bdff4beSrobert              __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
19346035553Spatrick            : c(__s.c, __a) {}
19446035553Spatrick#ifndef _LIBCPP_CXX03_LANG
19546035553Spatrick    template <class _Alloc>
19646035553Spatrick        _LIBCPP_INLINE_VISIBILITY
19746035553Spatrick        stack(container_type&& __c, const _Alloc& __a,
198*4bdff4beSrobert              __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
19946035553Spatrick            : c(_VSTD::move(__c), __a) {}
20046035553Spatrick    template <class _Alloc>
20146035553Spatrick        _LIBCPP_INLINE_VISIBILITY
20246035553Spatrick        stack(stack&& __s, const _Alloc& __a,
203*4bdff4beSrobert              __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
20446035553Spatrick            : c(_VSTD::move(__s.c), __a) {}
20546035553Spatrick#endif // _LIBCPP_CXX03_LANG
20646035553Spatrick
207*4bdff4beSrobert#if _LIBCPP_STD_VER > 20
208*4bdff4beSrobert    template <class _InputIterator,
209*4bdff4beSrobert              class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
210*4bdff4beSrobert    _LIBCPP_HIDE_FROM_ABI
211*4bdff4beSrobert    stack(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
212*4bdff4beSrobert
213*4bdff4beSrobert    template <class _InputIterator,
214*4bdff4beSrobert              class _Alloc,
215*4bdff4beSrobert              class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
216*4bdff4beSrobert              class = __enable_if_t<uses_allocator<container_type, _Alloc>::value>>
217*4bdff4beSrobert    _LIBCPP_HIDE_FROM_ABI
218*4bdff4beSrobert    stack(_InputIterator __first, _InputIterator __last, const _Alloc& __alloc) : c(__first, __last, __alloc) {}
219*4bdff4beSrobert#endif
220*4bdff4beSrobert
22146035553Spatrick    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
22246035553Spatrick    bool empty()     const      {return c.empty();}
22346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
22446035553Spatrick    size_type size() const      {return c.size();}
22546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
22646035553Spatrick    reference top()             {return c.back();}
22746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
22846035553Spatrick    const_reference top() const {return c.back();}
22946035553Spatrick
23046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
23146035553Spatrick    void push(const value_type& __v) {c.push_back(__v);}
23246035553Spatrick#ifndef _LIBCPP_CXX03_LANG
23346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
23446035553Spatrick    void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
23546035553Spatrick
23646035553Spatrick    template <class... _Args>
23746035553Spatrick        _LIBCPP_INLINE_VISIBILITY
23846035553Spatrick#if _LIBCPP_STD_VER > 14
23946035553Spatrick        decltype(auto) emplace(_Args&&... __args)
24046035553Spatrick        { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
24146035553Spatrick#else
24246035553Spatrick        void      emplace(_Args&&... __args)
24346035553Spatrick        {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
24446035553Spatrick#endif
24546035553Spatrick#endif // _LIBCPP_CXX03_LANG
24646035553Spatrick
24746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
24846035553Spatrick    void pop() {c.pop_back();}
24946035553Spatrick
25046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
25146035553Spatrick    void swap(stack& __s)
25246035553Spatrick        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
25346035553Spatrick    {
25446035553Spatrick        using _VSTD::swap;
25546035553Spatrick        swap(c, __s.c);
25646035553Spatrick    }
25746035553Spatrick
258*4bdff4beSrobert    _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; }
259*4bdff4beSrobert
26046035553Spatrick    template <class T1, class _C1>
26146035553Spatrick    friend
26246035553Spatrick    bool
26346035553Spatrick    operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
26446035553Spatrick
26546035553Spatrick    template <class T1, class _C1>
26646035553Spatrick    friend
26746035553Spatrick    bool
26846035553Spatrick    operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
26946035553Spatrick};
27046035553Spatrick
271*4bdff4beSrobert#if _LIBCPP_STD_VER > 14
27246035553Spatricktemplate<class _Container,
273*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Container>::value>
27446035553Spatrick>
27546035553Spatrickstack(_Container)
27646035553Spatrick    -> stack<typename _Container::value_type, _Container>;
27746035553Spatrick
27846035553Spatricktemplate<class _Container,
27946035553Spatrick         class _Alloc,
280*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Container>::value>,
281*4bdff4beSrobert         class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
28246035553Spatrick         >
28346035553Spatrickstack(_Container, _Alloc)
28446035553Spatrick    -> stack<typename _Container::value_type, _Container>;
28546035553Spatrick#endif
28646035553Spatrick
287*4bdff4beSrobert#if _LIBCPP_STD_VER > 20
288*4bdff4beSroberttemplate<class _InputIterator,
289*4bdff4beSrobert         class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
290*4bdff4beSrobertstack(_InputIterator, _InputIterator)
291*4bdff4beSrobert    -> stack<__iter_value_type<_InputIterator>>;
292*4bdff4beSrobert
293*4bdff4beSroberttemplate<class _InputIterator,
294*4bdff4beSrobert         class _Alloc,
295*4bdff4beSrobert         class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
296*4bdff4beSrobert         class = __enable_if_t<__is_allocator<_Alloc>::value>>
297*4bdff4beSrobertstack(_InputIterator, _InputIterator, _Alloc)
298*4bdff4beSrobert    -> stack<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
299*4bdff4beSrobert#endif
300*4bdff4beSrobert
30146035553Spatricktemplate <class _Tp, class _Container>
30246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
30346035553Spatrickbool
30446035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
30546035553Spatrick{
30646035553Spatrick    return __x.c == __y.c;
30746035553Spatrick}
30846035553Spatrick
30946035553Spatricktemplate <class _Tp, class _Container>
31046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
31146035553Spatrickbool
31246035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
31346035553Spatrick{
31446035553Spatrick    return __x.c < __y.c;
31546035553Spatrick}
31646035553Spatrick
31746035553Spatricktemplate <class _Tp, class _Container>
31846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
31946035553Spatrickbool
32046035553Spatrickoperator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
32146035553Spatrick{
32246035553Spatrick    return !(__x == __y);
32346035553Spatrick}
32446035553Spatrick
32546035553Spatricktemplate <class _Tp, class _Container>
32646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
32746035553Spatrickbool
32846035553Spatrickoperator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
32946035553Spatrick{
33046035553Spatrick    return __y < __x;
33146035553Spatrick}
33246035553Spatrick
33346035553Spatricktemplate <class _Tp, class _Container>
33446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
33546035553Spatrickbool
33646035553Spatrickoperator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
33746035553Spatrick{
33846035553Spatrick    return !(__x < __y);
33946035553Spatrick}
34046035553Spatrick
34146035553Spatricktemplate <class _Tp, class _Container>
34246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
34346035553Spatrickbool
34446035553Spatrickoperator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
34546035553Spatrick{
34646035553Spatrick    return !(__y < __x);
34746035553Spatrick}
34846035553Spatrick
34946035553Spatricktemplate <class _Tp, class _Container>
35046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
351*4bdff4beSrobert__enable_if_t<__is_swappable<_Container>::value, void>
35246035553Spatrickswap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
35346035553Spatrick    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
35446035553Spatrick{
35546035553Spatrick    __x.swap(__y);
35646035553Spatrick}
35746035553Spatrick
35846035553Spatricktemplate <class _Tp, class _Container, class _Alloc>
35946035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc>
36046035553Spatrick    : public uses_allocator<_Container, _Alloc>
36146035553Spatrick{
36246035553Spatrick};
36346035553Spatrick
36446035553Spatrick_LIBCPP_END_NAMESPACE_STD
36546035553Spatrick
366*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
367*4bdff4beSrobert#  include <concepts>
368*4bdff4beSrobert#  include <functional>
369*4bdff4beSrobert#endif
370*4bdff4beSrobert
37146035553Spatrick#endif // _LIBCPP_STACK
372