19template <
typename T,
typename Context>
56template <
size_t MaxServices = 8,
typename EventVariant = DefaultEvents>
67 void (*
stopFn)(
void* inst)
noexcept =
nullptr;
68 void (*
joinFn)(
void* inst)
noexcept =
nullptr;
77 template <
typename ServiceType>
80 if (_count >= MaxServices) {
85 internal::getTypeId<ServiceType>(),
87 auto* s =
static_cast<ServiceType*
>(ptr);
92 auto* s =
static_cast<ServiceType*
>(ptr);
99 [](
void* ptr)
noexcept {
100 auto* s =
static_cast<ServiceType*
>(ptr);
103 [](
void* ptr)
noexcept {
104 auto* s =
static_cast<ServiceType*
>(ptr);
115 for (
size_t i = 0; i < _count; ++i) {
116 if (_services[i].typeId == typeId) {
117 return _services[i].instance;
126 template <
typename ServiceType>
129 return static_cast<ServiceType*
>(
getServiceById(internal::getTypeId<ServiceType>()));
135 template <
typename ServiceType>
138 auto* service = getService<ServiceType>();
140 if constexpr (
requires { service->sink(); }) {
141 return service->sink();
154 for (
size_t i = 0; i < _count; ++i) {
155 if (_services[i].initFn) {
156 _services[i].initFn(_services[i].instance, ctx);
158 if (_services[i].startFn) {
159 _services[i].startFn(_services[i].instance);
167 for (
size_t i = 0; i < _count; ++i) {
168 if (_services[i].stopFn) {
169 _services[i].stopFn(_services[i].instance);
172 for (
size_t i = 0; i < _count; ++i) {
173 if (_services[i].joinFn) {
174 _services[i].joinFn(_services[i].instance);
181 [[nodiscard]]
size_t size() const noexcept
187 std::array<ServiceHandle, MaxServices> _services{};
195template <
size_t MaxServices = 8,
typename EventVariant = DefaultEvents>
Dependency injection context for background services.
void setRegistry(void *registryPtr, GetServiceFn fn) noexcept
Configure registry resolution bridge (internal framework usage).
Definition ServiceContext.hpp:46
Non-allocating ServiceRegistry storing service handles in a fixed stack/static array....
Definition ServiceRegistry.hpp:57
void * getServiceById(internal::TypeIdPtr typeId) const noexcept
Retrieve a registered service instance by static type ID.
Definition ServiceRegistry.hpp:113
bool registerService(ServiceType &serviceInstance)
Register a background service instance by reference.
Definition ServiceRegistry.hpp:78
void shutdown() noexcept
Stop and join all registered background service threads.
Definition ServiceRegistry.hpp:165
size_t size() const noexcept
Access number of registered services.
Definition ServiceRegistry.hpp:181
EventSinkT< EventVariant > getServiceSink() const noexcept
Retrieve event sink handle of a target registered service if available.
Definition ServiceRegistry.hpp:136
void initialize(ServiceContextType ctx)
Initialize and launch all registered background service jthreads.
Definition ServiceRegistry.hpp:148
ServiceType * getService() const noexcept
Retrieve a registered service instance by concrete type.
Definition ServiceRegistry.hpp:127
BasicServiceRegistry()=default
Definition ServiceRegistry.hpp:25
Definition ServiceRegistry.hpp:45
Definition ServiceRegistry.hpp:30
Definition ServiceRegistry.hpp:20
Definition ServiceRegistry.hpp:35
Definition ServiceRegistry.hpp:40
const void * TypeIdPtr
Definition VariantIndex.hpp:60
Definition Application.hpp:16
Non-allocating type-erased handle for static background services.
Definition ServiceRegistry.hpp:62
void * instance
Definition ServiceRegistry.hpp:63
void(* startFn)(void *inst)
Definition ServiceRegistry.hpp:66
void(* stopFn)(void *inst) noexcept
Definition ServiceRegistry.hpp:67
internal::TypeIdPtr typeId
Definition ServiceRegistry.hpp:64
void(* joinFn)(void *inst) noexcept
Definition ServiceRegistry.hpp:68
void(* initFn)(void *inst, ServiceContextType ctx)
Definition ServiceRegistry.hpp:65