Changed the way services are handled

This commit is contained in:
emeric
2020-08-22 15:20:18 +02:00
parent 9fbbca97a4
commit bd7561af8e
23 changed files with 107 additions and 127 deletions
+1 -1
View File
@@ -82,5 +82,5 @@ class Logger
virtual void processLog(const Log& log) = 0;
};
#define LMS_LOG(module, severity) Log(ServiceProvider<Logger>::get(), Module::module, Severity::severity).getOstream()
#define LMS_LOG(module, severity) Log(Service<Logger>::get(), Module::module, Severity::severity).getOstream()
+22 -24
View File
@@ -19,46 +19,44 @@
#pragma once
#include <cassert>
#include <memory>
#include <type_traits>
template <typename Class>
class ServiceProvider
class Service
{
public:
template <class DerivedClass, class ...Args>
static
Class&
create(Args&&... args)
Service(std::unique_ptr<Class> service)
{
static_assert(std::is_base_of<Class, DerivedClass>::value);
assign(std::make_unique<DerivedClass>(std::forward<Args>(args)...));
return *get();
assign(std::move(service));
}
template <class ...Args>
static
Class&
create(Args&&... args)
~Service()
{
assign(std::make_unique<Class>(std::forward<Args>(args)...));
return *get();
clear();
}
static
Class&
assign(std::unique_ptr<Class> service)
{
_service = std::move(service);
return *get();
}
Service(const Service&) = delete;
Service(Service&&) = delete;
Service& operator=(const Service&) = delete;
Service& operator=(Service&&) = delete;
static void clear() { _service.reset(); }
Class* operator->() const
{
return Service<Class>::get();
}
static Class* get() { return _service.get(); }
private:
static Class& assign(std::unique_ptr<Class> service)
{
assert(!_service);
_service = std::move(service);
return *get();
}
static void clear() { _service.reset(); }
static inline std::unique_ptr<Class> _service;
};