/* * Initializable.cpp * * Copyright (C) 2008 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "Initializable.h" #include "ConfigManager.h" #include "Configurable.h" #include "Logger.h" #include namespace Mad { namespace Common { std::stack Initializable::initializedObjects; void Initializable::init() { if(initialized) return; if(initializing) { Logger::log(Logger::CRITICAL, "Fatal initialization error: cyclic dependencies."); std::terminate(); } initializing = true; doInit(); Configurable *c = dynamic_cast(this); if(c) ConfigManager::get()->registerConfigurable(c); initializing = false; initialized = true; initializedObjects.push(this); } void Initializable::deinit() { while(!initializedObjects.empty()) { Initializable *in = initializedObjects.top(); Configurable *c = dynamic_cast(in); if(c) ConfigManager::get()->unregisterConfigurable(c); in->doDeinit(); in->initialized = false; initializedObjects.pop(); } } } }