try create universaly service class

This commit is contained in:
Andrei Yankovich 2023-04-06 21:44:47 +02:00
parent c29c9edc52
commit d7b9ccef40

View File

@ -65,6 +65,10 @@ namespace QuasarAppUtils {
template<class Base> template<class Base>
class Service class Service
{ {
struct Block {
Base* _data = nullptr;
};
public: public:
Service() {}; Service() {};
@ -78,10 +82,11 @@ public:
*/ */
template<class BaseClass = Base, class... Args> template<class BaseClass = Base, class... Args>
static Base* initService(Args&&... args) { static Base* initService(Args&&... args) {
if(!_data) { auto& val = instancePrivat();
_data = new BaseClass(std::forward<Args>(args)...); if(!val._data) {
val._data = new BaseClass(std::forward<Args>(args)...);
} }
return _data; return val._data;
} }
/** /**
@ -93,7 +98,7 @@ public:
* @see autoInstance * @see autoInstance
*/ */
static Base* instance() { static Base* instance() {
return _data; return instancePrivat()._data;
} }
/** /**
@ -102,12 +107,13 @@ public:
* @see instance * @see instance
*/ */
static Base* autoInstance() { static Base* autoInstance() {
auto& val = instancePrivat();
if (!_data) { if (!val._data) {
initService(); initService();
} }
return _data; return val._data;
} }
/** /**
@ -118,20 +124,22 @@ public:
* @see autoInstance * @see autoInstance
*/ */
static void deinitService() { static void deinitService() {
if(_data) { auto& val = instancePrivat();
delete _data;
_data = nullptr; if(val._data) {
delete val._data;
val._data = nullptr;
} }
} }
private: private:
static Base* _data; static inline Block& instancePrivat() {
static Block instance;
return instance;
}
}; };
template<class Base>
Base* Service<Base>::_data = nullptr;
} }
#endif // QASERVICE_H #endif // QASERVICE_H