# RefCounted

<a id="refcounted"></a>

# RefCounted

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

template<typename T>
class RefCounted
```

[Defined in src/base/include/icy/memory.h:57](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L57)

> **Subclassed by:** [`PacketTransaction< Message >`](https://auscaster.com/icey/docs/api-reference/icy-PacketTransaction.md#packettransaction), [`Context< uv_pipe_t >`](https://auscaster.com/icey/docs/api-reference/icy-uv-Context.md#context-2), [`Context< uv_tcp_t >`](https://auscaster.com/icey/docs/api-reference/icy-uv-Context.md#context-2), [`Context< uv_udp_t >`](https://auscaster.com/icey/docs/api-reference/icy-uv-Context.md#context-2), [`Context< uv_idle_t >`](https://auscaster.com/icey/docs/api-reference/icy-uv-Context.md#context-2), [`Context< uv_process_t >`](https://auscaster.com/icey/docs/api-reference/icy-uv-Context.md#context-2), [`Context< uv_async_t >`](https://auscaster.com/icey/docs/api-reference/icy-uv-Context.md#context-2), [`Context< uv_timer_t >`](https://auscaster.com/icey/docs/api-reference/icy-uv-Context.md#context-2)

Base class for intrusive reference counting.

Embeds the refcount in the object itself - no separate control block allocation, no atomic operations. Safe for single-threaded libuv loops.

Usage: inherit from RefCounted<YourClass>, then use IntrusivePtr<YourClass> instead of std::shared_ptr<YourClass>.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`RefCounted`](#refcounted-1)  | Defaulted constructor. |
|  | [`RefCounted`](#refcounted-2) `inline` `noexcept` |  |
| [`RefCounted`](#refcounted) & | [`operator=`](#operator-78) `inline` `noexcept` |  |
| `void` | [`addRef`](#addref) `const` `inline` `noexcept` | Increments the reference count. Called by [IntrusivePtr](https://auscaster.com/icey/docs/api-reference/icy-IntrusivePtr.md#intrusiveptr) on acquisition. |
| `bool` | [`releaseRef`](#releaseref) `const` `inline` `noexcept` | Decrements the reference count. |
| `int` | [`refCount`](#refcount) `const` `inline` `noexcept` | Returns the current reference count. |

---

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

### RefCounted

```cpp
RefCounted() = default
```

[Defined in src/base/include/icy/memory.h:60](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L60)

Defaulted constructor.

---

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

### RefCounted

`inline` `noexcept`

```cpp
inline RefCounted(const RefCounted &) noexcept
```

[Defined in src/base/include/icy/memory.h:61](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L61)

---

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

### operator=

`inline` `noexcept`

```cpp
inline RefCounted & operator=(const RefCounted &) noexcept
```

[Defined in src/base/include/icy/memory.h:62](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L62)

---

<a id="addref"></a>

### addRef

`const` `inline` `noexcept`

```cpp
inline void addRef() const noexcept
```

[Defined in src/base/include/icy/memory.h:65](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L65)

Increments the reference count. Called by [IntrusivePtr](https://auscaster.com/icey/docs/api-reference/icy-IntrusivePtr.md#intrusiveptr) on acquisition.

---

<a id="releaseref"></a>

### releaseRef

`const` `inline` `noexcept`

```cpp
inline bool releaseRef() const noexcept
```

[Defined in src/base/include/icy/memory.h:69](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L69)

Decrements the reference count. 
#### Returns
true if the count reached zero (caller should delete the object).

---

<a id="refcount"></a>

### refCount

`const` `inline` `noexcept`

```cpp
inline int refCount() const noexcept
```

[Defined in src/base/include/icy/memory.h:73](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L73)

Returns the current reference count. 
#### Returns
Current reference count.

## Protected Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`~RefCounted`](#refcounted-3)  | Defaulted destructor. |

---

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

### ~RefCounted

```cpp
~RefCounted() = default
```

[Defined in src/base/include/icy/memory.h:76](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L76)

Defaulted destructor.

## Private Attributes

| Return | Name | Description |
|--------|------|-------------|
| `int` | [`_refCount`](#_refcount)  |  |

---

<a id="_refcount"></a>

### _refCount

```cpp
int _refCount = 0
```

[Defined in src/base/include/icy/memory.h:79](https://github.com/auscaster/icey/blob/main/src/base/include/icy/memory.h#L79)
