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