11#ifndef INCLUDED_BSLSTL_STACK_CPP03
12#define INCLUDED_BSLSTL_STACK_CPP03
63#ifdef COMPILING_BSLSTL_STACK_H
84template <
class VALUE,
class CONTAINER = deque<VALUE> >
87#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
97 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
103 template <
class INPUT_ITER,
class SENTINEL>
104 void privatePushRange(INPUT_ITER first, SENTINEL last);
108 typedef typename CONTAINER::value_type
value_type;
109 typedef typename CONTAINER::reference
reference;
111 typedef typename CONTAINER::size_type
size_type;
122 template <
class VAL,
class CONT>
123 friend bool operator==(
const stack<VAL, CONT>&,
const stack<VAL, CONT>&);
124 template <
class VAL,
class CONT>
125 friend bool operator!=(
const stack<VAL, CONT>&,
const stack<VAL, CONT>&);
126 template <
class VAL,
class CONT>
127 friend bool operator< (
const stack<VAL, CONT>&,
const stack<VAL, CONT>&);
128 template <
class VAL,
class CONT>
129 friend bool operator> (
const stack<VAL, CONT>&,
const stack<VAL, CONT>&);
130 template <
class VAL,
class CONT>
131 friend bool operator<=(
const stack<VAL, CONT>&,
const stack<VAL, CONT>&);
132 template <
class VAL,
class CONT>
133 friend bool operator>=(
const stack<VAL, CONT>&,
const stack<VAL, CONT>&);
134#if defined BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON \
135 && defined BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
136 template <
class VAL, three_way_comparable CONT>
137 friend compare_three_way_result_t<CONT>
138 operator<=>(
const stack<VAL, CONT>&,
const stack<VAL, CONT>&);
145 BloombergLP::bslma::UsesBslmaAllocator,
146 BloombergLP::bslma::UsesBslmaAllocator<container_type>::value);
163 stack(BloombergLP::bslmf::MovableRef<stack> original);
169 stack(
const CONTAINER& container);
177 stack(BloombergLP::bslmf::MovableRef<CONTAINER> container);
182 template <
class ALLOCATOR>
184 stack(
const ALLOCATOR& basicAllocator,
186 ALLOCATOR>::type * = 0);
192 template <
class ALLOCATOR>
193 stack(
const CONTAINER& container,
194 const ALLOCATOR& basicAllocator,
196 ALLOCATOR>::type * = 0);
202 template <
class ALLOCATOR>
204 const ALLOCATOR& basicAllocator,
206 ALLOCATOR>::type * = 0);
217 template <
class ALLOCATOR>
218 stack(BloombergLP::bslmf::MovableRef<CONTAINER> container,
219 const ALLOCATOR& basicAllocator,
221 ALLOCATOR>::type * = 0);
233 template <
class ALLOCATOR>
234 stack(BloombergLP::bslmf::MovableRef<stack> original,
235 const ALLOCATOR& basicAllocator,
237 ALLOCATOR>::type * = 0);
244 template <
class INPUT_ITER>
245 stack(INPUT_ITER first, INPUT_ITER last);
246 template <
class INPUT_ITER,
class ALLOCATOR>
247 stack(INPUT_ITER first,
249 const ALLOCATOR& allocator,
251 ALLOCATOR>::type * = 0);
260 template <
class t_RANGE>
263 template <
class t_RANGE,
class t_ALLOCATOR>
267 const t_ALLOCATOR& allocator,
269 t_ALLOCATOR>::type * = 0);
286#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
289#ifndef BSLSTL_STACK_VARIADIC_LIMIT
290#define BSLSTL_STACK_VARIADIC_LIMIT 10
292#ifndef BSLSTL_STACK_VARIADIC_LIMIT_A
293#define BSLSTL_STACK_VARIADIC_LIMIT_A BSLSTL_STACK_VARIADIC_LIMIT
295#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 0
299#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 1
300 template <
class Args_01>
304#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 2
305 template <
class Args_01,
311#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 3
312 template <
class Args_01,
320#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 4
321 template <
class Args_01,
331#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 5
332 template <
class Args_01,
344#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 6
345 template <
class Args_01,
359#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 7
360 template <
class Args_01,
376#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 8
377 template <
class Args_01,
395#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 9
396 template <
class Args_01,
416#if BSLSTL_STACK_VARIADIC_LIMIT_A >= 10
417 template <
class Args_01,
442 template <
class... Args>
460 void push(BloombergLP::bslmf::MovableRef<value_type> value);
467 template <
class t_RANGE>
474 bsl::is_nothrow_swappable<CONTAINER>::value);
497#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
504template<
class CONTAINER,
505 class = bsl::enable_if_t<!bsl::IsStdAllocator_v<CONTAINER>>
507stack(CONTAINER) -> stack<typename CONTAINER::value_type, CONTAINER>;
516 class = bsl::enable_if_t<bsl::uses_allocator_v<CONTAINER, ALLOCATOR>>
518stack(CONTAINER, ALLOCATOR) -> stack<typename CONTAINER::value_type, CONTAINER>;
522template <
class INPUT_ITER,
523 class TYPE = BloombergLP::bslstl::IteratorUtil::
524 IterVal_t<INPUT_ITER>>
525stack(INPUT_ITER, INPUT_ITER) -> stack<TYPE>;
531template <
class INPUT_ITER,
533 class TYPE = BloombergLP::bslstl::IteratorUtil::
534 IterVal_t<INPUT_ITER>,
535 class = enable_if_t<IsStdAllocator_v<ALLOCATOR>>>
536stack(INPUT_ITER, INPUT_ITER, ALLOCATOR)-> stack<TYPE, deque<TYPE, ALLOCATOR>>;
538#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
541template <ranges::input_range t_RANGE>
542stack(from_range_t, t_RANGE&&) -> stack<ranges::range_value_t<t_RANGE>>;
548template <ranges::input_range t_RANGE,
550 class t_TYPE = ranges::range_value_t<t_RANGE>>
551requires IsStdAllocator_v<t_ALLOCATOR>
552stack(from_range_t, t_RANGE&&, t_ALLOCATOR)
553-> stack<t_TYPE, deque<t_TYPE, t_ALLOCATOR>>;
566template <
class VALUE,
class CONTAINER>
568 const stack<VALUE, CONTAINER>&
rhs);
578template <
class VALUE,
class CONTAINER>
580 const stack<VALUE, CONTAINER>&
rhs);
593template <
class VALUE,
class CONTAINER>
594bool operator< (
const stack<VALUE, CONTAINER>&
lhs,
595 const stack<VALUE, CONTAINER>&
rhs);
605template <
class VALUE,
class CONTAINER>
606bool operator> (
const stack<VALUE, CONTAINER>&
lhs,
607 const stack<VALUE, CONTAINER>&
rhs);
617template <
class VALUE,
class CONTAINER>
619 const stack<VALUE, CONTAINER>&
rhs);
629template <
class VALUE,
class CONTAINER>
631 const stack<VALUE, CONTAINER>&
rhs);
637template <
class VALUE,
class CONTAINER>
638void swap(stack<VALUE, CONTAINER>&
lhs,
639 stack<VALUE, CONTAINER>&
rhs)
651template <
class VALUE,
class CONTAINER>
658template <
class VALUE,
class CONTAINER>
660stack<VALUE, CONTAINER>::stack(
const CONTAINER& container)
665template <
class VALUE,
class CONTAINER>
667stack<VALUE, CONTAINER>::stack(BloombergLP::bslmf::MovableRef<stack> original)
668: c(MoveUtil::move(MoveUtil::access(original).c))
672template <
class VALUE,
class CONTAINER>
673template <
class ALLOCATOR>
675stack<VALUE, CONTAINER>::stack(
const ALLOCATOR& basicAllocator,
682template <
class VALUE,
class CONTAINER>
683template <
class ALLOCATOR>
685stack<VALUE, CONTAINER>::stack(
686 const CONTAINER& container,
687 const ALLOCATOR& basicAllocator,
690: c(container, basicAllocator)
694template <
class VALUE,
class CONTAINER>
696stack<VALUE, CONTAINER>::stack(
const stack& original)
701template <
class VALUE,
class CONTAINER>
702template <
class ALLOCATOR>
704stack<VALUE, CONTAINER>::stack(
705 const stack& original,
706 const ALLOCATOR& basicAllocator,
709: c(original.c, basicAllocator)
713template <
class VALUE,
class CONTAINER>
715stack<VALUE, CONTAINER>::stack(BloombergLP::bslmf::MovableRef<CONTAINER>
717: c(MoveUtil::move(container))
721template <
class VALUE,
class CONTAINER>
722template <
class ALLOCATOR>
724stack<VALUE, CONTAINER>::stack(
725 BloombergLP::bslmf::MovableRef<CONTAINER> container,
726 const ALLOCATOR& basicAllocator,
729: c(MoveUtil::move(container), basicAllocator)
733template <
class VALUE,
class CONTAINER>
734template <
class ALLOCATOR>
736stack<VALUE, CONTAINER>::stack(
737 BloombergLP::bslmf::MovableRef<stack> original,
738 const ALLOCATOR& basicAllocator,
741: c(MoveUtil::move(MoveUtil::access(original).c), basicAllocator)
745template <
class VALUE,
class CONTAINER>
746template <
class INPUT_ITER>
748stack<VALUE, CONTAINER>::stack(INPUT_ITER first, INPUT_ITER last)
753template <
class VALUE,
class CONTAINER>
754template <
class INPUT_ITER,
class ALLOCATOR>
756stack<VALUE, CONTAINER>::stack(
759 const ALLOCATOR& allocator,
762: c(first, last, allocator)
766template <
class VALUE,
class CONTAINER>
767template <
class t_RANGE>
770stack<VALUE, CONTAINER>::stack(
773#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_TO_CONTAINER
774: c(ranges::to<CONTAINER>(std::forward<t_RANGE>(range)))
781template <
class VALUE,
class CONTAINER>
782template <
class t_RANGE,
class t_ALLOCATOR>
785stack<VALUE, CONTAINER>::stack(
788 const t_ALLOCATOR& allocator,
791 t_ALLOCATOR>::type *)
792#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_TO_CONTAINER
793: c(ranges::to<CONTAINER>(std::forward<t_RANGE>(range), allocator))
801template <
class VALUE,
class CONTAINER>
802template <
class INPUT_ITER,
class SENTINEL>
804void stack<VALUE, CONTAINER>::privatePushRange(INPUT_ITER first,
807 while (first != last) {
814template <
class VALUE,
class CONTAINER>
816stack<VALUE, CONTAINER>& stack<VALUE, CONTAINER>::operator=(
const stack& rhs)
823template <
class VALUE,
class CONTAINER>
825stack<VALUE, CONTAINER>& stack<VALUE, CONTAINER>::operator=(
826 BloombergLP::bslmf::MovableRef<stack> rhs)
829 c = MoveUtil::move(MoveUtil::access(rhs).c);
833#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
836#ifndef BSLSTL_STACK_VARIADIC_LIMIT
837#define BSLSTL_STACK_VARIADIC_LIMIT 10
839#ifndef BSLSTL_STACK_VARIADIC_LIMIT_B
840#define BSLSTL_STACK_VARIADIC_LIMIT_B BSLSTL_STACK_VARIADIC_LIMIT
842#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 0
843template <
class VALUE,
class CONTAINER>
845typename stack<VALUE, CONTAINER>::reference
846stack<VALUE, CONTAINER>::emplace(
854#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 1
855template <
class VALUE,
class CONTAINER>
856template <
class Args_01>
858typename stack<VALUE, CONTAINER>::reference
859stack<VALUE, CONTAINER>::emplace(
867#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 2
868template <
class VALUE,
class CONTAINER>
869template <
class Args_01,
872typename stack<VALUE, CONTAINER>::reference
873stack<VALUE, CONTAINER>::emplace(
883#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 3
884template <
class VALUE,
class CONTAINER>
885template <
class Args_01,
889typename stack<VALUE, CONTAINER>::reference
890stack<VALUE, CONTAINER>::emplace(
902#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 4
903template <
class VALUE,
class CONTAINER>
904template <
class Args_01,
909typename stack<VALUE, CONTAINER>::reference
910stack<VALUE, CONTAINER>::emplace(
924#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 5
925template <
class VALUE,
class CONTAINER>
926template <
class Args_01,
932typename stack<VALUE, CONTAINER>::reference
933stack<VALUE, CONTAINER>::emplace(
949#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 6
950template <
class VALUE,
class CONTAINER>
951template <
class Args_01,
958typename stack<VALUE, CONTAINER>::reference
959stack<VALUE, CONTAINER>::emplace(
977#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 7
978template <
class VALUE,
class CONTAINER>
979template <
class Args_01,
987typename stack<VALUE, CONTAINER>::reference
988stack<VALUE, CONTAINER>::emplace(
1008#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 8
1009template <
class VALUE,
class CONTAINER>
1010template <
class Args_01,
1019typename stack<VALUE, CONTAINER>::reference
1020stack<VALUE, CONTAINER>::emplace(
1042#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 9
1043template <
class VALUE,
class CONTAINER>
1044template <
class Args_01,
1054typename stack<VALUE, CONTAINER>::reference
1055stack<VALUE, CONTAINER>::emplace(
1079#if BSLSTL_STACK_VARIADIC_LIMIT_B >= 10
1080template <
class VALUE,
class CONTAINER>
1081template <
class Args_01,
1092typename stack<VALUE, CONTAINER>::reference
1093stack<VALUE, CONTAINER>::emplace(
1122template <
class VALUE,
class CONTAINER>
1123template <
class... Args>
1125typename stack<VALUE, CONTAINER>::reference
1126stack<VALUE, CONTAINER>::emplace(
1135template <
class VALUE,
class CONTAINER>
1137void stack<VALUE, CONTAINER>::pop()
1144template <
class VALUE,
class CONTAINER>
1146void stack<VALUE, CONTAINER>::push(
const value_type& value)
1151template <
class VALUE,
class CONTAINER>
1153void stack<VALUE, CONTAINER>::push(BloombergLP::bslmf::MovableRef<value_type>
1156 c.push_back(MoveUtil::move(value));
1159template <
class VALUE,
class CONTAINER>
1160template <
class t_RANGE>
1162void stack<VALUE, CONTAINER>::push_range(
1165#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1166 if constexpr (
requires{ c.append_range(std::forward<t_RANGE>(range)); }) {
1167 c.append_range(std::forward<t_RANGE>(range));
1170 ranges::copy(range, back_inserter(c));
1177template <
class VALUE,
class CONTAINER>
1179void stack<VALUE, CONTAINER>::swap(stack& other)
1181 bsl::is_nothrow_swappable<CONTAINER>::value)
1183 BloombergLP::bslalg::SwapUtil::swap(&c, &other.c);
1186template <
class VALUE,
class CONTAINER>
1188typename CONTAINER::reference stack<VALUE, CONTAINER>::top()
1196template <
class VALUE,
class CONTAINER>
1198bool stack<VALUE, CONTAINER>::empty()
const
1200 return 0 == c.size();
1203template <
class VALUE,
class CONTAINER>
1205typename CONTAINER::size_type stack<VALUE, CONTAINER>::size()
const
1210template <
class VALUE,
class CONTAINER>
1212typename CONTAINER::const_reference stack<VALUE, CONTAINER>::top()
const
1218template <
class VALUE,
class CONTAINER>
1220bool operator==(
const stack<VALUE, CONTAINER>& lhs,
1221 const stack<VALUE, CONTAINER>& rhs)
1226template <
class VALUE,
class CONTAINER>
1228bool operator!=(
const stack<VALUE, CONTAINER>& lhs,
1229 const stack<VALUE, CONTAINER>& rhs)
1234template <
class VALUE,
class CONTAINER>
1236bool operator< (
const stack<VALUE, CONTAINER>& lhs,
1237 const stack<VALUE, CONTAINER>& rhs)
1242template <
class VALUE,
class CONTAINER>
1244bool operator> (
const stack<VALUE, CONTAINER>& lhs,
1245 const stack<VALUE, CONTAINER>& rhs)
1250template <
class VALUE,
class CONTAINER>
1252bool operator<=(
const stack<VALUE, CONTAINER>& lhs,
1253 const stack<VALUE, CONTAINER>& rhs)
1258template <
class VALUE,
class CONTAINER>
1260bool operator>=(
const stack<VALUE, CONTAINER>& lhs,
1261 const stack<VALUE, CONTAINER>& rhs)
1266#if defined BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON \
1267 && defined BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1268template <
class VALUE, three_way_comparable CONTAINER>
1269inline compare_three_way_result_t<CONTAINER>
1270operator<=>(
const stack<VALUE, CONTAINER>& lhs,
1271 const stack<VALUE, CONTAINER>& rhs)
1278template <
class VALUE,
class CONTAINER>
1280void swap(stack<VALUE, CONTAINER>& lhs,
1281 stack<VALUE, CONTAINER>& rhs)
1290# error Not valid except when included from bslstl_stack.h
#define BSLMF_NESTED_TRAIT_DECLARATION_IF(t_TYPE, t_TRAIT, t_COND)
Definition bslmf_nestedtraitdeclaration.h:243
CONTAINER::reference reference
Definition bslstl_stack.h:436
CONTAINER::size_type size_type
Definition bslstl_stack.h:438
friend bool operator>(const stack< VAL, CONT > &, const stack< VAL, CONT > &)
stack()
Definition bslstl_stack.h:829
friend bool operator<(const stack< VAL, CONT > &, const stack< VAL, CONT > &)
CONTAINER container_type
Definition bslstl_stack.h:439
friend bool operator!=(const stack< VAL, CONT > &, const stack< VAL, CONT > &)
void push_range(BSLS_COMPILERFEATURES_FORWARD_REF(t_RANGE) range)
Definition bslstl_stack.h:1048
friend bool operator>=(const stack< VAL, CONT > &, const stack< VAL, CONT > &)
bool empty() const
Definition bslstl_stack.h:1084
friend bool operator==(const stack< VAL, CONT > &, const stack< VAL, CONT > &)
void pop()
Definition bslstl_stack.h:1023
void push(const value_type &value)
Push the specified value onto the top of this stack.
Definition bslstl_stack.h:1032
void swap(stack &other) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(bsl reference top()
Definition bslstl_stack.h:655
stack & operator=(const stack &rhs)
Definition bslstl_stack.h:992
friend bool operator<=(const stack< VAL, CONT > &, const stack< VAL, CONT > &)
size_type size() const
Return the number of elements contained in this stack.
Definition bslstl_stack.h:1091
CONTAINER::value_type value_type
Definition bslstl_stack.h:435
CONTAINER::const_reference const_reference
Definition bslstl_stack.h:437
container_type c
Definition bslstl_stack.h:444
reference emplace(Args &&... args)
Definition bslstl_stack.h:1014
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
static const t_TYPE value
Definition bslmf_integralconstant.h:267
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#define BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(...)
Definition bsls_keyword.h:676
#define BSLSTL_STACK_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
Definition bslstl_stack.h:376
bool operator!=(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator==(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
void swap(OptionValue &a, OptionValue &b)
bool operator>=(const Guid &lhs, const Guid &rhs)
bool operator<=(const Guid &lhs, const Guid &rhs)
Definition bdlat_valuetypefunctions.h:939
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
T::iterator begin(T &container)
Definition bslstl_iterator.h:1593
const from_range_t from_range
ALLOCATOR & lhs
Definition bslstl_string.h:3917
T::iterator end(T &container)
Definition bslstl_iterator.h:1621
BSLS_KEYWORD_CONSTEXPR bool empty(const CONTAINER &container)
Definition bslstl_iterator.h:1377
Definition bslmf_usesallocator.h:165