Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
ServiceContext.hpp
Go to the documentation of this file.
1
7#pragma once
8
11
12namespace corium {
13
18template <typename EventVariant = DefaultEvents>
20public:
21 using GetServiceFn = void* (*)(void* registryPtr, internal::TypeIdPtr typeId);
22
24
27 void* regPtr = nullptr,
28 GetServiceFn fn = nullptr
29 ) noexcept
30 : _eventSink(sink), _registryPtr(regPtr), _getServiceFn(fn)
31 {}
32
34 [[nodiscard]] EventSinkT<EventVariant> mainSink() const noexcept
35 {
36 return _eventSink;
37 }
38
40 [[nodiscard]] EventSinkT<EventVariant> eventSink() const noexcept
41 {
42 return _eventSink;
43 }
44
46 void setRegistry(void* registryPtr, GetServiceFn fn) noexcept
47 {
48 _registryPtr = registryPtr;
49 _getServiceFn = fn;
50 }
51
55 template <typename ServiceType>
56 [[nodiscard]] ServiceType* getService() const noexcept
57 {
58 if (_registryPtr && _getServiceFn) {
59 return static_cast<ServiceType*>(_getServiceFn(_registryPtr, internal::getTypeId<ServiceType>()));
60 }
61 return nullptr;
62 }
63
67 template <typename ServiceType>
68 [[nodiscard]] EventSinkT<EventVariant> getServiceSink() const noexcept
69 {
70 auto* service = getService<ServiceType>();
71 if (service) {
72 if constexpr (requires { service->sink(); }) {
73 return service->sink();
74 }
75 }
77 }
78
85 template <typename TargetService, typename EventType>
86 bool sendToService(EventType&& event, EventPriority priority = EventPriority::Normal) const
87 {
88 auto sinkHandle = getServiceSink<TargetService>();
89 if (sinkHandle) {
90 sinkHandle.post(std::forward<EventType>(event), priority);
91 return true;
92 }
93 return false;
94 }
95
96private:
97 EventSinkT<EventVariant> _eventSink;
98 void* _registryPtr = nullptr;
99 GetServiceFn _getServiceFn = nullptr;
100};
101
104
106template <typename EventVariant = DefaultEvents>
108
109} // namespace corium
Non-allocating type-erased fat pointer handle for lock-free event posting.
Compile-time type index resolution for std::variant alternative types.
Execution context provided to background services. Allows services to post events back to the main ev...
Definition ServiceContext.hpp:19
BasicServiceContext(EventSinkT< EventVariant > sink, void *regPtr=nullptr, GetServiceFn fn=nullptr) noexcept
Definition ServiceContext.hpp:25
void setRegistry(void *registryPtr, GetServiceFn fn) noexcept
Configure registry resolution bridge (internal framework usage).
Definition ServiceContext.hpp:46
EventSinkT< EventVariant > eventSink() const noexcept
Access main application EventSink handle.
Definition ServiceContext.hpp:40
bool sendToService(EventType &&event, EventPriority priority=EventPriority::Normal) const
Post an event directly to a target service.
Definition ServiceContext.hpp:86
EventSinkT< EventVariant > mainSink() const noexcept
Access main application EventSink handle.
Definition ServiceContext.hpp:34
void *(*)(void *registryPtr, internal::TypeIdPtr typeId) GetServiceFn
Definition ServiceContext.hpp:21
EventSinkT< EventVariant > getServiceSink() const noexcept
Retrieve event sink handle of a target registered service if available.
Definition ServiceContext.hpp:68
ServiceType * getService() const noexcept
Retrieve another registered service instance by type.
Definition ServiceContext.hpp:56
const void * TypeIdPtr
Definition VariantIndex.hpp:60
Definition Application.hpp:16
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32