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