BDE 4.14.0 Production release
Loading...
Searching...
No Matches
bslalg_dequeiterator

Macros

#define bslalg_DequeIterator   bslalg::DequeIterator
 This alias is defined for backward compatibility.
 

Detailed Description

Outline

Purpose

Provide a primitive iterator over deque data structures.

Classes

See also
bslalg_dequeimputil, bslalg_dequeprimitives

Description

This component provides an in-core value semantic class, bslalg::DequeIterator, that is a primitive iterator type for enumerating elements in a deque (implemented in the form of a dynamic array) knowing only its value type and a nominal block size. Conceptually, a deque is an array of block pointers, each block capable of containing a fixed number of objects. An element in the deque is identified by an iterator that consists of two pointers:

Dereferencing the iterator dereferences the second pointer. Incrementing or decrementing the iterator consists of incrementing the value pointer, unless the iterator crosses a block boundary in which case it must increment or decrement its pointer to the block pointer. Computing the distance between two iterators involves figuring out how many block are in between and how the offsets-in-block differ.

Note that an iterator is valid as long as the element it points to still belongs to the deque and there is no reallocation of the block pointer array. Inserting elements at either end of the deque usually maintains iterator validity, but inserting enough elements at the end of the queue might force the creating of sufficiently many blocks to trigger a reallocation of the block pointer array and invalidate all iterators into the deque; how many depends on the distances between the front and back of the deque and the first/last iterator in the block pointer array (19 in the picture below).

The picture is as follows:

v--- Iterator to 'I': ptr to this BlockPtr
+-----+-----+-----+-----+-----+-----+-----+-----+
| * | * | * | * | * | * | * | * | BlockPtr array
+-----+-----+--|--+--|--+--|--+--|--+-----+-----+
| | | | Block
| | | | +---+---+---+---+---+---+---+---+
| | | `--| V | W | X | Y | Z | | | |
| | | +---+---+---+---+---+---+---+---+
| | | Block
| | | +---+---+---+---+---+---+---+---+
| | `--| N | O | P | Q | R | S | T | U |
| | +---+---+---+---+---+---+---+---+
| | v---- Iterator to 'I': ptr to value
| | +---+---+---+---+---+---+---+---+
| `--| F | G | H | I | J | K | L | M |
| +---+---+---+---+---+---+---+---+
| Block
| +---+---+---+---+---+---+---+---+
`--| | | | A | B | C | D | E |
+---+---+---+---+---+---+---+---+

Depicted above is a deque consisting of eight block pointers, only four actually used to point to blocks of eight elements. In the first block, the first three elements are uninitialized, and the twenty six elements follow in sequence across the different blocks. An iterator to the I element consists of a pointer to the fourth block pointer and a pointer to the sixth element of that block. The value of the corresponding deque would be [ A, B, C, ... X, Y, Z ], its logical length 26, and its capacity would be 19 (the minimum number of prepend/append to force a reallocation of the block pointer array).

This component does not provide the full interface of a C++ standard library iterator as we do not want a dependency on iterator_traits in a package below bslstl. bslalg::DequeIterator provides the minimal necessary set of features to implement such an iterator for a standard conforming deque implementation in a higher level component.

Usage

This component is for use by the bslstl package. Other clients should use the STL deque (in header <deque>).

Macro Definition Documentation

◆ bslalg_DequeIterator

#define bslalg_DequeIterator   bslalg::DequeIterator