# Executors

> USearch for C++

`#include <usearch/dense_index.hpp>`

## executor_t

Owns one executor; an empty one runs every call on the caller's own thread.

```cpp
class executor_t
```

## executor_t

```cpp
executor_t() noexcept=default;
```

```cpp
executor_t(executor_t && other) noexcept;
```

```cpp
executor_t(executor_t const &)=delete;
```

## operator=

```cpp
executor_t & operator=(executor_t && other) noexcept;
```

```cpp
executor_t & operator=(executor_t const &)=delete;
```

## ~executor_t

```cpp
~executor_t() noexcept;
```

## drain

Waits for every call submitted before the drain began, then sets the mood the executor adopts whenever it next goes idle.

```cpp
outcome drain(usearch_executor_drain_t arguments = {}) noexcept;
```

Statuses: - [`usearch_status_contended_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_contended_k) A call running on the executor holds it, as for a drain from that call's own progress handler, predicate or host function.
- [`usearch_status_device_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_device_k) A GPU executor with no vendor behind it.

## for_ram

Spawns host threads for RAM-resident indexes, interleaved across the compute domains local to the memory domains `options` names.

```cpp
outcome<executor_t> for_ram(
    usearch_executor_for_ram_t options = {}) noexcept;
```

## on_pool

Wraps a borrowed ForkUnion pool, so several libraries in one process share its threads.

```cpp
outcome<executor_t> on_pool(
    usearch_executor_on_pool_t options) noexcept;
```

Statuses: - [`usearch_status_unsupported_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_unsupported_k) Always, as borrowed pools are not wired yet.

## for_vram

Opens one submission stream on every distinct device `options` names.

```cpp
outcome<executor_t> for_vram(
    usearch_executor_for_vram_t options = {}) noexcept;
```

Statuses: - [`usearch_status_unsupported_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_unsupported_k) Borrowed streams, which are not wired yet.
- [`usearch_status_device_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_device_k) An ordinal past the listing, or no device named.
- [`usearch_status_config_mismatch_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_config_mismatch_k) Devices of more than one vendor.

## for_nvme

Spawns host threads for NVMe-resident indexes, one submission ring apiece.

```cpp
outcome<executor_t> for_nvme(
    usearch_executor_for_nvme_t options = {}) noexcept;
```

Statuses: - [`usearch_status_invalid_argument_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_invalid_argument_k) `NULL` paths for a nonzero count, or an unknown engine class.
- [`usearch_status_config_mismatch_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_config_mismatch_k) Kernel paths mixed with transport identifiers, or SPDK pinned over kernel paths or a kernel engine over transport identifiers.
- [`usearch_status_unsupported_k`](https://www.unum.cloud/docs/usearch/c/errors.md#usearch_status_unsupported_k) Transport identifiers in a build without SPDK, or a pinned engine this build lacks.

## run_to_completion

Runs `verb` to completion with `arguments`, which name everything but the outcome.

```cpp
template <typename arguments_type_>
outcome run_to_completion(
    void(*)(arguments_type_ *) verb,
    arguments_type_ & arguments) noexcept;
```

