# DynamicBitWriter

<a id="dynamicbitwriter"></a>

# DynamicBitWriter

```cpp
#include <icy/buffer.h>

class DynamicBitWriter
```

[Defined in src/base/include/icy/buffer.h:596](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L596)

> **Inherits:** [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter)

Class for reading/writing dynamically resizable binary streams.

Note that when using the constructor with the Buffer reference as an argument, the writer will dynamically expand the given buffer when writing passed the buffer capacity. All other cases will throw a std::out_of_range error when writing past the buffer capacity.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`DynamicBitWriter`](#dynamicbitwriter-1) | `function` | Declared here |
| [`DynamicBitWriter`](#dynamicbitwriter-2) | `function` | Declared here |
| [`~DynamicBitWriter`](#dynamicbitwriter-3) | `function` | Declared here |
| [`put`](#put-2) | `function` | Declared here |
| [`update`](#update-2) | `function` | Declared here |
| [`_buffer`](#_buffer) | `variable` | Declared here |
| [`_offset`](#_offset) | `variable` | Declared here |
| [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#operator-6) | `friend` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-2) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-3) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`~BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-4) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`put`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#put) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`put`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#put-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`putU8`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu8) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`putU16`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu16) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`putU24`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu24) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`putU32`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu32) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`putU64`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu64) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`update`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#update) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`update`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#update-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`updateU8`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu8) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`updateU16`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu16) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`updateU24`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu24) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`updateU32`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu32) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`updateU64`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu64) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`seek`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#seek-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`skip`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#skip-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`limit`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#limit-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`position`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#position-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`available`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#available-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`begin`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#begin-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`current`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#current-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`begin`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#begin-2) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`current`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#current-2) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`order`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#order-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`toString`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#tostring-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`_position`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_position-1) | `variable` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`_limit`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_limit-1) | `variable` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`_order`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_order-1) | `variable` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`_bytes`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_bytes-1) | `variable` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |
| [`init`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#init-1) | `function` | Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) |

## Inherited from [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter)

| Kind | Name | Description |
|------|------|-------------|
| `friend` | [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#operator-6) `inline` |  |
| `function` | [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-1)  | Constructs a [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) over a raw byte array with a fixed capacity. |
| `function` | [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-2)  | Constructs a [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) backed by a `Buffer`. Writes are bounded by the buffer's capacity; use [`DynamicBitWriter`](#dynamicbitwriter) for auto-resize. |
| `function` | [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-3)  | Constructs a [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) over a [`MutableBuffer`](https://auscaster.com/icey/docs/api-reference/icy-MutableBuffer.md#mutablebuffer-6) with a fixed capacity. |
| `function` | [`~BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter-4) `virtual` |  |
| `function` | [`put`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#put) `virtual` | Append bytes to the buffer. Throws a `std::out_of_range` exception if reading past the limit. |
| `function` | [`put`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#put-1)  | Appends the contents of a string. Throws `std::out_of_range` if capacity is exceeded. |
| `function` | [`putU8`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu8)  | Appends an unsigned 8-bit integer. Throws `std::out_of_range` if capacity is exceeded. |
| `function` | [`putU16`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu16)  | Appends an unsigned 16-bit integer with byte-order conversion. Throws `std::out_of_range` if capacity is exceeded. |
| `function` | [`putU24`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu24)  | Appends the low 24 bits of a 32-bit integer with byte-order conversion. Throws `std::out_of_range` if capacity is exceeded. |
| `function` | [`putU32`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu32)  | Appends an unsigned 32-bit integer with byte-order conversion. Throws `std::out_of_range` if capacity is exceeded. |
| `function` | [`putU64`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#putu64)  | Appends an unsigned 64-bit integer with byte-order conversion. Throws `std::out_of_range` if capacity is exceeded. |
| `function` | [`update`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#update) `virtual` | Update a byte range. Throws a `std::out_of_range` exception if reading past the limit. |
| `function` | [`update`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#update-1)  | Overwrites a previously written string at the given absolute position. |
| `function` | [`updateU8`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu8)  | Overwrites a `uint8_t` at the given absolute position. |
| `function` | [`updateU16`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu16)  | Overwrites a `uint16_t` at the given absolute position, with byte-order conversion. |
| `function` | [`updateU24`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu24)  | Overwrites 3 bytes (low 24 bits of `val`) at the given absolute position, with byte-order conversion. |
| `function` | [`updateU32`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu32)  | Overwrites a `uint32_t` at the given absolute position, with byte-order conversion. |
| `function` | [`updateU64`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#updateu64)  | Overwrites a `uint64_t` at the given absolute position, with byte-order conversion. |
| `function` | [`seek`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#seek-1)  | Set position pointer to absolute position. Throws a `std::out_of_range` exception if the value exceeds the limit. |
| `function` | [`skip`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#skip-1)  | Set position pointer to relative position. Throws a `std::out_of_range` exception if the value exceeds the limit. |
| `function` | [`limit`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#limit-1) `const` | Returns the write limit. |
| `function` | [`position`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#position-1) `const` `inline` | Returns the current write position. |
| `function` | [`available`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#available-1) `const` | Returns the number of elements between the current write position and the limit. |
| `function` | [`begin`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#begin-1) `inline` | Returns a pointer to the start of the write buffer. |
| `function` | [`current`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#current-1) `inline` | Returns a pointer to the current write position. |
| `function` | [`begin`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#begin-2) `const` `inline` | Returns a const pointer to the start of the write buffer. |
| `function` | [`current`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#current-2) `const` `inline` | Returns a const pointer to the current write position. |
| `function` | [`order`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#order-1) `const` `inline` | Returns the byte order used for multi-byte integer writes. |
| `function` | [`toString`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#tostring-1)  | Returns all bytes written so far as a `std::string`. |
| `variable` | [`_position`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_position-1)  |  |
| `variable` | [`_limit`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_limit-1)  |  |
| `variable` | [`_order`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_order-1)  |  |
| `variable` | [`_bytes`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#_bytes-1)  |  |
| `function` | [`init`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#init-1) `virtual` |  |

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`DynamicBitWriter`](#dynamicbitwriter-1)  | Constructs a [`DynamicBitWriter`](#dynamicbitwriter) backed by a dynamically resizable `Buffer`. The buffer is expanded automatically as data is written. |
|  | [`DynamicBitWriter`](#dynamicbitwriter-2)  | Constructs a [`DynamicBitWriter`](#dynamicbitwriter) that inserts data starting at a specific iterator position. |
|  | [`~DynamicBitWriter`](#dynamicbitwriter-3) `virtual` |  |
| `void` | [`put`](#put-2) `virtual` `override` | Append bytes to the buffer. Throws a `std::out_of_range` exception if reading past the limit. |
| `bool` | [`update`](#update-2) `virtual` `override` | Update a byte range. Throws a `std::out_of_range` exception if reading past the limit. |

---

<a id="dynamicbitwriter-1"></a>

### DynamicBitWriter

```cpp
DynamicBitWriter(Buffer & buf, ByteOrder order = ByteOrder::Network)
```

[Defined in src/base/include/icy/buffer.h:603](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L603)

Constructs a [`DynamicBitWriter`](#dynamicbitwriter) backed by a dynamically resizable `Buffer`. The buffer is expanded automatically as data is written.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `buf` | [`Buffer`](https://auscaster.com/icey/docs/api-reference/base.md#buffer) & | Buffer to write into; expanded as needed. |
| `order` | [`ByteOrder`](https://auscaster.com/icey/docs/api-reference/base.md#byteorder) | Byte order used for multi-byte integer writes. |

---

<a id="dynamicbitwriter-2"></a>

### DynamicBitWriter

```cpp
DynamicBitWriter(Buffer & buf, Buffer::iterator offset, ByteOrder order = ByteOrder::Network)
```

[Defined in src/base/include/icy/buffer.h:609](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L609)

Constructs a [`DynamicBitWriter`](#dynamicbitwriter) that inserts data starting at a specific iterator position.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `buf` | [`Buffer`](https://auscaster.com/icey/docs/api-reference/base.md#buffer) & | Buffer to write into; expanded as needed. |
| `offset` | `Buffer::iterator` | Iterator into `buf` indicating the insertion start point. |
| `order` | [`ByteOrder`](https://auscaster.com/icey/docs/api-reference/base.md#byteorder) | Byte order used for multi-byte integer writes. |

---

<a id="dynamicbitwriter-3"></a>

### ~DynamicBitWriter

`virtual`

```cpp
virtual ~DynamicBitWriter()
```

[Defined in src/base/include/icy/buffer.h:610](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L610)

---

<a id="put-2"></a>

### put

`virtual` `override`

```cpp
virtual void put(const char * val, size_t len) override
```

[Defined in src/base/include/icy/buffer.h:614](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L614)

Append bytes to the buffer. Throws a `std::out_of_range` exception if reading past the limit.

#### Reimplements

- [`BitWriter::put`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#put)

---

<a id="update-2"></a>

### update

`virtual` `override`

```cpp
virtual bool update(const char * val, size_t len, size_t pos) override
```

[Defined in src/base/include/icy/buffer.h:618](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L618)

Update a byte range. Throws a `std::out_of_range` exception if reading past the limit.

#### Reimplements

- [`BitWriter::update`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#update)

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`Buffer`](https://auscaster.com/icey/docs/api-reference/base.md#buffer) & | [`_buffer`](#_buffer)  |  |
| `size_t` | [`_offset`](#_offset)  |  |

---

<a id="_buffer"></a>

### _buffer

```cpp
Buffer & _buffer
```

Type: [`Buffer`](https://auscaster.com/icey/docs/api-reference/base.md#buffer) &

[Defined in src/base/include/icy/buffer.h:621](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L621)

---

<a id="_offset"></a>

### _offset

```cpp
size_t _offset
```

[Defined in src/base/include/icy/buffer.h:622](https://github.com/auscaster/icey/blob/main/src/base/include/icy/buffer.h#L622)
