8#ifndef INCLUDED_BSLALG_DEQUEITERATOR
9#define INCLUDED_BSLALG_DEQUEITERATOR
124#include <bslscm_version.h>
139template <
class VALUE_TYPE,
int BLOCK_LENGTH>
142template <
class VALUE_TYPE>
143class DequeIterator<VALUE_TYPE, 1>;
157template <
class VALUE_TYPE,
int BLOCK_LENGTH>
167 VALUE_TYPE *d_value_p;
181 return lhs.d_value_p == rhs.d_value_p;
184#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
191 auto result = lhs.d_blockPtr_p <=> rhs.d_blockPtr_p;
192 return result == 0 ? lhs.d_value_p <=> rhs.d_value_p
207 return lhs.d_value_p != rhs.d_value_p;
221 if (lhs.d_blockPtr_p == rhs.d_blockPtr_p) {
222 return lhs.d_value_p < rhs.d_value_p;
225 return lhs.d_blockPtr_p < rhs.d_blockPtr_p;
277 void setBlock(BlockPtr *blockPtrPtr);
350template <
class VALUE_TYPE>
360 VALUE_TYPE *d_value_p;
365 return lhs.d_blockPtr_p == rhs.d_blockPtr_p;
368#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
371 return lhs.d_blockPtr_p <=> rhs.d_blockPtr_p;
376 return lhs.d_blockPtr_p != rhs.d_blockPtr_p;
381 return lhs.d_blockPtr_p < rhs.d_blockPtr_p;
399 void setBlock(BlockPtr *blockPtrPtr);
425template <
class VALUE_TYPE,
int BLOCK_LENGTH>
433template <
class VALUE_TYPE,
int BLOCK_LENGTH>
436: d_blockPtr_p(blockPtrPtr)
437, d_value_p(reinterpret_cast<VALUE_TYPE*>(*blockPtrPtr))
441template <
class VALUE_TYPE,
int BLOCK_LENGTH>
444 VALUE_TYPE *valuePtr)
445: d_blockPtr_p(blockPtrPtr)
456template <
class VALUE_TYPE,
int BLOCK_LENGTH>
459 if (1 == this->remainingInBlock()) {
461 d_value_p = this->blockBegin();
468template <
class VALUE_TYPE,
int BLOCK_LENGTH>
471 if (0 == this->offsetInBlock()) {
473 d_value_p = this->blockEnd();
478template <
class VALUE_TYPE,
int BLOCK_LENGTH>
482 offset += offsetInBlock();
484 d_blockPtr_p += offset / BLOCK_LENGTH;
485 d_value_p = blockBegin() + (offset % BLOCK_LENGTH);
488 d_blockPtr_p -= (-offset - 1) / BLOCK_LENGTH + 1;
489 d_value_p = blockEnd() - ((-offset - 1) % BLOCK_LENGTH + 1);
493template <
class VALUE_TYPE,
int BLOCK_LENGTH>
498 this->operator+=(-offset);
501template <
class VALUE_TYPE,
int BLOCK_LENGTH>
506 d_value_p = this->blockBegin();
509template <
class VALUE_TYPE,
int BLOCK_LENGTH>
514 d_value_p = this->blockBegin();
517template <
class VALUE_TYPE,
int BLOCK_LENGTH>
521 d_blockPtr_p = blockPtrPtr;
522 d_value_p = this->blockBegin();
525template <
class VALUE_TYPE,
int BLOCK_LENGTH>
535template <
class VALUE_TYPE,
int BLOCK_LENGTH>
546template <
class VALUE_TYPE,
int BLOCK_LENGTH>
554template <
class VALUE_TYPE,
int BLOCK_LENGTH>
564template <
class VALUE_TYPE,
int BLOCK_LENGTH>
574template <
class VALUE_TYPE,
int BLOCK_LENGTH>
579 if (d_blockPtr_p == rhs.d_blockPtr_p) {
580 return d_value_p - rhs.d_value_p;
583 const int numFullBlocks =
static_cast<int>(
584 this->d_blockPtr_p - rhs.d_blockPtr_p - 1);
585 return (numFullBlocks * BLOCK_LENGTH +
586 rhs.remainingInBlock() + this->offsetInBlock());
590template <
class VALUE_TYPE,
int BLOCK_LENGTH>
595 return reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
598template <
class VALUE_TYPE,
int BLOCK_LENGTH>
603 return reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p) + BLOCK_LENGTH;
606template <
class VALUE_TYPE,
int BLOCK_LENGTH>
615template <
class VALUE_TYPE,
int BLOCK_LENGTH>
620 return d_value_p - blockBegin();
623template <
class VALUE_TYPE,
int BLOCK_LENGTH>
628 return blockBegin() + BLOCK_LENGTH - d_value_p;
631template <
class VALUE_TYPE,
int BLOCK_LENGTH>
644template <
class VALUE_TYPE>
652template <
class VALUE_TYPE>
655: d_blockPtr_p(blockPtrPtr)
656, d_value_p(reinterpret_cast<VALUE_TYPE*>(*blockPtrPtr))
660template <
class VALUE_TYPE>
663 VALUE_TYPE *valuePtr)
664: d_blockPtr_p(blockPtrPtr)
671template <
class VALUE_TYPE>
676 d_value_p =
reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
679template <
class VALUE_TYPE>
684 d_value_p =
reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
687template <
class VALUE_TYPE>
691 d_blockPtr_p += offset;
692 d_value_p =
reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
695template <
class VALUE_TYPE>
699 this->operator+=(-offset);
702template <
class VALUE_TYPE>
707 d_value_p =
reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
710template <
class VALUE_TYPE>
715 d_value_p =
reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
718template <
class VALUE_TYPE>
722 d_blockPtr_p = blockPtrPtr;
723 d_value_p =
reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
726template <
class VALUE_TYPE>
734template <
class VALUE_TYPE>
743template <
class VALUE_TYPE>
750template <
class VALUE_TYPE>
758template <
class VALUE_TYPE>
766template <
class VALUE_TYPE>
772 return d_blockPtr_p - rhs.d_blockPtr_p;
775template <
class VALUE_TYPE>
780 return reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p);
783template <
class VALUE_TYPE>
788 return reinterpret_cast<VALUE_TYPE*
>(*d_blockPtr_p) + 1;
791template <
class VALUE_TYPE>
800template <
class VALUE_TYPE>
808template <
class VALUE_TYPE>
816template <
class VALUE_TYPE>
826#ifndef BDE_OPENSOURCE_PUBLICATION
831#ifdef bslalg_DequeIterator
832#undef bslalg_DequeIterator
835#define bslalg_DequeIterator bslalg::DequeIterator
847template <
class VALUE_TYPE,
int BLOCK_LENGTH>
Definition bslalg_dequeiterator.h:351
std::ptrdiff_t operator-(const DequeIterator &rhs) const
friend bool operator<(const DequeIterator &lhs, const DequeIterator &rhs)
Definition bslalg_dequeiterator.h:379
friend bool operator!=(const DequeIterator &lhs, const DequeIterator &rhs)
Definition bslalg_dequeiterator.h:374
friend bool operator==(const DequeIterator &lhs, const DequeIterator &rhs)
Definition bslalg_dequeiterator.h:363
Definition bslalg_dequeiterator.h:158
void previousBlock()
Definition bslalg_dequeiterator.h:511
std::size_t offsetInBlock() const
Definition bslalg_dequeiterator.h:618
std::size_t remainingInBlock() const
Definition bslalg_dequeiterator.h:626
void setBlock(BlockPtr *blockPtrPtr)
Definition bslalg_dequeiterator.h:519
void valuePtrDecrement()
Definition bslalg_dequeiterator.h:527
VALUE_TYPE * valuePtr() const
Definition bslalg_dequeiterator.h:634
void nextBlock()
Set this iterator to point to the first element of the next block.
Definition bslalg_dequeiterator.h:503
void valuePtrIncrement()
Definition bslalg_dequeiterator.h:537
void operator-=(std::ptrdiff_t offset)
Move this iterator backward by the specified offset.
Definition bslalg_dequeiterator.h:496
void operator+=(std::ptrdiff_t offset)
Advance this iterator by the specified offset.
Definition bslalg_dequeiterator.h:480
friend bool operator<(const DequeIterator &lhs, const DequeIterator &rhs)
Definition bslalg_dequeiterator.h:219
void operator--()
Definition bslalg_dequeiterator.h:469
DequeIterator operator-(std::ptrdiff_t offset) const
Definition bslalg_dequeiterator.h:567
friend bool operator!=(const DequeIterator &lhs, const DequeIterator &rhs)
Definition bslalg_dequeiterator.h:205
void operator++()
Definition bslalg_dequeiterator.h:457
BlockPtr * blockPtr() const
Return the address of the block pointer pointed to by this iterator.
Definition bslalg_dequeiterator.h:610
friend bool operator==(const DequeIterator &lhs, const DequeIterator &rhs)
Definition bslalg_dequeiterator.h:179
VALUE_TYPE * blockBegin() const
Definition bslalg_dequeiterator.h:593
VALUE_TYPE & operator*() const
Definition bslalg_dequeiterator.h:549
DequeIterator()
Create a singular iterator (i.e., having internal null pointers).
Definition bslalg_dequeiterator.h:427
VALUE_TYPE * blockEnd() const
Definition bslalg_dequeiterator.h:601
DequeIterator operator+(std::ptrdiff_t offset) const
Definition bslalg_dequeiterator.h:557
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlc_flathashmap.h:2218
Definition bdlbb_blob.h:579
Definition bslalg_dequeimputil.h:147
Definition bslalg_dequeimputil.h:126
Definition bslmf_isbitwisecopyable.h:298
std::size_t UintPtr
Definition bsls_types.h:128