8#ifndef INCLUDED_BSLSTL_STACK
9#define INCLUDED_BSLSTL_STACK
343#include <bslscm_version.h>
372#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
373# define BSLSTL_STACK_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T) \
374 requires ::BloombergLP::bslmf::ContainerCompatibleRange<R, T>
376# define BSLSTL_STACK_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
379#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
385# define COMPILING_BSLSTL_STACK_H
387# undef COMPILING_BSLSTL_STACK_H
411template <
class VALUE,
class CONTAINER = deque<VALUE> >
414#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
424 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
430 template <
class INPUT_ITER,
class SENTINEL>
431 void privatePushRange(INPUT_ITER first, SENTINEL last);
449 template <
class VAL,
class CONT>
451 template <
class VAL,
class CONT>
453 template <
class VAL,
class CONT>
455 template <
class VAL,
class CONT>
457 template <
class VAL,
class CONT>
459 template <
class VAL,
class CONT>
461#if defined BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON \
462 && defined BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
463 template <
class VAL, three_way_comparable CONT>
464 friend compare_three_way_result_t<CONT>
472 BloombergLP::bslma::UsesBslmaAllocator,
473 BloombergLP::bslma::UsesBslmaAllocator<container_type>::value);
490 stack(BloombergLP::bslmf::MovableRef<stack> original);
504 stack(BloombergLP::bslmf::MovableRef<CONTAINER> container);
509 template <
class ALLOCATOR>
511 stack(
const ALLOCATOR& basicAllocator,
513 ALLOCATOR>::type * = 0);
519 template <
class ALLOCATOR>
521 const ALLOCATOR& basicAllocator,
523 ALLOCATOR>::type * = 0);
529 template <
class ALLOCATOR>
531 const ALLOCATOR& basicAllocator,
533 ALLOCATOR>::type * = 0);
544 template <
class ALLOCATOR>
545 stack(BloombergLP::bslmf::MovableRef<CONTAINER> container,
546 const ALLOCATOR& basicAllocator,
548 ALLOCATOR>::type * = 0);
560 template <
class ALLOCATOR>
561 stack(BloombergLP::bslmf::MovableRef<stack> original,
562 const ALLOCATOR& basicAllocator,
564 ALLOCATOR>::type * = 0);
571 template <
class INPUT_ITER>
572 stack(INPUT_ITER first, INPUT_ITER last);
573 template <
class INPUT_ITER,
class ALLOCATOR>
578 ALLOCATOR>::type * = 0);
587 template <
class t_RANGE>
590 template <class t_RANGE, class t_ALLOCATOR>
596 t_ALLOCATOR>::type * = 0);
613#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
619 template <
class... Args>
636 void push(BloombergLP::bslmf::MovableRef<value_type> value);
643 template <
class t_RANGE>
650 bsl::is_nothrow_swappable<CONTAINER>::value);
673#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
680template<
class CONTAINER,
681 class = bsl::enable_if_t<!bsl::IsStdAllocator_v<CONTAINER>>
692 class = bsl::enable_if_t<bsl::uses_allocator_v<CONTAINER, ALLOCATOR>>
698template <
class INPUT_ITER,
699 class TYPE = BloombergLP::bslstl::IteratorUtil::
700 IterVal_t<INPUT_ITER>>
707template <
class INPUT_ITER,
709 class TYPE = BloombergLP::bslstl::IteratorUtil::
710 IterVal_t<INPUT_ITER>,
711 class = enable_if_t<IsStdAllocator_v<ALLOCATOR>>>
714#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
717template <ranges::input_range t_RANGE>
724template <ranges::input_range t_RANGE,
726 class t_TYPE = ranges::range_value_t<t_RANGE>>
727requires IsStdAllocator_v<t_ALLOCATOR>
742template <
class VALUE,
class CONTAINER>
754template <
class VALUE,
class CONTAINER>
769template <
class VALUE,
class CONTAINER>
781template <
class VALUE,
class CONTAINER>
793template <
class VALUE,
class CONTAINER>
805template <
class VALUE,
class CONTAINER>
813template <
class VALUE,
class CONTAINER>
827template <
class VALUE,
class CONTAINER>
834template <
class VALUE,
class CONTAINER>
841template <
class VALUE,
class CONTAINER>
844: c(MoveUtil::move(MoveUtil::access(original).c))
848template <
class VALUE,
class CONTAINER>
849template <
class ALLOCATOR>
858template <
class VALUE,
class CONTAINER>
859template <
class ALLOCATOR>
862 const CONTAINER& container,
863 const ALLOCATOR& basicAllocator,
866: c(container, basicAllocator)
870template <
class VALUE,
class CONTAINER>
877template <
class VALUE,
class CONTAINER>
878template <
class ALLOCATOR>
881 const stack& original,
882 const ALLOCATOR& basicAllocator,
885: c(original.c, basicAllocator)
889template <
class VALUE,
class CONTAINER>
893: c(MoveUtil::move(container))
897template <
class VALUE,
class CONTAINER>
898template <
class ALLOCATOR>
901 BloombergLP::bslmf::MovableRef<CONTAINER> container,
902 const ALLOCATOR& basicAllocator,
905: c(MoveUtil::move(container), basicAllocator)
909template <
class VALUE,
class CONTAINER>
910template <
class ALLOCATOR>
913 BloombergLP::bslmf::MovableRef<stack> original,
914 const ALLOCATOR& basicAllocator,
917: c(MoveUtil::move(MoveUtil::access(original).c), basicAllocator)
921template <
class VALUE,
class CONTAINER>
922template <
class INPUT_ITER>
929template <
class VALUE,
class CONTAINER>
930template <
class INPUT_ITER,
class ALLOCATOR>
942template <
class VALUE,
class CONTAINER>
943template <
class t_RANGE>
949#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_TO_CONTAINER
950: c(ranges::to<CONTAINER>(std::forward<t_RANGE>(range)))
957template <
class VALUE,
class CONTAINER>
958template <
class t_RANGE,
class t_ALLOCATOR>
967 t_ALLOCATOR>::type *)
968#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_TO_CONTAINER
969: c(ranges::to<CONTAINER>(std::forward<t_RANGE>(range),
allocator))
977template <
class VALUE,
class CONTAINER>
978template <
class INPUT_ITER,
class SENTINEL>
983 while (first != last) {
990template <
class VALUE,
class CONTAINER>
999template <
class VALUE,
class CONTAINER>
1002 BloombergLP::bslmf::MovableRef<stack>
rhs)
1005 c = MoveUtil::move(MoveUtil::access(
rhs).c);
1009#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
1010template <
class VALUE,
class CONTAINER>
1011template <
class... Args>
1021template <
class VALUE,
class CONTAINER>
1030template <
class VALUE,
class CONTAINER>
1037template <
class VALUE,
class CONTAINER>
1042 c.push_back(MoveUtil::move(value));
1045template <
class VALUE,
class CONTAINER>
1046template <
class t_RANGE>
1048void
stack<VALUE, CONTAINER>::push_range(
1051#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1052 if constexpr (
requires{ c.append_range(std::forward<t_RANGE>(range)); }) {
1053 c.append_range(std::forward<t_RANGE>(range));
1056 ranges::copy(range, back_inserter(c));
1063template <
class VALUE,
class CONTAINER>
1067 bsl::is_nothrow_swappable<CONTAINER>::value)
1069 BloombergLP::bslalg::SwapUtil::swap(&c, &other.c);
1072template <
class VALUE,
class CONTAINER>
1082template <
class VALUE,
class CONTAINER>
1086 return 0 == c.size();
1089template <
class VALUE,
class CONTAINER>
1096template <
class VALUE,
class CONTAINER>
1104template <
class VALUE,
class CONTAINER>
1112template <
class VALUE,
class CONTAINER>
1120template <
class VALUE,
class CONTAINER>
1128template <
class VALUE,
class CONTAINER>
1136template <
class VALUE,
class CONTAINER>
1144template <
class VALUE,
class CONTAINER>
1152#if defined BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON \
1153 && defined BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1154template <
class VALUE, three_way_comparable CONTAINER>
1155inline compare_three_way_result_t<CONTAINER>
1156operator<=>(
const stack<VALUE, CONTAINER>&
lhs,
1157 const stack<VALUE, CONTAINER>&
rhs)
1164template <
class VALUE,
class CONTAINER>
1177#undef BSLSTL_STACK_REQUIRES_CONTAINER_COMPATIBLE_RANGE
Definition bslma_bslallocator.h:588
Definition bslstl_stack.h:412
CONTAINER::reference reference
Definition bslstl_stack.h:436
stack(BloombergLP::bslmf::MovableRef< stack > original, const ALLOCATOR &basicAllocator, typename enable_if< bsl::uses_allocator< CONTAINER, ALLOCATOR >::value, ALLOCATOR >::type *=0)
Definition bslstl_stack.h:912
stack(INPUT_ITER first, INPUT_ITER last)
Definition bslstl_stack.h:924
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 > &)
stack(const stack &original)
Definition bslstl_stack.h:872
stack(BloombergLP::bslmf::MovableRef< stack > original)
Definition bslstl_stack.h:843
void push_range(BSLS_COMPILERFEATURES_FORWARD_REF(t_RANGE) range)
Definition bslstl_stack.h:1048
void push(BloombergLP::bslmf::MovableRef< value_type > value)
Definition bslstl_stack.h:1039
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
stack(BloombergLP::bslmf::MovableRef< CONTAINER > container)
Definition bslstl_stack.h:891
void push(const value_type &value)
Push the specified value onto the top of this stack.
Definition bslstl_stack.h:1032
stack(const stack &original, const ALLOCATOR &basicAllocator, typename enable_if< bsl::uses_allocator< CONTAINER, ALLOCATOR >::value, ALLOCATOR >::type *=0)
Definition bslstl_stack.h:880
void swap(stack &other) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(bsl reference top()
Definition bslstl_stack.h:655
BSLMF_NESTED_TRAIT_DECLARATION_IF(stack, BloombergLP::bslma::UsesBslmaAllocator, BloombergLP::bslma::UsesBslmaAllocator< container_type >::value)
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
stack(BloombergLP::bslmf::MovableRef< CONTAINER > container, const ALLOCATOR &basicAllocator, typename enable_if< bsl::uses_allocator< CONTAINER, ALLOCATOR >::value, ALLOCATOR >::type *=0)
Definition bslstl_stack.h:900
stack(const ALLOCATOR &basicAllocator, typename enable_if< bsl::uses_allocator< CONTAINER, ALLOCATOR >::value, ALLOCATOR >::type *=0)
Definition bslstl_stack.h:851
CONTAINER::const_reference const_reference
Definition bslstl_stack.h:437
container_type c
Definition bslstl_stack.h:444
stack(const CONTAINER &container, const ALLOCATOR &basicAllocator, typename enable_if< bsl::uses_allocator< CONTAINER, ALLOCATOR >::value, ALLOCATOR >::type *=0)
Definition bslstl_stack.h:861
stack(INPUT_ITER first, INPUT_ITER last, const ALLOCATOR &allocator, typename enable_if< bsl::uses_allocator< CONTAINER, ALLOCATOR >::value, ALLOCATOR >::type *=0)
Definition bslstl_stack.h:932
stack(const CONTAINER &container)
Definition bslstl_stack.h:836
reference emplace(Args &&... args)
Definition bslstl_stack.h:1014
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#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_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(...)
Definition bsls_keyword.h:676
#define BSLSTL_STACK_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
Definition bslstl_stack.h:376
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 bdlbb_blob.h:579
Definition bslmf_enableif.h:530
Definition bslstl_ranges.h:301
Definition bslmf_issame.h:146
Definition bslmf_usesallocator.h:165