From 91a272482eeef79996fa399ac7625e4919d81a32 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 3 Apr 2013 16:42:54 +0200 Subject: [PATCH] Initializer will initialize several class at once Former-commit-id: b64c87006e5fd237399b623fca32ec03d0d3d50c --- include/Nazara/Core/Initializer.hpp | 7 ++- include/Nazara/Core/Initializer.inl | 68 ++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/include/Nazara/Core/Initializer.hpp b/include/Nazara/Core/Initializer.hpp index 4935cc925..dff53a4a1 100644 --- a/include/Nazara/Core/Initializer.hpp +++ b/include/Nazara/Core/Initializer.hpp @@ -9,16 +9,19 @@ #include -template +template class NzInitializer { public: - template NzInitializer(Args... args); + NzInitializer(); ~NzInitializer(); bool IsInitialized() const; operator bool() const; + + private: + bool m_initialized; }; #include diff --git a/include/Nazara/Core/Initializer.inl b/include/Nazara/Core/Initializer.inl index 8fc1d1ff2..4cc9f5aa2 100644 --- a/include/Nazara/Core/Initializer.inl +++ b/include/Nazara/Core/Initializer.inl @@ -2,33 +2,69 @@ // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include #include -template -template -NzInitializer::NzInitializer(Args... args) -{ - T::Initialize(args...); -} +template struct NzImplInitializer; -template -NzInitializer::~NzInitializer() +template +struct NzImplInitializer { - if (T::IsInitialized()) + static bool Init() + { + if (T::Initialize()) + { + if (NzImplInitializer::Init()) + return true; + else + T::Uninitialize(); + } + + return false; + } + + static void Uninit() + { T::Uninitialize(); + NzImplInitializer::Uninit(); + } +}; + +template<> +struct NzImplInitializer<> +{ + static bool Init() + { + return true; + } + + static void Uninit() + { + } +}; + +template +NzInitializer::NzInitializer() +{ + m_initialized = NzImplInitializer::Init(); } -template -bool NzInitializer::IsInitialized() const +template +NzInitializer::~NzInitializer() { - return T::IsInitialized(); + if (m_initialized) + NzImplInitializer::Uninit(); } -template -NzInitializer::operator bool() const +template +bool NzInitializer::IsInitialized() const { - return T::IsInitialized(); + return m_initialized; +} + +template +NzInitializer::operator bool() const +{ + return m_initialized; } #include