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