#include "Configuration.h" #include "FileSystemUtilities.h" template Type getValue(ConfigData Configuration::*Data, const Configuration& Me) { if ( (Me.*Data).isSet() ) return (Me.*Data).get(); if (Me.parent()) return getValue(Data,*Me.parent()); return (Me.*Data).get(); } Configuration::Configuration() : Parent(0), BuildDir(""), SourcePath(""), IncludeDebug(true), ToolChain("") { } void Configuration::setParent(Configuration* aParent) { Parent = aParent; } Configuration* Configuration::parent() { return Parent; } const Configuration* Configuration::parent() const { return Parent; } void Configuration::setPartName(const std::string& N) { PartName = N; } const std::string& Configuration::partName() const { return PartName; } void Configuration::setSourcePath(const std::string& S) { SourcePath = S; } const std::string Configuration::sourcePath() const { return getValue(&Configuration::SourcePath,*this); } void Configuration::setBuildDir(const std::string& BD) { BuildDir = BD; } const std::string Configuration::buildDir() const { std::string SoFar; const Configuration* Current = this; while (Current) { if (Current->BuildDir.isSet()) return pathAppend(Current->BuildDir.get(),SoFar); SoFar = pathAppend(SoFar,Current->PartName); Current = Current->parent(); } return SoFar; } bool Configuration::includeDebugInformation() const { return getValue(&Configuration::IncludeDebug,*this); } void Configuration::setIncludeDebugInformation(bool b) { IncludeDebug = b; } void Configuration::setToolChain(const std::string& TC) { ToolChain = TC; } const std::string Configuration::toolChain() const { return getValue(&Configuration::ToolChain,*this); } unsigned int additiveSize(std::vector Configuration::*Data, const Configuration& Me) { if (!Me.parent()) return (Me.*Data).size(); return (Me.*Data).size()+additiveSize(Data,*Me.parent()); } std::string additiveGetValue(std::vector Configuration::*Data, const Configuration& Me, unsigned int idx) { if (idx < (Me.*Data).size()) return (Me.*Data)[idx]; return additiveGetValue(Data, *Me.parent(), idx-(Me.*Data).size()); } void additiveAdd(std::vector Configuration::* Data, Configuration& Me, const std::string& Value) { for (unsigned int i=0; i