// Copyright (C) 2017 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() { } }; } /*! * \ingroup core * \class Nz::Initializer * \brief Core class that represents a module initializer */ /*! * \brief Constructs a Initializer object with a boolean * * \param initialize Initialize the module */ template Initializer::Initializer(bool initialize) : m_initialized(false) { if (initialize) Initialize(); } /*! * \brief Destructs the object and call Uninitialize * * \see Uninitialize */ template Initializer::~Initializer() { Uninitialize(); } /*! * \brief Initialize the module * * \see Uninitialize */ template bool Initializer::Initialize() { if (!m_initialized) m_initialized = Detail::Initializer::Init(); return m_initialized; } /*! * \brief Checks whether the module is initialized * \return true if initialized */ template bool Initializer::IsInitialized() const { return m_initialized; } /*! * \brief Uninitialize the module * * \see Initialize */ template void Initializer::Uninitialize() { if (m_initialized) Detail::Initializer::Uninit(); } /*! * \brief Converts the initializer to boolean * \return true if initialized */ template Initializer::operator bool() const { return IsInitialized(); } } #include