// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp #include namespace Nz { namespace Detail { template struct Initializer; template struct Initializer { static bool Init() { if (T::Initialize()) { if (Initializer::Init()) return true; else T::Uninitialize(); } return false; } static void Uninit() { Initializer::Uninit(); T::Uninitialize(); } }; template<> struct Initializer<> { static bool Init() { return true; } static void Uninit() { } }; } template Initializer::Initializer(bool initialize) : m_initialized(false) { if (initialize) Initialize(); } template Initializer::~Initializer() { Uninitialize(); } template bool Initializer::Initialize() { if (!m_initialized) m_initialized = Detail::Initializer::Init(); return m_initialized; } template bool Initializer::IsInitialized() const { return m_initialized; } template void Initializer::Uninitialize() { if (m_initialized) Detail::Initializer::Uninit(); } template Initializer::operator bool() const { return IsInitialized(); } } #include