From b2fc6c70434674d74551c3a6c01ffb3233499312 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Mon, 1 Jul 2013 22:34:11 +0000 Subject: Update version to 1.3 --- src/Config.cpp | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 src/Config.cpp (limited to 'src/Config.cpp') diff --git a/src/Config.cpp b/src/Config.cpp new file mode 100644 index 0000000..8c5cbf5 --- /dev/null +++ b/src/Config.cpp @@ -0,0 +1,166 @@ +/* +----------------------------------------------------------------------- +Copyright 2012 iMinds-Vision Lab, University of Antwerp + +Contact: astra@ua.ac.be +Website: http://astra.ua.ac.be + + +This file is part of the +All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox"). + +The ASTRA Toolbox 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. + +The ASTRA Toolbox 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 the ASTRA Toolbox. If not, see . + +----------------------------------------------------------------------- +$Id$ +*/ + +#include "astra/Config.h" + +// For explicit ConfigStackCheck instantiations +#include "astra/Algorithm.h" +#include "astra/VolumeGeometry2D.h" +#include "astra/VolumeGeometry3D.h" +#include "astra/ProjectionGeometry2D.h" +#include "astra/ProjectionGeometry3D.h" +#include "astra/Projector2D.h" +#include "astra/Projector3D.h" + +using namespace astra; +using namespace std; + +//----------------------------------------------------------------------------- +// default constructor +Config::Config() +{ + self = 0; +} + +//----------------------------------------------------------------------------- +// not so default constructor +Config::Config(XMLNode* _self) +{ + self = _self; +} + +Config::~Config() +{ + delete self; + self = 0; +} + +template +ConfigStackCheck::ConfigStackCheck(const char *_name, T* _obj, const Config& _cfg) + : object(_obj), cfg(&_cfg), name(_name) +{ + assert(object); + assert(cfg); + if (!object->configCheckData) { + object->configCheckData = new ConfigCheckData; + object->configCheckData->parseDepth = 0; + } + + object->configCheckData->parseDepth++; +} + +template +ConfigStackCheck::~ConfigStackCheck() +{ + assert(object->configCheckData); + assert(object->configCheckData->parseDepth > 0); + + + if (object->configCheckData->parseDepth == 1) { + // Entirely done with parsing this Config object + + if (object->isInitialized()) + stopParsing(); + + delete object->configCheckData; + object->configCheckData = 0; + } else { + object->configCheckData->parseDepth--; + } +} + + +// returns true if no unused nodes/options +template +bool ConfigStackCheck::stopParsing() +{ + assert(object->configCheckData); + assert(object->configCheckData->parseDepth > 0); + + if (object->configCheckData->parseDepth > 1) + return true; + + // If this was the top-level parse function, check + + std::string errors; + + std::list nodes = cfg->self->getNodes(); + for (std::list::iterator i = nodes.begin(); i != nodes.end(); ++i) + { + std::string nodeName = (*i)->getName(); + + if (nodeName == "Option") { + nodeName = (*i)->getAttribute("key", ""); + if (object->configCheckData->parsedOptions.find(nodeName) == object->configCheckData->parsedOptions.end()) { + if (!errors.empty()) errors += ", "; + errors += nodeName; + } + } else { + if (object->configCheckData->parsedNodes.find(nodeName) == object->configCheckData->parsedNodes.end()) { + if (!errors.empty()) errors += ", "; + errors += nodeName; + } + } + } + for (std::list::iterator i = nodes.begin(); i != nodes.end(); ++i) + delete (*i); + nodes.clear(); + + if (!errors.empty()) { + cout << "Warning: " << name << ": unused configuration options: " << errors << std::endl; + return false; + } + + return true; +} + +template +void ConfigStackCheck::markNodeParsed(const std::string& nodeName) +{ + assert(object->configCheckData); + assert(object->configCheckData->parseDepth > 0); + object->configCheckData->parsedNodes.insert(nodeName); +} + +template +void ConfigStackCheck::markOptionParsed(const std::string& nodeName) +{ + assert(object->configCheckData); + assert(object->configCheckData->parseDepth > 0); + object->configCheckData->parsedOptions.insert(nodeName); +} + + +template class ConfigStackCheck; +template class ConfigStackCheck; +template class ConfigStackCheck; +template class ConfigStackCheck; +template class ConfigStackCheck; +template class ConfigStackCheck; +template class ConfigStackCheck; + -- cgit v1.2.3