146035553Spatrick// -*- C++ -*- 246035553Spatrick//===---------------------------- stack -----------------------------------===// 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); 4446035553Spatrick template <class Alloc> explicit stack(const Alloc& a); 4546035553Spatrick template <class Alloc> stack(const container_type& c, const Alloc& a); 4646035553Spatrick template <class Alloc> stack(container_type&& c, const Alloc& a); 4746035553Spatrick template <class Alloc> stack(const stack& c, const Alloc& a); 4846035553Spatrick template <class Alloc> stack(stack&& c, const Alloc& a); 4946035553Spatrick 5046035553Spatrick bool empty() const; 5146035553Spatrick size_type size() const; 5246035553Spatrick reference top(); 5346035553Spatrick const_reference top() const; 5446035553Spatrick 5546035553Spatrick void push(const value_type& x); 5646035553Spatrick void push(value_type&& x); 5746035553Spatrick template <class... Args> reference emplace(Args&&... args); // reference in C++17 5846035553Spatrick void pop(); 5946035553Spatrick 6046035553Spatrick void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>) 6146035553Spatrick}; 6246035553Spatrick 6346035553Spatricktemplate<class Container> 6446035553Spatrick stack(Container) -> stack<typename Container::value_type, Container>; // C++17 6546035553Spatrick 6646035553Spatricktemplate<class Container, class Allocator> 6746035553Spatrick stack(Container, Allocator) -> stack<typename Container::value_type, Container>; // C++17 6846035553Spatrick 6946035553Spatricktemplate <class T, class Container> 7046035553Spatrick bool operator==(const stack<T, Container>& x, const stack<T, Container>& y); 7146035553Spatricktemplate <class T, class Container> 7246035553Spatrick bool operator< (const stack<T, Container>& x, const stack<T, Container>& y); 7346035553Spatricktemplate <class T, class Container> 7446035553Spatrick bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y); 7546035553Spatricktemplate <class T, class Container> 7646035553Spatrick bool operator> (const stack<T, Container>& x, const stack<T, Container>& y); 7746035553Spatricktemplate <class T, class Container> 7846035553Spatrick bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y); 7946035553Spatricktemplate <class T, class Container> 8046035553Spatrick bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y); 8146035553Spatrick 8246035553Spatricktemplate <class T, class Container> 8346035553Spatrick void swap(stack<T, Container>& x, stack<T, Container>& y) 8446035553Spatrick noexcept(noexcept(x.swap(y))); 8546035553Spatrick 8646035553Spatrick} // std 8746035553Spatrick 8846035553Spatrick*/ 8946035553Spatrick 9046035553Spatrick#include <__config> 91*76d0caaeSpatrick#include <__memory/uses_allocator.h> 92*76d0caaeSpatrick#include <__utility/forward.h> 9346035553Spatrick#include <deque> 9446035553Spatrick 9546035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 9646035553Spatrick#pragma GCC system_header 9746035553Spatrick#endif 9846035553Spatrick 9946035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 10046035553Spatrick 10146035553Spatricktemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack; 10246035553Spatrick 10346035553Spatricktemplate <class _Tp, class _Container> 10446035553Spatrick_LIBCPP_INLINE_VISIBILITY 10546035553Spatrickbool 10646035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y); 10746035553Spatrick 10846035553Spatricktemplate <class _Tp, class _Container> 10946035553Spatrick_LIBCPP_INLINE_VISIBILITY 11046035553Spatrickbool 11146035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y); 11246035553Spatrick 11346035553Spatricktemplate <class _Tp, class _Container /*= deque<_Tp>*/> 11446035553Spatrickclass _LIBCPP_TEMPLATE_VIS stack 11546035553Spatrick{ 11646035553Spatrickpublic: 11746035553Spatrick typedef _Container container_type; 11846035553Spatrick typedef typename container_type::value_type value_type; 11946035553Spatrick typedef typename container_type::reference reference; 12046035553Spatrick typedef typename container_type::const_reference const_reference; 12146035553Spatrick typedef typename container_type::size_type size_type; 12246035553Spatrick static_assert((is_same<_Tp, value_type>::value), "" ); 12346035553Spatrick 12446035553Spatrickprotected: 12546035553Spatrick container_type c; 12646035553Spatrick 12746035553Spatrickpublic: 12846035553Spatrick _LIBCPP_INLINE_VISIBILITY 12946035553Spatrick stack() 13046035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value) 13146035553Spatrick : c() {} 13246035553Spatrick 13346035553Spatrick _LIBCPP_INLINE_VISIBILITY 13446035553Spatrick stack(const stack& __q) : c(__q.c) {} 13546035553Spatrick 13646035553Spatrick _LIBCPP_INLINE_VISIBILITY 13746035553Spatrick stack& operator=(const stack& __q) {c = __q.c; return *this;} 13846035553Spatrick 13946035553Spatrick 14046035553Spatrick#ifndef _LIBCPP_CXX03_LANG 14146035553Spatrick _LIBCPP_INLINE_VISIBILITY 14246035553Spatrick stack(stack&& __q) 14346035553Spatrick _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value) 14446035553Spatrick : c(_VSTD::move(__q.c)) {} 14546035553Spatrick 14646035553Spatrick _LIBCPP_INLINE_VISIBILITY 14746035553Spatrick stack& operator=(stack&& __q) 14846035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value) 14946035553Spatrick {c = _VSTD::move(__q.c); return *this;} 15046035553Spatrick 15146035553Spatrick _LIBCPP_INLINE_VISIBILITY 15246035553Spatrick explicit stack(container_type&& __c) : c(_VSTD::move(__c)) {} 15346035553Spatrick#endif // _LIBCPP_CXX03_LANG 15446035553Spatrick 15546035553Spatrick _LIBCPP_INLINE_VISIBILITY 15646035553Spatrick explicit stack(const container_type& __c) : c(__c) {} 15746035553Spatrick 15846035553Spatrick template <class _Alloc> 15946035553Spatrick _LIBCPP_INLINE_VISIBILITY 16046035553Spatrick explicit stack(const _Alloc& __a, 161*76d0caaeSpatrick _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0) 16246035553Spatrick : c(__a) {} 16346035553Spatrick template <class _Alloc> 16446035553Spatrick _LIBCPP_INLINE_VISIBILITY 16546035553Spatrick stack(const container_type& __c, const _Alloc& __a, 166*76d0caaeSpatrick _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0) 16746035553Spatrick : c(__c, __a) {} 16846035553Spatrick template <class _Alloc> 16946035553Spatrick _LIBCPP_INLINE_VISIBILITY 17046035553Spatrick stack(const stack& __s, const _Alloc& __a, 171*76d0caaeSpatrick _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0) 17246035553Spatrick : c(__s.c, __a) {} 17346035553Spatrick#ifndef _LIBCPP_CXX03_LANG 17446035553Spatrick template <class _Alloc> 17546035553Spatrick _LIBCPP_INLINE_VISIBILITY 17646035553Spatrick stack(container_type&& __c, const _Alloc& __a, 177*76d0caaeSpatrick _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0) 17846035553Spatrick : c(_VSTD::move(__c), __a) {} 17946035553Spatrick template <class _Alloc> 18046035553Spatrick _LIBCPP_INLINE_VISIBILITY 18146035553Spatrick stack(stack&& __s, const _Alloc& __a, 182*76d0caaeSpatrick _EnableIf<uses_allocator<container_type, _Alloc>::value>* = 0) 18346035553Spatrick : c(_VSTD::move(__s.c), __a) {} 18446035553Spatrick#endif // _LIBCPP_CXX03_LANG 18546035553Spatrick 18646035553Spatrick _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 18746035553Spatrick bool empty() const {return c.empty();} 18846035553Spatrick _LIBCPP_INLINE_VISIBILITY 18946035553Spatrick size_type size() const {return c.size();} 19046035553Spatrick _LIBCPP_INLINE_VISIBILITY 19146035553Spatrick reference top() {return c.back();} 19246035553Spatrick _LIBCPP_INLINE_VISIBILITY 19346035553Spatrick const_reference top() const {return c.back();} 19446035553Spatrick 19546035553Spatrick _LIBCPP_INLINE_VISIBILITY 19646035553Spatrick void push(const value_type& __v) {c.push_back(__v);} 19746035553Spatrick#ifndef _LIBCPP_CXX03_LANG 19846035553Spatrick _LIBCPP_INLINE_VISIBILITY 19946035553Spatrick void push(value_type&& __v) {c.push_back(_VSTD::move(__v));} 20046035553Spatrick 20146035553Spatrick template <class... _Args> 20246035553Spatrick _LIBCPP_INLINE_VISIBILITY 20346035553Spatrick#if _LIBCPP_STD_VER > 14 20446035553Spatrick decltype(auto) emplace(_Args&&... __args) 20546035553Spatrick { return c.emplace_back(_VSTD::forward<_Args>(__args)...);} 20646035553Spatrick#else 20746035553Spatrick void emplace(_Args&&... __args) 20846035553Spatrick { c.emplace_back(_VSTD::forward<_Args>(__args)...);} 20946035553Spatrick#endif 21046035553Spatrick#endif // _LIBCPP_CXX03_LANG 21146035553Spatrick 21246035553Spatrick _LIBCPP_INLINE_VISIBILITY 21346035553Spatrick void pop() {c.pop_back();} 21446035553Spatrick 21546035553Spatrick _LIBCPP_INLINE_VISIBILITY 21646035553Spatrick void swap(stack& __s) 21746035553Spatrick _NOEXCEPT_(__is_nothrow_swappable<container_type>::value) 21846035553Spatrick { 21946035553Spatrick using _VSTD::swap; 22046035553Spatrick swap(c, __s.c); 22146035553Spatrick } 22246035553Spatrick 22346035553Spatrick template <class T1, class _C1> 22446035553Spatrick friend 22546035553Spatrick bool 22646035553Spatrick operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y); 22746035553Spatrick 22846035553Spatrick template <class T1, class _C1> 22946035553Spatrick friend 23046035553Spatrick bool 23146035553Spatrick operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y); 23246035553Spatrick}; 23346035553Spatrick 23446035553Spatrick#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 23546035553Spatricktemplate<class _Container, 236*76d0caaeSpatrick class = _EnableIf<!__is_allocator<_Container>::value> 23746035553Spatrick> 23846035553Spatrickstack(_Container) 23946035553Spatrick -> stack<typename _Container::value_type, _Container>; 24046035553Spatrick 24146035553Spatricktemplate<class _Container, 24246035553Spatrick class _Alloc, 243*76d0caaeSpatrick class = _EnableIf<!__is_allocator<_Container>::value>, 244*76d0caaeSpatrick class = _EnableIf<uses_allocator<_Container, _Alloc>::value> 24546035553Spatrick > 24646035553Spatrickstack(_Container, _Alloc) 24746035553Spatrick -> stack<typename _Container::value_type, _Container>; 24846035553Spatrick#endif 24946035553Spatrick 25046035553Spatricktemplate <class _Tp, class _Container> 25146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 25246035553Spatrickbool 25346035553Spatrickoperator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) 25446035553Spatrick{ 25546035553Spatrick return __x.c == __y.c; 25646035553Spatrick} 25746035553Spatrick 25846035553Spatricktemplate <class _Tp, class _Container> 25946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 26046035553Spatrickbool 26146035553Spatrickoperator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) 26246035553Spatrick{ 26346035553Spatrick return __x.c < __y.c; 26446035553Spatrick} 26546035553Spatrick 26646035553Spatricktemplate <class _Tp, class _Container> 26746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 26846035553Spatrickbool 26946035553Spatrickoperator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) 27046035553Spatrick{ 27146035553Spatrick return !(__x == __y); 27246035553Spatrick} 27346035553Spatrick 27446035553Spatricktemplate <class _Tp, class _Container> 27546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 27646035553Spatrickbool 27746035553Spatrickoperator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) 27846035553Spatrick{ 27946035553Spatrick return __y < __x; 28046035553Spatrick} 28146035553Spatrick 28246035553Spatricktemplate <class _Tp, class _Container> 28346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 28446035553Spatrickbool 28546035553Spatrickoperator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) 28646035553Spatrick{ 28746035553Spatrick return !(__x < __y); 28846035553Spatrick} 28946035553Spatrick 29046035553Spatricktemplate <class _Tp, class _Container> 29146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 29246035553Spatrickbool 29346035553Spatrickoperator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) 29446035553Spatrick{ 29546035553Spatrick return !(__y < __x); 29646035553Spatrick} 29746035553Spatrick 29846035553Spatricktemplate <class _Tp, class _Container> 29946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 300*76d0caaeSpatrick_EnableIf<__is_swappable<_Container>::value, void> 30146035553Spatrickswap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y) 30246035553Spatrick _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 30346035553Spatrick{ 30446035553Spatrick __x.swap(__y); 30546035553Spatrick} 30646035553Spatrick 30746035553Spatricktemplate <class _Tp, class _Container, class _Alloc> 30846035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc> 30946035553Spatrick : public uses_allocator<_Container, _Alloc> 31046035553Spatrick{ 31146035553Spatrick}; 31246035553Spatrick 31346035553Spatrick_LIBCPP_END_NAMESPACE_STD 31446035553Spatrick 31546035553Spatrick#endif // _LIBCPP_STACK 316