Capycore Engine  0.1.0
A simple and lightweight game engine written in C++ based on the Unity API architecture.
Loading...
Searching...
No Matches
serviceContainer.h
Go to the documentation of this file.
1#pragma once
3
4#include <format>
5#include <memory>
6#include <optional>
7#include <typeindex>
8#include <unordered_map>
9
10class ServiceContainer final {
11 public:
13
14 template <typename T, typename... Args>
15 requires EngineService<T> T& register_service(Args&&... args) {
16 auto service = std::make_unique<T>(std::forward<Args>(args)...);
17 T& ref = *service;
18 services_[std::type_index(typeid(T))] = std::move(service);
19 return ref;
20 }
21
22 template <typename T>
23 requires EngineService<T>
24 void unregister_service() { services_.erase(std::type_index(typeid(T))); }
25
26 template <typename T>
27 requires EngineService<T> std::reference_wrapper<T> get_service()
28 const {
29 const auto it = services_.find(std::type_index(typeid(T)));
30 if (it == services_.end()) {
31 throw std::runtime_error(
32 std::format("Service not found: {}", typeid(T).name()));
33 }
34 // So we get an EngineServiceBase, but we know it's actually a T. We do not
35 // use dynamic cast because we are not storing subtypes of T
36 return std::ref(*static_cast<T*>(it->second.get()));
37 }
38
39 template <typename T>
40 requires EngineService<T> std::optional<std::reference_wrapper<T>>
42 const {
43 const auto it = services_.find(std::type_index(typeid(T)));
44 if (it == services_.end()) {
45 return std::nullopt;
46 }
47
48 return std::ref(*static_cast<T*>(it->second.get()));
49 }
50
51 private:
52 std::unordered_map<std::type_index, std::unique_ptr<IEngineService>>
53 services_;
54};
Definition serviceContainer.h:10
std::reference_wrapper< T > get_service() const
Definition serviceContainer.h:27
T & register_service(Args &&... args)
Definition serviceContainer.h:15
void unregister_service()
Definition serviceContainer.h:24
std::optional< std::reference_wrapper< T > > try_get_service() const
Definition serviceContainer.h:41
Definition iEngineService.h:10