8#ifndef INCLUDED_BDLCC_DEQUE
9#define INCLUDED_BDLCC_DEQUE
498#include <bdlscm_version.h>
516#include <bsl_algorithm.h>
517#include <bsl_deque.h>
518#include <bsl_vector.h>
519#include <bsl_limits.h>
520#include <bsl_cstddef.h>
521#include <bsl_cstdio.h>
545 template <
class VECTOR>
546 class VectorThrowGuard;
548 template <
class VECTOR>
597 template <
class VECTOR>
598 void removeAllImp(VECTOR *buffer = 0);
610 template <
class VECTOR>
611 void tryPopBackImp(
size_type maxNumItems,
623 template <
class VECTOR>
624 void tryPopFrontImp(
size_type maxNumItems,
673 template <
class INPUT_ITER>
674 Deque(INPUT_ITER begin,
677 template <
class INPUT_ITER>
678 Deque(INPUT_ITER begin,
698 template <
class INPUT_ITER>
699 Deque(INPUT_ITER begin,
703 template <
class INPUT_ITER>
704 Deque(INPUT_ITER begin,
744 template <
class INPUT_ITER>
770 template <
class INPUT_ITER>
822 void removeAll(std::vector<TYPE> *buffer);
823#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
824 void removeAll(std::pmr::vector<TYPE> *buffer);
934 std::vector<TYPE> *buffer);
935#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
937 std::pmr::vector<TYPE> *buffer);
962 std::vector<TYPE> *buffer);
963#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
965 std::pmr::vector<TYPE> *buffer);
989 template <
class INPUT_ITER>
1015 template <
class INPUT_ITER>
1052template <
class TYPE>
1062 const MDCIter d_mdBegin;
1063 const MDCIter d_mdEnd;
1064 const bool d_mdWasEmpty;
1100template <
class TYPE>
1101template <
class VECTOR>
1102class Deque<TYPE>::VectorThrowGuard {
1105 typedef typename VECTOR::size_type VSize;
1109 const VSize d_vSize;
1113 VectorThrowGuard(
const VectorThrowGuard&);
1114 VectorThrowGuard& operator=(
const VectorThrowGuard&);
1124 VectorThrowGuard(VECTOR *vector_p);
1128 ~VectorThrowGuard();
1139template <
class TYPE>
1140template <
class VECTOR>
1141struct Deque<TYPE>::IsVector {
1143 static const bool value =
1145#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
1158template <
class TYPE>
1167 size_type d_startLength;
1228 bool isNull()
const;
1237template <
class TYPE>
1246 size_type d_startLength;
1304 const TYPE& operator[](size_type position)
const;
1308 bool isNull()
const;
1320template <
class TYPE>
1327 this->
load(container);
1331template <
class TYPE>
1339template <
class TYPE>
1345 if (0 != d_container_p) {
1349 container->d_mutex.
lock();
1350 d_container_p = container;
1351 d_startLength = d_container_p->d_monoDeque.
size();
1354template <
class TYPE>
1357 if (0 == d_container_p) {
1361 const size_type sz = d_container_p->d_monoDeque.size();
1362 size_type ii = d_startLength;
1364 d_container_p->d_mutex.unlock();
1368 d_container_p->d_notEmptyCondition.signal();
1369 }
while (++ii < sz);
1372 if (d_container_p->d_highWaterMark < ii) {
1373 ii = d_container_p->d_highWaterMark;
1375 for (; ii > sz; --ii) {
1376 d_container_p->d_notFullCondition.signal();
1384template <
class TYPE>
1390 return &d_container_p->d_monoDeque;
1393template <
class TYPE>
1399 return d_container_p->d_monoDeque;
1402template <
class TYPE>
1408 return d_container_p->d_monoDeque[position];
1411template <
class TYPE>
1415 return 0 == d_container_p;
1424template <
class TYPE>
1431 this->
load(container);
1435template <
class TYPE>
1443template <
class TYPE>
1451 container->d_mutex.
lock();
1452 d_container_p = container;
1453 d_startLength = d_container_p->d_monoDeque.
size();
1456template <
class TYPE>
1466 if (0 == d_container_p) {
1471 "Underlying 'bsl::deque' modified through ConstProcter.");
1479template <
class TYPE>
1485 return &d_container_p->d_monoDeque;
1488template <
class TYPE>
1494 return d_container_p->d_monoDeque;
1497template <
class TYPE>
1503 return d_container_p->d_monoDeque[position];
1506template <
class TYPE>
1510 return 0 == d_container_p;
1518template <
class TYPE>
1521: d_monoDeque_p(monoDeque_p)
1522, d_mdBegin( monoDeque_p->cbegin())
1523, d_mdEnd( monoDeque_p->cend())
1524, d_mdWasEmpty(monoDeque_p->empty())
1529template <
class TYPE>
1533 if (d_monoDeque_p) {
1542 d_monoDeque_p->clear();
1547 const MDCIter newBegin = d_monoDeque_p->cbegin();
1548 const MDCIter newEnd = d_monoDeque_p->cend();
1558 if (newBegin < d_mdBegin) {
1561 d_monoDeque_p->erase(newBegin, d_mdBegin);
1566 if (d_mdEnd < newEnd) {
1567 d_monoDeque_p->erase(d_mdEnd, newEnd);
1577template <
class TYPE>
1589template <
class TYPE>
1590template <
class VECTOR>
1593: d_vector_p(vector_p)
1594, d_vSize(vector_p ? vector_p->size() : 0)
1598template <
class TYPE>
1599template <
class VECTOR>
1604 const VSize newSize = d_vector_p->size();
1612 if (d_vSize < newSize) {
1613 d_vector_p->resize(d_vSize);
1622template <
class TYPE>
1623template <
class VECTOR>
1625void Deque<TYPE>::VectorThrowGuard<VECTOR>::release()
1635template <
class TYPE>
1636template <
class VECTOR>
1638void Deque<TYPE>::removeAllImp(VECTOR *buffer)
1642 Proctor proctor(
this);
1644 VectorThrowGuard<VECTOR> tg(buffer);
1648 buffer->reserve(buffer->size() + size);
1661template <
class TYPE>
1662template <
class VECTOR>
1669 VectorThrowGuard<VECTOR> tg(buffer);
1675 const size_type toMove = bsl::min(size, maxNumItems);
1678 buffer->reserve(buffer->size() + toMove);
1680 const size_type lastMovedIdx = size - toMove;
1681 for (
size_type ii = size; lastMovedIdx < ii--; ) {
1685 d_monoDeque.
erase(d_monoDeque.
end() - toMove, d_monoDeque.
end());
1692template <
class TYPE>
1693template <
class VECTOR>
1702 VectorThrowGuard<VECTOR> tg(buffer);
1707 const size_type toMove = bsl::min(d_monoDeque.
size(), maxNumItems);
1708 const Iterator beginRange = d_monoDeque.
begin();
1709 const Iterator endRange = beginRange + toMove;
1712 buffer->reserve(buffer->size() + toMove);
1714 for (
size_type ii = 0; ii < toMove; ++ii) {
1718 proctor->
erase(beginRange, endRange);
1726template <
class TYPE>
1730 return bsl::numeric_limits<size_type>::max();
1734template <
class TYPE>
1738, d_notEmptyCondition()
1739, d_notFullCondition()
1740, d_monoDeque(basicAllocator)
1742, d_clockType(
bsls::SystemClockType::e_REALTIME)
1746template <
class TYPE>
1751, d_notEmptyCondition(clockType)
1752, d_notFullCondition(clockType)
1753, d_monoDeque(basicAllocator)
1754, d_highWaterMark(maxSizeT())
1755, d_clockType(clockType)
1759template <
class TYPE>
1764, d_notEmptyCondition()
1765, d_notFullCondition()
1766, d_monoDeque(basicAllocator)
1767, d_highWaterMark(highWaterMark)
1768, d_clockType(
bsls::SystemClockType::e_REALTIME)
1773template <
class TYPE>
1779, d_notEmptyCondition(clockType)
1780, d_notFullCondition(clockType)
1781, d_monoDeque(basicAllocator)
1782, d_highWaterMark(highWaterMark)
1783, d_clockType(clockType)
1788template <
class TYPE>
1789template <
class INPUT_ITER>
1795, d_notEmptyCondition()
1796, d_notFullCondition()
1797, d_monoDeque(begin, end, basicAllocator)
1798, d_highWaterMark(maxSizeT())
1799, d_clockType(
bsls::SystemClockType::e_REALTIME)
1803template <
class TYPE>
1804template <
class INPUT_ITER>
1811, d_notEmptyCondition(clockType)
1812, d_notFullCondition(clockType)
1813, d_monoDeque(begin, end, basicAllocator)
1814, d_highWaterMark(maxSizeT())
1815, d_clockType(clockType)
1819template <
class TYPE>
1820template <
class INPUT_ITER>
1824 bsl::size_t highWaterMark,
1827, d_notEmptyCondition()
1828, d_notFullCondition()
1829, d_monoDeque(begin, end, basicAllocator)
1830, d_highWaterMark(highWaterMark)
1831, d_clockType(
bsls::SystemClockType::e_REALTIME)
1836template <
class TYPE>
1837template <
class INPUT_ITER>
1841 bsl::size_t highWaterMark,
1845, d_notEmptyCondition(clockType)
1846, d_notFullCondition(clockType)
1847, d_monoDeque(begin, end, basicAllocator)
1848, d_highWaterMark(highWaterMark)
1849, d_clockType(clockType)
1854template <
class TYPE>
1859, d_notEmptyCondition()
1860, d_notFullCondition()
1861, d_monoDeque(basicAllocator)
1862, d_highWaterMark(maxSizeT())
1863, d_clockType(original.d_clockType)
1870template <
class TYPE>
1877template <
class TYPE>
1884 d_monoDeque.push_back(item);
1887 d_notEmptyCondition.signal();
1890template <
class TYPE>
1900 d_notEmptyCondition.signal();
1903template <
class TYPE>
1904template <
class INPUT_ITER>
1915 const size_type initialSize = d_monoDeque.size();
1916 d_monoDeque.insert(d_monoDeque.end(), begin, end);
1917 growth = d_monoDeque.size() - initialSize;
1922 for (; growth > 0; --growth) {
1923 d_notEmptyCondition.signal();
1927template <
class TYPE>
1934 d_monoDeque.push_front(item);
1937 d_notEmptyCondition.signal();
1940template <
class TYPE>
1950 d_notEmptyCondition.signal();
1953template <
class TYPE>
1954template <
class INPUT_ITER>
1965 const size_type initialSize = d_monoDeque.size();
1966 for (; end != begin; ++begin) {
1967 d_monoDeque.push_front(*begin);
1969 growth = d_monoDeque.size() - initialSize;
1974 for (; growth > 0; --growth) {
1975 d_notEmptyCondition.signal();
1979template <
class TYPE>
1984 while (d_monoDeque.empty()) {
1985 d_notEmptyCondition.wait(&d_mutex);
1988 d_monoDeque.pop_back();
1990 const bool shouldSignal = d_monoDeque.size() < d_highWaterMark;
1994 d_notFullCondition.signal();
2000template <
class TYPE>
2008 while (d_monoDeque.empty()) {
2009 d_notEmptyCondition.wait(&d_mutex);
2012#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
2015 *item = d_monoDeque.back();
2017 d_monoDeque.pop_back();
2018 shouldSignal = d_monoDeque.size() < d_highWaterMark;
2022 d_notFullCondition.signal();
2026template <
class TYPE>
2031 while (d_monoDeque.empty()) {
2032 d_notEmptyCondition.wait(&d_mutex);
2035 d_monoDeque.pop_front();
2037 const bool shouldSignal = d_monoDeque.size() < d_highWaterMark;
2041 d_notFullCondition.signal();
2047template <
class TYPE>
2054 while (d_monoDeque.empty()) {
2055 d_notEmptyCondition.wait(&d_mutex);
2057#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
2060 *item = d_monoDeque.front();
2062 d_monoDeque.pop_front();
2064 shouldSignal = d_monoDeque.size() < d_highWaterMark;
2068 d_notFullCondition.signal();
2072template <
class TYPE>
2078 while (d_monoDeque.size() >= d_highWaterMark) {
2079 d_notFullCondition.wait(&d_mutex);
2081 d_monoDeque.push_back(item);
2084 d_notEmptyCondition.signal();
2087template <
class TYPE>
2093 while (d_monoDeque.size() >= d_highWaterMark) {
2094 d_notFullCondition.wait(&d_mutex);
2099 d_notEmptyCondition.signal();
2102template <
class TYPE>
2108 while (d_monoDeque.size() >= d_highWaterMark) {
2109 d_notFullCondition.wait(&d_mutex);
2111 d_monoDeque.push_front(item);
2114 d_notEmptyCondition.signal();
2117template <
class TYPE>
2123 while (d_monoDeque.size() >= d_highWaterMark) {
2124 d_notFullCondition.wait(&d_mutex);
2129 d_notEmptyCondition.signal();
2132template <
class TYPE>
2139template <
class TYPE>
2143 removeAllImp(buffer);
2146template <
class TYPE>
2150 removeAllImp(buffer);
2153#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
2154template <
class TYPE>
2158 removeAllImp(buffer);
2162template <
class TYPE>
2170 while (d_monoDeque.empty()) {
2171 if (d_notEmptyCondition.timedWait(&d_mutex, timeout)) {
2175#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
2178 *item = d_monoDeque.back();
2180 d_monoDeque.pop_back();
2182 shouldSignal = d_monoDeque.size() < d_highWaterMark;
2186 d_notFullCondition.signal();
2192template <
class TYPE>
2200 while (d_monoDeque.empty()) {
2201 if (d_notEmptyCondition.timedWait(&d_mutex, timeout)) {
2205#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
2208 *item = d_monoDeque.front();
2210 d_monoDeque.pop_front();
2212 shouldSignal = d_monoDeque.size() < d_highWaterMark;
2216 d_notFullCondition.signal();
2222template <
class TYPE>
2229 while (d_monoDeque.size() >= d_highWaterMark) {
2230 if (d_notFullCondition.timedWait(&d_mutex, timeout)) {
2234 d_monoDeque.push_back(item);
2237 d_notEmptyCondition.signal();
2242template <
class TYPE>
2249 while (d_monoDeque.size() >= d_highWaterMark) {
2250 if (d_notFullCondition.timedWait(&d_mutex, timeout)) {
2257 d_notEmptyCondition.signal();
2262template <
class TYPE>
2269 while (d_monoDeque.size() >= d_highWaterMark) {
2270 if (d_notFullCondition.timedWait(&d_mutex, timeout)) {
2274 d_monoDeque.push_front(item);
2277 d_notEmptyCondition.signal();
2282template <
class TYPE>
2289 while (d_monoDeque.size() >= d_highWaterMark) {
2290 if (d_notFullCondition.timedWait(&d_mutex, timeout)) {
2297 d_notEmptyCondition.signal();
2302template <
class TYPE>
2309 if (d_monoDeque.empty()) {
2312#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
2315 *item = d_monoDeque.back();
2317 d_monoDeque.pop_back();
2319 shouldSignal = d_monoDeque.size() < d_highWaterMark;
2323 d_notFullCondition.signal();
2329template <
class TYPE>
2336template <
class TYPE>
2341 tryPopBackImp(maxNumItems, buffer);
2344template <
class TYPE>
2347 std::vector<TYPE> *buffer)
2349 tryPopBackImp(maxNumItems, buffer);
2352#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
2353template <
class TYPE>
2356 std::pmr::vector<TYPE> *buffer)
2358 tryPopBackImp(maxNumItems, buffer);
2362template <
class TYPE>
2369 if (d_monoDeque.empty()) {
2372#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
2375 *item = d_monoDeque.front();
2377 d_monoDeque.pop_front();
2379 shouldSignal = d_monoDeque.size() < d_highWaterMark;
2383 d_notFullCondition.signal();
2389template <
class TYPE>
2395template <
class TYPE>
2399 tryPopFrontImp(maxNumItems, buffer);
2402template <
class TYPE>
2404 std::vector<TYPE> *buffer)
2406 tryPopFrontImp(maxNumItems, buffer);
2409#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
2410template <
class TYPE>
2412 std::pmr::vector<TYPE> *buffer)
2414 tryPopFrontImp(maxNumItems, buffer);
2418template <
class TYPE>
2424 if (d_monoDeque.size() >= d_highWaterMark) {
2428 d_monoDeque.push_back(item);
2431 d_notEmptyCondition.signal();
2436template <
class TYPE>
2442 if (d_monoDeque.size() >= d_highWaterMark) {
2449 d_notEmptyCondition.signal();
2454template <
class TYPE>
2455template <
class INPUT_ITER>
2466 const size_type startLength = d_monoDeque.size();
2469 for (; length < d_highWaterMark && end != begin; ++length, ++begin) {
2470 d_monoDeque.push_back(*begin);
2475 growth = length - startLength;
2478 for (
size_type ii = 0; ii < growth; ++ii) {
2479 d_notEmptyCondition.signal();
2485template <
class TYPE>
2491 if (d_monoDeque.size() >= d_highWaterMark) {
2495 d_monoDeque.push_front(item);
2498 d_notEmptyCondition.signal();
2503template <
class TYPE>
2509 if (d_monoDeque.size() >= d_highWaterMark) {
2516 d_notEmptyCondition.signal();
2521template <
class TYPE>
2522template <
class INPUT_ITER>
2533 const size_type startLength = d_monoDeque.size();
2536 for (; length < d_highWaterMark && end != begin; ++length, ++begin) {
2537 d_monoDeque.push_front(*begin);
2542 growth = length - startLength;
2545 for (
size_type ii = 0; ii < growth; ++ii) {
2546 d_notEmptyCondition.signal();
2553template <
class TYPE>
2557 return d_monoDeque.get_allocator().mechanism();
2560template <
class TYPE>
2567template <
class TYPE>
2576 return d_highWaterMark;
2579template <
class TYPE>
2596 return d_monoDeque.size();
2603template <
class TYPE>
Definition bdlcc_deque.h:1238
bool isNull() const
Definition bdlcc_deque.h:1508
void release()
Definition bdlcc_deque.h:1458
const MonoDeque & operator*() const
Definition bdlcc_deque.h:1490
void load(const Deque< TYPE > *container)
Definition bdlcc_deque.h:1445
const TYPE & operator[](size_type position) const
Definition bdlcc_deque.h:1499
const MonoDeque * operator->() const
Definition bdlcc_deque.h:1481
~ConstProctor()
Definition bdlcc_deque.h:1437
Definition bdlcc_deque.h:1053
void release()
Definition bdlcc_deque.h:1579
~DequeThrowGuard()
Definition bdlcc_deque.h:1531
Definition bdlcc_deque.h:1159
void load(Deque< TYPE > *container)
Definition bdlcc_deque.h:1341
MonoDeque & operator*() const
Definition bdlcc_deque.h:1395
bool isNull() const
Return true if this object is not associated with a Deque object.
Definition bdlcc_deque.h:1413
MonoDeque * operator->() const
Definition bdlcc_deque.h:1386
~Proctor()
Definition bdlcc_deque.h:1333
void release()
Definition bdlcc_deque.h:1355
TYPE & operator[](typename MonoDeque::size_type position) const
Definition bdlcc_deque.h:1404
Definition bdlcc_deque.h:541
int timedPopFront(TYPE *item, const bsls::TimeInterval &timeout)
Definition bdlcc_deque.h:2193
bsl::deque< TYPE > MonoDeque
Definition bdlcc_deque.h:553
int tryPushBack(const TYPE &item)
Definition bdlcc_deque.h:2419
TYPE popBack()
Definition bdlcc_deque.h:1980
~Deque()
Definition bdlcc_deque.h:1872
Deque(bslma::Allocator *basicAllocator=0)
Definition bdlcc_deque.h:1736
bslma::Allocator * allocator() const
Return the allocator used by this container for allocating memory.
Definition bdlcc_deque.h:2555
static size_type maxSizeT()
Definition bdlcc_deque.h:1728
void pushBack(const TYPE &item)
Definition bdlcc_deque.h:2073
int timedPushFront(const TYPE &item, const bsls::TimeInterval &timeout)
Definition bdlcc_deque.h:2263
void forcePushFront(const TYPE &item)
Definition bdlcc_deque.h:1929
int timedPopBack(TYPE *item, const bsls::TimeInterval &timeout)
Definition bdlcc_deque.h:2163
int tryPopBack(TYPE *item)
Definition bdlcc_deque.h:2303
void tryPopFront(size_type maxNumItems, bsl::vector< TYPE > *buffer)
int timedPushBack(const TYPE &item, const bsls::TimeInterval &timeout)
Definition bdlcc_deque.h:2223
size_type length() const
Definition bdlcc_deque.h:2581
void tryPopBack(size_type maxNumItems, std::vector< TYPE > *buffer)
void tryPopBack(size_type maxNumItems, bsl::vector< TYPE > *buffer)
void removeAll()
Definition bdlcc_deque.h:2134
int tryPopFront(TYPE *item)
Definition bdlcc_deque.h:2363
TYPE popFront()
Definition bdlcc_deque.h:2027
void forcePushBack(const TYPE &item)
Definition bdlcc_deque.h:1879
MonoDeque::size_type size_type
Definition bdlcc_deque.h:554
void tryPopFront(size_type maxNumItems, std::vector< TYPE > *buffer)
bsls::SystemClockType::Enum clockType() const
Definition bdlcc_deque.h:2562
void tryPopBack(size_type maxNumItems)
size_type highWaterMark() const
Return the high-water mark value for this container.
Definition bdlcc_deque.h:2569
int tryPushFront(const TYPE &item)
Definition bdlcc_deque.h:2486
void pushFront(const TYPE &item)
Definition bdlcc_deque.h:2103
void tryPopFront(size_type maxNumItems)
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_deque.h:2107
size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the number of elements contained by this deque.
Definition bslstl_deque.h:2241
iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_deque.h:2099
std::size_t size_type
Definition bslstl_deque.h:640
Definition bslstl_deque.h:814
iterator insert(const_iterator position, const VALUE_TYPE &value)
Definition bslstl_deque.h:3956
ConstIterator const_iterator
Definition bslstl_deque.h:865
iterator erase(const_iterator position)
Definition bslstl_deque.h:4195
Iterator iterator
Definition bslstl_deque.h:864
std::size_t size_type
Definition bslstl_deque.h:866
Definition bslstl_vector.h:1120
Definition bslma_allocator.h:545
Definition bslmf_movableref.h:752
Definition bslmt_condition.h:220
Definition bslmt_lockguard.h:234
T * release()
Definition bslmt_lockguard.h:506
Definition bslmt_mutex.h:317
void lock()
Definition bslmt_mutex.h:399
void unlock()
Definition bslmt_mutex.h:417
Definition bsls_timeinterval.h:307
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_OPT(X)
Definition bsls_assert.h:2045
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
bsl::size_t size(const TYPE &array)
Return the number of elements in the specified array.
Definition bdlcc_boundedqueue.h:270
Definition baljsn_encoder_testtypes.h:76
Definition bdlt_iso8601util.h:707
Definition bslmf_issame.h:146
Definition bslma_usesbslmaallocator.h:344
static MovableRef< t_TYPE > move(t_TYPE &reference) BSLS_KEYWORD_NOEXCEPT
Definition bslmf_movableref.h:1067
Enum
Definition bsls_systemclocktype.h:119