# RunnableQueue

<a id="runnablequeue"></a>

# RunnableQueue

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

template<class T>
class RunnableQueue
```

[Defined in src/base/include/icy/queue.h:113](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L113)

> **Inherits:** [`Queue< T * >`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2), [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable)
> **Subclassed by:** [`AsyncQueue< IPacket >`](https://auscaster.com/icey/docs/api-reference/icy-AsyncQueue.md#asyncqueue), [`AsyncQueue< PacketT >`](https://auscaster.com/icey/docs/api-reference/icy-AsyncQueue.md#asyncqueue), [`PlanarAudioPacket >`](https://auscaster.com/icey/docs/api-reference/icy-AsyncQueue.md#asyncqueue), [`AsyncQueue< VisionFramePacket >`](https://auscaster.com/icey/docs/api-reference/icy-AsyncQueue.md#asyncqueue), [`SyncQueue< IPacket >`](https://auscaster.com/icey/docs/api-reference/icy-SyncQueue.md#syncqueue), [`AsyncQueue< T >`](https://auscaster.com/icey/docs/api-reference/icy-AsyncQueue.md#asyncqueue), [`SyncQueue< T >`](https://auscaster.com/icey/docs/api-reference/icy-SyncQueue.md#syncqueue)

[Queue](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) of runnable tasks for sequential execution.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`ondispatch`](#ondispatch) | `variable` | Declared here |
| [`RunnableQueue`](#runnablequeue-1) | `function` | Declared here |
| [`~RunnableQueue`](#runnablequeue-2) | `function` | Declared here |
| [`push`](#push-2) | `function` | Declared here |
| [`flush`](#flush-1) | `function` | Declared here |
| [`clear`](#clear-4) | `function` | Declared here |
| [`run`](#run-4) | `function` | Declared here |
| [`runTimeout`](#runtimeout) | `function` | Declared here |
| [`dispatch`](#dispatch-1) | `function` | Declared here |
| [`timeout`](#timeout) | `function` | Declared here |
| [`setTimeout`](#settimeout) | `function` | Declared here |
| [`dropped`](#dropped) | `function` | Declared here |
| [`_limit`](#_limit-2) | `variable` | Declared here |
| [`_timeout`](#_timeout) | `variable` | Declared here |
| [`_dropped`](#_dropped) | `variable` | Declared here |
| [`RunnableQueue`](#runnablequeue-3) | `function` | Declared here |
| [`operator=`](#operator-79) | `function` | Declared here |
| [`RunnableQueue`](#runnablequeue-4) | `function` | Declared here |
| [`operator=`](#operator-80) | `function` | Declared here |
| [`popNext`](#popnext) | `function` | Declared here |
| [`dispatchNext`](#dispatchnext) | `function` | Declared here |
| [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push-1) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`empty`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#empty-3) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`front`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#front) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`back`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#back) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`pop`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#pop) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`sort`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#sort) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`size`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#size-6) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-3) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`_queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_queue) | `variable` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`_mutex`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_mutex-4) | `variable` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-1) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`~Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-2) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`cancel`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`cancelled`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancelled-3) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`exit`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#exit) | `variable` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |

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

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push) `inline` | Appends an item to the back of the queue (thread-safe). |
| `function` | [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push-1) `inline` | Appends an item to the back of the queue by move (thread-safe). |
| `function` | [`empty`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#empty-3) `const` `inline` |  |
| `function` | [`front`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#front) `const` `inline` |  |
| `function` | [`back`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#back) `const` `inline` |  |
| `function` | [`pop`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#pop) `inline` | Removes the front item from the queue (thread-safe). |
| `function` | [`sort`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#sort) `inline` | Sorts all queued items using the given comparator (thread-safe). |
| `function` | [`size`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#size-6) `const` `inline` |  |
| `function` | [`queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-3) `const` `inline` |  |
| `variable` | [`_queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_queue)  |  |
| `variable` | [`_mutex`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_mutex-4)  |  |

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

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-1) `inline` |  |
| `function` | [`~Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-2) `virtual` | Defaulted destructor. |
| `function` | [`run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) `virtual` | The run method will be called by the asynchronous context. |
| `function` | [`cancel`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) `virtual` `inline` | Cancel the current task. The [run()](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) method should return ASAP. |
| `function` | [`cancelled`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancelled-3) `virtual` `const` `inline` | Returns true when the task has been cancelled. |
| `variable` | [`exit`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#exit)  |  |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| `std::function< void(T &)>` | [`ondispatch`](#ondispatch)  | The default dispatch function. Must be set before the queue is running. |

---

<a id="ondispatch"></a>

### ondispatch

```cpp
std::function< void(T &)> ondispatch
```

[Defined in src/base/include/icy/queue.h:119](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L119)

The default dispatch function. Must be set before the queue is running.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`RunnableQueue`](#runnablequeue-1) `inline` |  |
|  | [`~RunnableQueue`](#runnablequeue-2) `virtual` `inline` |  |
| `void` | [`push`](#push-2) `virtual` `inline` | Push an item onto the queue. The queue takes ownership of the item pointer. |
| `void` | [`flush`](#flush-1) `virtual` `inline` | Flush all outgoing items. |
| `void` | [`clear`](#clear-4) `inline` |  |
| `void` | [`run`](#run-4) `virtual` `inline` `override` | Called asynchronously to dispatch queued items. If not timeout is set this method blocks until [cancel()](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) is called, otherwise [runTimeout()](#runtimeout) will be called. |
| `void` | [`runTimeout`](#runtimeout) `virtual` `inline` | Called asynchronously to dispatch queued items until the queue is empty or the timeout expires. Pseudo protected for std::bind compatability. |
| `void` | [`dispatch`](#dispatch-1) `virtual` `inline` | Dispatch a single item to listeners. |
| `int` | [`timeout`](#timeout) `inline` |  |
| `void` | [`setTimeout`](#settimeout) `inline` | Sets the dispatch timeout. Must only be called when the queue is empty. |
| `size_t` | [`dropped`](#dropped) `const` `inline` |  |

---

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

### RunnableQueue

`inline`

```cpp
inline RunnableQueue(int limit = 2048, int timeout = 0)
```

[Defined in src/base/include/icy/queue.h:123](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L123)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `limit` | `int` | Maximum number of queued items; oldest are purged when exceeded (0 = unlimited). |
| `timeout` | `int` | Dispatch timeout in milliseconds; 0 means run until [cancel()](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) is called. |

---

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

### ~RunnableQueue

`virtual` `inline`

```cpp
virtual inline ~RunnableQueue()
```

[Defined in src/base/include/icy/queue.h:129](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L129)

---

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

### push

`virtual` `inline`

```cpp
virtual inline void push(T * item)
```

[Defined in src/base/include/icy/queue.h:136](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L136)

Push an item onto the queue. The queue takes ownership of the item pointer.

#### Reimplemented by

- [`SyncQueue::push`](https://auscaster.com/icey/docs/api-reference/icy-SyncQueue.md#push-3)

---

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

### flush

`virtual` `inline`

```cpp
virtual inline void flush()
```

[Defined in src/base/include/icy/queue.h:151](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L151)

Flush all outgoing items.

---

<a id="clear-4"></a>

### clear

`inline`

```cpp
inline void clear()
```

[Defined in src/base/include/icy/queue.h:169](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L169)

---

<a id="run-4"></a>

### run

`virtual` `inline` `override`

```cpp
virtual inline void run() override
```

[Defined in src/base/include/icy/queue.h:181](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L181)

Called asynchronously to dispatch queued items. If not timeout is set this method blocks until [cancel()](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) is called, otherwise [runTimeout()](#runtimeout) will be called.

#### Reimplements

- [`Runnable::run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11)

---

<a id="runtimeout"></a>

### runTimeout

`virtual` `inline`

```cpp
virtual inline void runTimeout()
```

[Defined in src/base/include/icy/queue.h:196](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L196)

Called asynchronously to dispatch queued items until the queue is empty or the timeout expires. Pseudo protected for std::bind compatability.

---

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

### dispatch

`virtual` `inline`

```cpp
virtual inline void dispatch(T & item)
```

[Defined in src/base/include/icy/queue.h:206](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L206)

Dispatch a single item to listeners.

#### Reimplemented by

- [`AsyncPacketQueue::dispatch`](https://auscaster.com/icey/docs/api-reference/icy-AsyncPacketQueue.md#dispatch)
- [`AsyncPacketQueue::dispatch`](https://auscaster.com/icey/docs/api-reference/icy-AsyncPacketQueue.md#dispatch)
- [`SyncPacketQueue::dispatch`](https://auscaster.com/icey/docs/api-reference/icy-SyncPacketQueue.md#dispatch-2)
- [`AsyncPacketQueue::dispatch`](https://auscaster.com/icey/docs/api-reference/icy-AsyncPacketQueue.md#dispatch)
- [`AsyncPacketQueue::dispatch`](https://auscaster.com/icey/docs/api-reference/icy-AsyncPacketQueue.md#dispatch)

---

<a id="timeout"></a>

### timeout

`inline`

```cpp
inline int timeout()
```

[Defined in src/base/include/icy/queue.h:213](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L213)

#### Returns
Current dispatch timeout in milliseconds.

---

<a id="settimeout"></a>

### setTimeout

`inline`

```cpp
inline void setTimeout(int milliseconds)
```

[Defined in src/base/include/icy/queue.h:222](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L222)

Sets the dispatch timeout. Must only be called when the queue is empty.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `milliseconds` | `int` | New timeout in milliseconds. |

#### Exceptions

| Exception | Description |
|-----------|-------------|
| `std::logic_error` | if the queue is non-empty. |

---

<a id="dropped"></a>

### dropped

`const` `inline`

```cpp
inline size_t dropped() const
```

[Defined in src/base/include/icy/queue.h:231](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L231)

#### Returns
Number of items purged because the queue limit was exceeded.

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| `int` | [`_limit`](#_limit-2)  |  |
| `int` | [`_timeout`](#_timeout)  |  |
| `size_t` | [`_dropped`](#_dropped)  |  |

---

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

### _limit

```cpp
int _limit
```

[Defined in src/base/include/icy/queue.h:270](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L270)

---

<a id="_timeout"></a>

### _timeout

```cpp
int _timeout
```

[Defined in src/base/include/icy/queue.h:271](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L271)

---

<a id="_dropped"></a>

### _dropped

```cpp
size_t _dropped = 0
```

[Defined in src/base/include/icy/queue.h:272](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L272)

## Protected Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`RunnableQueue`](#runnablequeue-3)  | Deleted constructor. |
| [`RunnableQueue`](#runnablequeue) & | [`operator=`](#operator-79)  | Deleted assignment operator. |
|  | [`RunnableQueue`](#runnablequeue-4)  | Deleted constructor. |
| [`RunnableQueue`](#runnablequeue) & | [`operator=`](#operator-80)  | Deleted assignment operator. |
| `T *` | [`popNext`](#popnext) `virtual` `inline` | Pops the next waiting item. |
| `bool` | [`dispatchNext`](#dispatchnext) `virtual` `inline` | Pops and dispatches the next waiting item. |

---

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

### RunnableQueue

```cpp
RunnableQueue(const RunnableQueue &) = delete
```

[Defined in src/base/include/icy/queue.h:238](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L238)

Deleted constructor.

---

<a id="operator-79"></a>

### operator=

```cpp
RunnableQueue & operator=(const RunnableQueue &) = delete
```

[Defined in src/base/include/icy/queue.h:239](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L239)

Deleted assignment operator.

---

<a id="runnablequeue-4"></a>

### RunnableQueue

```cpp
RunnableQueue(RunnableQueue &&) = delete
```

[Defined in src/base/include/icy/queue.h:240](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L240)

Deleted constructor.

---

<a id="operator-80"></a>

### operator=

```cpp
RunnableQueue & operator=(RunnableQueue &&) = delete
```

[Defined in src/base/include/icy/queue.h:241](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L241)

Deleted assignment operator.

---

<a id="popnext"></a>

### popNext

`virtual` `inline`

```cpp
virtual inline T * popNext()
```

[Defined in src/base/include/icy/queue.h:244](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L244)

Pops the next waiting item.

#### Reimplemented by

- [`RealtimePacketQueue::popNext`](https://auscaster.com/icey/docs/api-reference/icy-av-RealtimePacketQueue.md#popnext-1)

---

<a id="dispatchnext"></a>

### dispatchNext

`virtual` `inline`

```cpp
virtual inline bool dispatchNext()
```

[Defined in src/base/include/icy/queue.h:259](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L259)

Pops and dispatches the next waiting item.
