Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
kcenon::network::utils::callback_manager< CallbackTypes > Class Template Reference

Thread-safe callback storage and invocation utility. More...

#include <callback_manager.h>

Inheritance diagram for kcenon::network::utils::callback_manager< CallbackTypes >:
Inheritance graph
Collaboration diagram for kcenon::network::utils::callback_manager< CallbackTypes >:
Collaboration graph

Public Member Functions

 callback_manager ()=default
 Default constructor.
 
 ~callback_manager ()=default
 Destructor.
 
 callback_manager (const callback_manager &)=delete
 
callback_manageroperator= (const callback_manager &)=delete
 
 callback_manager (callback_manager &&) noexcept=default
 
callback_manageroperator= (callback_manager &&) noexcept=default
 
template<std::size_t Index>
auto set (std::tuple_element_t< Index, std::tuple< CallbackTypes... > > callback) -> void
 Sets a callback at the specified index.
 
template<typename T >
auto set (T callback) -> void
 Sets a callback by type.
 
template<std::size_t Index>
auto get () const -> std::tuple_element_t< Index, std::tuple< CallbackTypes... > >
 Gets a callback at the specified index.
 
template<typename T >
auto get () const -> T
 Gets a callback by type.
 
template<std::size_t Index, typename... Args>
auto invoke (Args &&... args) -> void
 Invokes a callback at the specified index if set.
 
template<typename T , typename... Args>
auto invoke (Args &&... args) -> void
 Invokes a callback by type if set.
 
template<std::size_t Index, typename... Args>
auto invoke_if (bool condition, Args &&... args) -> void
 Invokes a callback conditionally.
 
auto clear () -> void
 Clears all callbacks.
 
template<std::size_t Index>
auto clear () -> void
 Clears a specific callback.
 

Private Attributes

std::mutex mutex_
 
std::tuple< CallbackTypes... > callbacks_
 

Detailed Description

template<typename... CallbackTypes>
class kcenon::network::utils::callback_manager< CallbackTypes >

Thread-safe callback storage and invocation utility.

This template class provides a centralized way to store and invoke multiple callback types with thread safety. It replaces the repeated callback handling code in CRTP base classes.

Template Parameters
CallbackTypesThe callback function types to manage.

Thread Safety

  • Setting callbacks is protected by mutex
  • Invocation copies the callback under lock, then invokes outside lock
  • This prevents deadlocks when callbacks trigger other operations

Usage Example

using my_callbacks = callback_manager<
std::function<void(std::vector<uint8_t>&&)>, // receive
std::function<void()>, // connected
std::function<void()> // disconnected
>;
my_callbacks callbacks;
callbacks.set<0>([](auto&& data) { process(data); });
callbacks.invoke<0>(std::move(data));
Thread-safe callback storage and invocation utility.
auto set(std::tuple_element_t< Index, std::tuple< CallbackTypes... > > callback) -> void
Sets a callback at the specified index.

Definition at line 61 of file callback_manager.h.

Constructor & Destructor Documentation

◆ callback_manager() [1/3]

template<typename... CallbackTypes>
kcenon::network::utils::callback_manager< CallbackTypes >::callback_manager ( )
default

Default constructor.

◆ ~callback_manager()

template<typename... CallbackTypes>
kcenon::network::utils::callback_manager< CallbackTypes >::~callback_manager ( )
default

Destructor.

◆ callback_manager() [2/3]

template<typename... CallbackTypes>
kcenon::network::utils::callback_manager< CallbackTypes >::callback_manager ( const callback_manager< CallbackTypes > & )
delete

◆ callback_manager() [3/3]

template<typename... CallbackTypes>
kcenon::network::utils::callback_manager< CallbackTypes >::callback_manager ( callback_manager< CallbackTypes > && )
defaultnoexcept

Member Function Documentation

◆ clear() [1/2]

template<typename... CallbackTypes>
auto kcenon::network::utils::callback_manager< CallbackTypes >::clear ( ) -> void
inline

Clears all callbacks.

Definition at line 183 of file callback_manager.h.

184 {
185 std::lock_guard lock(mutex_);
186 callbacks_ = std::tuple<CallbackTypes...>{};
187 }
std::tuple< CallbackTypes... > callbacks_

References kcenon::network::utils::callback_manager< CallbackTypes >::callbacks_, and kcenon::network::utils::callback_manager< CallbackTypes >::mutex_.

◆ clear() [2/2]

template<typename... CallbackTypes>
template<std::size_t Index>
auto kcenon::network::utils::callback_manager< CallbackTypes >::clear ( ) -> void
inline

Clears a specific callback.

Template Parameters
IndexThe index of the callback to clear.

Definition at line 194 of file callback_manager.h.

195 {
196 std::lock_guard lock(mutex_);
197 std::get<Index>(callbacks_) = {};
198 }

References kcenon::network::utils::callback_manager< CallbackTypes >::callbacks_, and kcenon::network::utils::callback_manager< CallbackTypes >::mutex_.

◆ get() [1/2]

template<typename... CallbackTypes>
template<std::size_t Index>
auto kcenon::network::utils::callback_manager< CallbackTypes >::get ( ) const -> std::tuple_element_t<Index, std::tuple<CallbackTypes...>>
inlinenodiscard

◆ get() [2/2]

template<typename... CallbackTypes>
template<typename T >
auto kcenon::network::utils::callback_manager< CallbackTypes >::get ( ) const -> T
inlinenodiscard

Gets a callback by type.

Template Parameters
TThe callback type.
Returns
The callback function (may be empty).

Definition at line 122 of file callback_manager.h.

123 {
124 std::lock_guard lock(mutex_);
125 return std::get<T>(callbacks_);
126 }

References kcenon::network::utils::callback_manager< CallbackTypes >::callbacks_, and kcenon::network::utils::callback_manager< CallbackTypes >::mutex_.

◆ invoke() [1/2]

template<typename... CallbackTypes>
template<std::size_t Index, typename... Args>
auto kcenon::network::utils::callback_manager< CallbackTypes >::invoke ( Args &&... args) -> void
inline

Invokes a callback at the specified index if set.

Template Parameters
IndexThe index of the callback type.
ArgsThe argument types.
Parameters
argsThe arguments to pass to the callback.

Thread Safety

The callback is copied under lock, then invoked without lock. This prevents deadlocks if the callback triggers set() calls.

Definition at line 139 of file callback_manager.h.

140 {
141 auto callback = get<Index>();
142 if (callback)
143 {
144 callback(std::forward<Args>(args)...);
145 }
146 }
auto get() const -> std::tuple_element_t< Index, std::tuple< CallbackTypes... > >
Gets a callback at the specified index.

References kcenon::network::utils::callback_manager< CallbackTypes >::get().

Referenced by kcenon::network::utils::callback_manager< CallbackTypes >::invoke_if().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ invoke() [2/2]

template<typename... CallbackTypes>
template<typename T , typename... Args>
auto kcenon::network::utils::callback_manager< CallbackTypes >::invoke ( Args &&... args) -> void
inline

Invokes a callback by type if set.

Template Parameters
TThe callback type.
ArgsThe argument types.
Parameters
argsThe arguments to pass to the callback.

Definition at line 155 of file callback_manager.h.

156 {
157 auto callback = get<T>();
158 if (callback)
159 {
160 callback(std::forward<Args>(args)...);
161 }
162 }

References kcenon::network::utils::callback_manager< CallbackTypes >::get().

Here is the call graph for this function:

◆ invoke_if()

template<typename... CallbackTypes>
template<std::size_t Index, typename... Args>
auto kcenon::network::utils::callback_manager< CallbackTypes >::invoke_if ( bool condition,
Args &&... args ) -> void
inline

Invokes a callback conditionally.

Template Parameters
IndexThe index of the callback type.
ArgsThe argument types.
Parameters
conditionIf false, the callback is not invoked.
argsThe arguments to pass to the callback.

Definition at line 172 of file callback_manager.h.

173 {
174 if (condition)
175 {
176 invoke<Index>(std::forward<Args>(args)...);
177 }
178 }
auto invoke(Args &&... args) -> void
Invokes a callback at the specified index if set.

References kcenon::network::utils::callback_manager< CallbackTypes >::invoke().

Here is the call graph for this function:

◆ operator=() [1/2]

template<typename... CallbackTypes>
callback_manager & kcenon::network::utils::callback_manager< CallbackTypes >::operator= ( callback_manager< CallbackTypes > && )
defaultnoexcept

◆ operator=() [2/2]

template<typename... CallbackTypes>
callback_manager & kcenon::network::utils::callback_manager< CallbackTypes >::operator= ( const callback_manager< CallbackTypes > & )
delete

◆ set() [1/2]

template<typename... CallbackTypes>
template<std::size_t Index>
auto kcenon::network::utils::callback_manager< CallbackTypes >::set ( std::tuple_element_t< Index, std::tuple< CallbackTypes... > > callback) -> void
inline

Sets a callback at the specified index.

Template Parameters
IndexThe index of the callback type.
Parameters
callbackThe callback function to store.

Definition at line 86 of file callback_manager.h.

87 {
88 std::lock_guard lock(mutex_);
89 std::get<Index>(callbacks_) = std::move(callback);
90 }

References kcenon::network::utils::callback_manager< CallbackTypes >::callbacks_, and kcenon::network::utils::callback_manager< CallbackTypes >::mutex_.

◆ set() [2/2]

template<typename... CallbackTypes>
template<typename T >
auto kcenon::network::utils::callback_manager< CallbackTypes >::set ( T callback) -> void
inline

Sets a callback by type.

Template Parameters
TThe callback type (must be unique in CallbackTypes).
Parameters
callbackThe callback function to store.

Definition at line 98 of file callback_manager.h.

99 {
100 std::lock_guard lock(mutex_);
101 std::get<T>(callbacks_) = std::move(callback);
102 }

References kcenon::network::utils::callback_manager< CallbackTypes >::callbacks_, and kcenon::network::utils::callback_manager< CallbackTypes >::mutex_.

Member Data Documentation

◆ callbacks_

◆ mutex_


The documentation for this class was generated from the following file: