Cogs.Core
Services.h
1#pragma once
2
3#include "Base.h"
4#include "Context.h"
5#include "MemoryContext.h"
6
7#include "Foundation/Memory/Allocator.h"
8#include "Foundation/Reflection/TypeDatabase.h"
9
10#include <functional>
11
12namespace Cogs
13{
14 namespace Core
15 {
16 class Context;
17
20 {
21 void * service;
22 size_t size;
23 void(*destroy)(void *);
25 };
26
31 class COGSCORE_DLL_API Services
32 {
33 public:
34 Services(Context * context);
35 ~Services();
36
37 void clear();
38
52 template<typename Service, typename... Args>
53 Service * registerService(Args... args)
54 {
55 auto & type = Reflection::TypeDatabase::getType<Service>();
56
57 if (!ensureUniqueService(type.getTypeId())) {
58 return getService<Service>();
59 }
60
61 auto s = Memory::create<Service>(context->memory->baseAllocator, args...);
62
63 RegisteredService service = {};
64 service.service = s;
65 service.size = sizeof(Service);
66 service.id = type.getTypeId();
67 service.destroy = [](void * t) { static_cast<Service *>(t)->~Service(); };
68
69 services.push_back(service);
70
71 return s;
72 }
73
77 template<typename Service>
78 void registerServiceReference(Service * s)
79 {
80 auto & type = Reflection::TypeDatabase::getType<Service>();
81
82 if (!ensureUniqueService(type.getTypeId())) {
83 return;
84 }
85
86 RegisteredService service = {};
87 service.service = s;
88 service.id = type.getTypeId();
89
90 services.push_back(service);
91 }
92
93 template<typename Service>
94 Service * getService()
95 {
96 const auto typeId = Reflection::TypeDatabase::getType<Service>().getTypeId();
97
98 return static_cast<Service *>(locateService(typeId));
99 }
100
101 void addFrameCallback(std::function<void(void)> callback);
102 void dispatchFrameCallbacks();
103
104 private:
105 bool ensureUniqueService(Reflection::TypeId typeId);
106 void * locateService(Reflection::TypeId typeId);
107
108 std::vector<RegisteredService> services;
109 std::vector<std::function<void(void)>> callbacks;
110
111 Context * context;
112 };
113 }
114}
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
std::unique_ptr< struct MemoryContext > memory
Memory and allocation info.
Definition: Context.h:171
Service registry.
Definition: Services.h:32
void registerServiceReference(Service *s)
Registers an externally managed service instance.
Definition: Services.h:78
Service * registerService(Args... args)
Registers a service of the given type.
Definition: Services.h:53
uint16_t TypeId
Built in type used to uniquely identify a single type instance.
Definition: Name.h:48
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
Registered service structure.
Definition: Services.h:20