1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_STACK 11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_STACK 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser/* 14e78f53d1SNikolas Klauser stack synopsis 15e78f53d1SNikolas Klauser 16e78f53d1SNikolas Klausernamespace std 17e78f53d1SNikolas Klauser{ 18e78f53d1SNikolas Klauser 19e78f53d1SNikolas Klausertemplate <class T, class Container = deque<T>> 20e78f53d1SNikolas Klauserclass stack 21e78f53d1SNikolas Klauser{ 22e78f53d1SNikolas Klauserpublic: 23e78f53d1SNikolas Klauser typedef Container container_type; 24e78f53d1SNikolas Klauser typedef typename container_type::value_type value_type; 25e78f53d1SNikolas Klauser typedef typename container_type::reference reference; 26e78f53d1SNikolas Klauser typedef typename container_type::const_reference const_reference; 27e78f53d1SNikolas Klauser typedef typename container_type::size_type size_type; 28e78f53d1SNikolas Klauser 29e78f53d1SNikolas Klauserprotected: 30e78f53d1SNikolas Klauser container_type c; 31e78f53d1SNikolas Klauser 32e78f53d1SNikolas Klauserpublic: 33e78f53d1SNikolas Klauser stack() = default; 34e78f53d1SNikolas Klauser ~stack() = default; 35e78f53d1SNikolas Klauser 36e78f53d1SNikolas Klauser stack(const stack& q) = default; 37e78f53d1SNikolas Klauser stack(stack&& q) = default; 38e78f53d1SNikolas Klauser 39e78f53d1SNikolas Klauser stack& operator=(const stack& q) = default; 40e78f53d1SNikolas Klauser stack& operator=(stack&& q) = default; 41e78f53d1SNikolas Klauser 42e78f53d1SNikolas Klauser explicit stack(const container_type& c); 43e78f53d1SNikolas Klauser explicit stack(container_type&& c); 44e78f53d1SNikolas Klauser template <class InputIterator> stack(InputIterator first, InputIterator last); // since C++23 45e78f53d1SNikolas Klauser template<container-compatible-range<T> R> stack(from_range_t, R&& rg); // since C++23 46e78f53d1SNikolas Klauser template <class Alloc> explicit stack(const Alloc& a); 47e78f53d1SNikolas Klauser template <class Alloc> stack(const container_type& c, const Alloc& a); 48e78f53d1SNikolas Klauser template <class Alloc> stack(container_type&& c, const Alloc& a); 49e78f53d1SNikolas Klauser template <class Alloc> stack(const stack& c, const Alloc& a); 50e78f53d1SNikolas Klauser template <class Alloc> stack(stack&& c, const Alloc& a); 51e78f53d1SNikolas Klauser template<class InputIterator, class Alloc> 52e78f53d1SNikolas Klauser stack(InputIterator first, InputIterator last, const Alloc&); // since C++23 53e78f53d1SNikolas Klauser template<container-compatible-range<T> R, class Alloc> 54e78f53d1SNikolas Klauser stack(from_range_t, R&& rg, const Alloc&); // since C++23 55e78f53d1SNikolas Klauser 56e78f53d1SNikolas Klauser bool empty() const; 57e78f53d1SNikolas Klauser size_type size() const; 58e78f53d1SNikolas Klauser reference top(); 59e78f53d1SNikolas Klauser const_reference top() const; 60e78f53d1SNikolas Klauser 61e78f53d1SNikolas Klauser void push(const value_type& x); 62e78f53d1SNikolas Klauser void push(value_type&& x); 63e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 64e78f53d1SNikolas Klauser void push_range(R&& rg); // C++23 65e78f53d1SNikolas Klauser template <class... Args> reference emplace(Args&&... args); // reference in C++17 66e78f53d1SNikolas Klauser void pop(); 67e78f53d1SNikolas Klauser 68e78f53d1SNikolas Klauser void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>) 69e78f53d1SNikolas Klauser}; 70e78f53d1SNikolas Klauser 71e78f53d1SNikolas Klausertemplate<class Container> 72e78f53d1SNikolas Klauser stack(Container) -> stack<typename Container::value_type, Container>; // C++17 73e78f53d1SNikolas Klauser 74e78f53d1SNikolas Klausertemplate<class InputIterator> 75e78f53d1SNikolas Klauser stack(InputIterator, InputIterator) -> stack<iter-value-type<InputIterator>>; // since C++23 76e78f53d1SNikolas Klauser 77e78f53d1SNikolas Klausertemplate<ranges::input_range R> 78e78f53d1SNikolas Klauser stack(from_range_t, R&&) -> stack<ranges::range_value_t<R>>; // since C++23 79e78f53d1SNikolas Klauser 80e78f53d1SNikolas Klausertemplate<class Container, class Allocator> 81e78f53d1SNikolas Klauser stack(Container, Allocator) -> stack<typename Container::value_type, Container>; // C++17 82e78f53d1SNikolas Klauser 83e78f53d1SNikolas Klausertemplate<class InputIterator, class Allocator> 84e78f53d1SNikolas Klauser stack(InputIterator, InputIterator, Allocator) 85e78f53d1SNikolas Klauser -> stack<iter-value-type<InputIterator>, 86e78f53d1SNikolas Klauser deque<iter-value-type<InputIterator>, Allocator>>; // since C++23 87e78f53d1SNikolas Klauser 88e78f53d1SNikolas Klausertemplate<ranges::input_range R, class Allocator> 89e78f53d1SNikolas Klauser stack(from_range_t, R&&, Allocator) 90e78f53d1SNikolas Klauser -> stack<ranges::range_value_t<R>, deque<ranges::range_value_t<R>, Allocator>>; // since C++23 91e78f53d1SNikolas Klauser 92e78f53d1SNikolas Klausertemplate <class T, class Container> 93e78f53d1SNikolas Klauser bool operator==(const stack<T, Container>& x, const stack<T, Container>& y); 94e78f53d1SNikolas Klausertemplate <class T, class Container> 95e78f53d1SNikolas Klauser bool operator< (const stack<T, Container>& x, const stack<T, Container>& y); 96e78f53d1SNikolas Klausertemplate <class T, class Container> 97e78f53d1SNikolas Klauser bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y); 98e78f53d1SNikolas Klausertemplate <class T, class Container> 99e78f53d1SNikolas Klauser bool operator> (const stack<T, Container>& x, const stack<T, Container>& y); 100e78f53d1SNikolas Klausertemplate <class T, class Container> 101e78f53d1SNikolas Klauser bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y); 102e78f53d1SNikolas Klausertemplate <class T, class Container> 103e78f53d1SNikolas Klauser bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y); 104e78f53d1SNikolas Klausertemplate<class T, three_way_comparable Container> 105e78f53d1SNikolas Klauser compare_three_way_result_t<Container> 106e78f53d1SNikolas Klauser operator<=>(const stack<T, Container>& x, const stack<T, Container>& y); // since C++20 107e78f53d1SNikolas Klauser 108e78f53d1SNikolas Klausertemplate <class T, class Container> 109e78f53d1SNikolas Klauser void swap(stack<T, Container>& x, stack<T, Container>& y) 110e78f53d1SNikolas Klauser noexcept(noexcept(x.swap(y))); 111e78f53d1SNikolas Klauser 112e78f53d1SNikolas Klauser} // std 113e78f53d1SNikolas Klauser 114e78f53d1SNikolas Klauser*/ 115e78f53d1SNikolas Klauser 11673fbae83SNikolas Klauser#include <__cxx03/__algorithm/ranges_copy.h> 11773fbae83SNikolas Klauser#include <__cxx03/__config> 11873fbae83SNikolas Klauser#include <__cxx03/__fwd/stack.h> 11973fbae83SNikolas Klauser#include <__cxx03/__iterator/back_insert_iterator.h> 12073fbae83SNikolas Klauser#include <__cxx03/__iterator/iterator_traits.h> 12173fbae83SNikolas Klauser#include <__cxx03/__memory/uses_allocator.h> 12273fbae83SNikolas Klauser#include <__cxx03/__ranges/access.h> 12373fbae83SNikolas Klauser#include <__cxx03/__ranges/concepts.h> 12473fbae83SNikolas Klauser#include <__cxx03/__ranges/container_compatible_range.h> 12573fbae83SNikolas Klauser#include <__cxx03/__ranges/from_range.h> 12673fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_same.h> 12773fbae83SNikolas Klauser#include <__cxx03/__utility/forward.h> 12873fbae83SNikolas Klauser#include <__cxx03/deque> 12973fbae83SNikolas Klauser#include <__cxx03/version> 130e78f53d1SNikolas Klauser 131e78f53d1SNikolas Klauser// standard-mandated includes 132e78f53d1SNikolas Klauser 133e78f53d1SNikolas Klauser// [stack.syn] 13473fbae83SNikolas Klauser#include <__cxx03/compare> 13573fbae83SNikolas Klauser#include <__cxx03/initializer_list> 136e78f53d1SNikolas Klauser 137e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 138e78f53d1SNikolas Klauser# pragma GCC system_header 139e78f53d1SNikolas Klauser#endif 140e78f53d1SNikolas Klauser 141e78f53d1SNikolas Klauser_LIBCPP_PUSH_MACROS 14273fbae83SNikolas Klauser#include <__cxx03/__undef_macros> 143e78f53d1SNikolas Klauser 144e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD 145e78f53d1SNikolas Klauser 146e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 147e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI bool operator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y); 148e78f53d1SNikolas Klauser 149e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 150e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI bool operator<(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y); 151e78f53d1SNikolas Klauser 152e78f53d1SNikolas Klausertemplate <class _Tp, class _Container /*= deque<_Tp>*/> 153e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS stack { 154e78f53d1SNikolas Klauserpublic: 155e78f53d1SNikolas Klauser typedef _Container container_type; 156e78f53d1SNikolas Klauser typedef typename container_type::value_type value_type; 157e78f53d1SNikolas Klauser typedef typename container_type::reference reference; 158e78f53d1SNikolas Klauser typedef typename container_type::const_reference const_reference; 159e78f53d1SNikolas Klauser typedef typename container_type::size_type size_type; 160e78f53d1SNikolas Klauser static_assert(is_same<_Tp, value_type>::value, ""); 161e78f53d1SNikolas Klauser 162e78f53d1SNikolas Klauserprotected: 163e78f53d1SNikolas Klauser container_type c; 164e78f53d1SNikolas Klauser 165e78f53d1SNikolas Klauserpublic: 166e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack() _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value) : c() {} 167e78f53d1SNikolas Klauser 168e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack(const stack& __q) : c(__q.c) {} 169e78f53d1SNikolas Klauser 170e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack& operator=(const stack& __q) { 171e78f53d1SNikolas Klauser c = __q.c; 172e78f53d1SNikolas Klauser return *this; 173e78f53d1SNikolas Klauser } 174e78f53d1SNikolas Klauser 175e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 176e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack(stack&& __q) noexcept(is_nothrow_move_constructible<container_type>::value) 177e78f53d1SNikolas Klauser : c(std::move(__q.c)) {} 178e78f53d1SNikolas Klauser 179e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack& operator=(stack&& __q) noexcept(is_nothrow_move_assignable<container_type>::value) { 180e78f53d1SNikolas Klauser c = std::move(__q.c); 181e78f53d1SNikolas Klauser return *this; 182e78f53d1SNikolas Klauser } 183e78f53d1SNikolas Klauser 184e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit stack(container_type&& __c) : c(std::move(__c)) {} 185e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 186e78f53d1SNikolas Klauser 187e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit stack(const container_type& __c) : c(__c) {} 188e78f53d1SNikolas Klauser 189e78f53d1SNikolas Klauser template <class _Alloc> 190e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit stack(const _Alloc& __a, 191e78f53d1SNikolas Klauser __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0) 192e78f53d1SNikolas Klauser : c(__a) {} 193e78f53d1SNikolas Klauser template <class _Alloc> 194e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 195e78f53d1SNikolas Klauser stack(const container_type& __c, const _Alloc& __a, __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0) 196e78f53d1SNikolas Klauser : c(__c, __a) {} 197e78f53d1SNikolas Klauser template <class _Alloc> 198e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 199e78f53d1SNikolas Klauser stack(const stack& __s, const _Alloc& __a, __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0) 200e78f53d1SNikolas Klauser : c(__s.c, __a) {} 201e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 202e78f53d1SNikolas Klauser template <class _Alloc> 203e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 204e78f53d1SNikolas Klauser stack(container_type&& __c, const _Alloc& __a, __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0) 205e78f53d1SNikolas Klauser : c(std::move(__c), __a) {} 206e78f53d1SNikolas Klauser template <class _Alloc> 207e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 208e78f53d1SNikolas Klauser stack(stack&& __s, const _Alloc& __a, __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0) 209e78f53d1SNikolas Klauser : c(std::move(__s.c), __a) {} 210e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 211e78f53d1SNikolas Klauser 212e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 213e78f53d1SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0> 214e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack(_InputIterator __first, _InputIterator __last) : c(__first, __last) {} 215e78f53d1SNikolas Klauser 216e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 217e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack(from_range_t, _Range&& __range) : c(from_range, std::forward<_Range>(__range)) {} 218e78f53d1SNikolas Klauser 219e78f53d1SNikolas Klauser template <class _InputIterator, 220e78f53d1SNikolas Klauser class _Alloc, 221e78f53d1SNikolas Klauser __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0, 222e78f53d1SNikolas Klauser __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0> 223e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack(_InputIterator __first, _InputIterator __last, const _Alloc& __alloc) 224e78f53d1SNikolas Klauser : c(__first, __last, __alloc) {} 225e78f53d1SNikolas Klauser 226e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range, 227e78f53d1SNikolas Klauser class _Alloc, 228e78f53d1SNikolas Klauser __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0> 229e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI stack(from_range_t, _Range&& __range, const _Alloc& __alloc) 230e78f53d1SNikolas Klauser : c(from_range, std::forward<_Range>(__range), __alloc) {} 231e78f53d1SNikolas Klauser 232e78f53d1SNikolas Klauser#endif 233e78f53d1SNikolas Klauser 234e78f53d1SNikolas Klauser _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool empty() const { return c.empty(); } 235e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI size_type size() const { return c.size(); } 236e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI reference top() { return c.back(); } 237e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_reference top() const { return c.back(); } 238e78f53d1SNikolas Klauser 239e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void push(const value_type& __v) { c.push_back(__v); } 240e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 241e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void push(value_type&& __v) { c.push_back(std::move(__v)); } 242e78f53d1SNikolas Klauser 243e78f53d1SNikolas Klauser# if _LIBCPP_STD_VER >= 23 244e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 245e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void push_range(_Range&& __range) { 246e78f53d1SNikolas Klauser if constexpr (requires(container_type& __c) { __c.append_range(std::forward<_Range>(__range)); }) { 247e78f53d1SNikolas Klauser c.append_range(std::forward<_Range>(__range)); 248e78f53d1SNikolas Klauser } else { 249e78f53d1SNikolas Klauser ranges::copy(std::forward<_Range>(__range), std::back_inserter(c)); 250e78f53d1SNikolas Klauser } 251e78f53d1SNikolas Klauser } 252e78f53d1SNikolas Klauser# endif 253e78f53d1SNikolas Klauser 254e78f53d1SNikolas Klauser template <class... _Args> 255e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 256e78f53d1SNikolas Klauser# if _LIBCPP_STD_VER >= 17 257e78f53d1SNikolas Klauser decltype(auto) 258e78f53d1SNikolas Klauser emplace(_Args&&... __args) { 259e78f53d1SNikolas Klauser return c.emplace_back(std::forward<_Args>(__args)...); 260e78f53d1SNikolas Klauser } 261e78f53d1SNikolas Klauser# else 262e78f53d1SNikolas Klauser void 263e78f53d1SNikolas Klauser emplace(_Args&&... __args) { 264e78f53d1SNikolas Klauser c.emplace_back(std::forward<_Args>(__args)...); 265e78f53d1SNikolas Klauser } 266e78f53d1SNikolas Klauser# endif 267e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 268e78f53d1SNikolas Klauser 269e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void pop() { c.pop_back(); } 270e78f53d1SNikolas Klauser 271e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void swap(stack& __s) _NOEXCEPT_(__is_nothrow_swappable_v<container_type>) { 272e78f53d1SNikolas Klauser using std::swap; 273e78f53d1SNikolas Klauser swap(c, __s.c); 274e78f53d1SNikolas Klauser } 275e78f53d1SNikolas Klauser 276e78f53d1SNikolas Klauser _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; } 277e78f53d1SNikolas Klauser 278e78f53d1SNikolas Klauser template <class _T1, class _OtherContainer> 279e78f53d1SNikolas Klauser friend bool operator==(const stack<_T1, _OtherContainer>& __x, const stack<_T1, _OtherContainer>& __y); 280e78f53d1SNikolas Klauser 281e78f53d1SNikolas Klauser template <class _T1, class _OtherContainer> 282e78f53d1SNikolas Klauser friend bool operator<(const stack<_T1, _OtherContainer>& __x, const stack<_T1, _OtherContainer>& __y); 283e78f53d1SNikolas Klauser}; 284e78f53d1SNikolas Klauser 285e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 286e78f53d1SNikolas Klausertemplate <class _Container, class = enable_if_t<!__is_allocator<_Container>::value> > 287e78f53d1SNikolas Klauserstack(_Container) -> stack<typename _Container::value_type, _Container>; 288e78f53d1SNikolas Klauser 289e78f53d1SNikolas Klausertemplate <class _Container, 290e78f53d1SNikolas Klauser class _Alloc, 291e78f53d1SNikolas Klauser class = enable_if_t<!__is_allocator<_Container>::value>, 292e78f53d1SNikolas Klauser class = enable_if_t<uses_allocator<_Container, _Alloc>::value> > 293e78f53d1SNikolas Klauserstack(_Container, _Alloc) -> stack<typename _Container::value_type, _Container>; 294e78f53d1SNikolas Klauser#endif 295e78f53d1SNikolas Klauser 296e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 297e78f53d1SNikolas Klausertemplate <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0> 298e78f53d1SNikolas Klauserstack(_InputIterator, _InputIterator) -> stack<__iter_value_type<_InputIterator>>; 299e78f53d1SNikolas Klauser 300e78f53d1SNikolas Klausertemplate <ranges::input_range _Range> 301e78f53d1SNikolas Klauserstack(from_range_t, _Range&&) -> stack<ranges::range_value_t<_Range>>; 302e78f53d1SNikolas Klauser 303e78f53d1SNikolas Klausertemplate <class _InputIterator, 304e78f53d1SNikolas Klauser class _Alloc, 305e78f53d1SNikolas Klauser __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0, 306e78f53d1SNikolas Klauser __enable_if_t<__is_allocator<_Alloc>::value, int> = 0> 307e78f53d1SNikolas Klauserstack(_InputIterator, 308e78f53d1SNikolas Klauser _InputIterator, 309e78f53d1SNikolas Klauser _Alloc) -> stack<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>; 310e78f53d1SNikolas Klauser 311e78f53d1SNikolas Klausertemplate <ranges::input_range _Range, class _Alloc, __enable_if_t<__is_allocator<_Alloc>::value, int> = 0> 312e78f53d1SNikolas Klauserstack(from_range_t, 313e78f53d1SNikolas Klauser _Range&&, 314e78f53d1SNikolas Klauser _Alloc) -> stack<ranges::range_value_t<_Range>, deque<ranges::range_value_t<_Range>, _Alloc>>; 315e78f53d1SNikolas Klauser 316e78f53d1SNikolas Klauser#endif 317e78f53d1SNikolas Klauser 318e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 319e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { 320e78f53d1SNikolas Klauser return __x.c == __y.c; 321e78f53d1SNikolas Klauser} 322e78f53d1SNikolas Klauser 323e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 324e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { 325e78f53d1SNikolas Klauser return __x.c < __y.c; 326e78f53d1SNikolas Klauser} 327e78f53d1SNikolas Klauser 328e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 329e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { 330e78f53d1SNikolas Klauser return !(__x == __y); 331e78f53d1SNikolas Klauser} 332e78f53d1SNikolas Klauser 333e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 334e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { 335e78f53d1SNikolas Klauser return __y < __x; 336e78f53d1SNikolas Klauser} 337e78f53d1SNikolas Klauser 338e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 339e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { 340e78f53d1SNikolas Klauser return !(__x < __y); 341e78f53d1SNikolas Klauser} 342e78f53d1SNikolas Klauser 343e78f53d1SNikolas Klausertemplate <class _Tp, class _Container> 344e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { 345e78f53d1SNikolas Klauser return !(__y < __x); 346e78f53d1SNikolas Klauser} 347e78f53d1SNikolas Klauser 348e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 349e78f53d1SNikolas Klauser 350e78f53d1SNikolas Klausertemplate <class _Tp, three_way_comparable _Container> 351e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI compare_three_way_result_t<_Container> 352e78f53d1SNikolas Klauseroperator<=>(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { 353e78f53d1SNikolas Klauser // clang 16 bug: declaring `friend operator<=>` causes "use of overloaded operator '*' is ambiguous" errors 354e78f53d1SNikolas Klauser return __x.__get_container() <=> __y.__get_container(); 355e78f53d1SNikolas Klauser} 356e78f53d1SNikolas Klauser 357e78f53d1SNikolas Klauser#endif 358e78f53d1SNikolas Klauser 359e78f53d1SNikolas Klausertemplate <class _Tp, class _Container, __enable_if_t<__is_swappable_v<_Container>, int> = 0> 360e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI void swap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y) 361e78f53d1SNikolas Klauser _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) { 362e78f53d1SNikolas Klauser __x.swap(__y); 363e78f53d1SNikolas Klauser} 364e78f53d1SNikolas Klauser 365e78f53d1SNikolas Klausertemplate <class _Tp, class _Container, class _Alloc> 366e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc> : public uses_allocator<_Container, _Alloc> { 367e78f53d1SNikolas Klauser}; 368e78f53d1SNikolas Klauser 369e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD 370e78f53d1SNikolas Klauser 371e78f53d1SNikolas Klauser_LIBCPP_POP_MACROS 372e78f53d1SNikolas Klauser 373e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 37473fbae83SNikolas Klauser# include <__cxx03/concepts> 37573fbae83SNikolas Klauser# include <__cxx03/functional> 37673fbae83SNikolas Klauser# include <__cxx03/type_traits> 377e78f53d1SNikolas Klauser#endif 378e78f53d1SNikolas Klauser 379*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_STACK 380