diff --git a/eisgenerator/model.h b/eisgenerator/model.h index 0f2c8cbc68a9b1f95be19a790fe76e12c8902a28..ecb9fbe1d7807466d6c36ba7453bafe517de4d7d 100644 --- a/eisgenerator/model.h +++ b/eisgenerator/model.h @@ -14,8 +14,8 @@ namespace eis class Model { private: - Componant *processBrackets(std::string& str, size_t& bracketCounter, size_t paramSweepCount); - Componant *processBracket(std::string& str, size_t paramSweepCount); + Componant *processBrackets(std::string& str, size_t& bracketCounter, size_t paramSweepCount, bool defaultToRange); + Componant *processBracket(std::string& str, size_t paramSweepCount, bool defaultToRange); std::string getParamStr(const std::string& str, size_t index); static size_t paramSkipIndex(const std::string& str, size_t index); static void addComponantToFlat(Componant* componant, std::vector<Componant*>* flatComponants); @@ -29,7 +29,7 @@ private: std::vector<Componant*> _flatComponants; public: - Model(const std::string& str, size_t paramSweepCount = 100); + Model(const std::string& str, size_t paramSweepCount = 100, bool defaultToRange = true); Model(const Model& in); Model& operator=(const Model& in); ~Model(); diff --git a/model.cpp b/model.cpp index 1b332de605ea3551ca99b1d9c079ba67db569b07..5055a13fda6b2342e692726f03325dc87bb0c7f1 100644 --- a/model.cpp +++ b/model.cpp @@ -20,16 +20,16 @@ using namespace eis; -Componant *Model::processBrackets(std::string& str, size_t& bracketCounter, size_t paramSweepCount) +Componant *Model::processBrackets(std::string& str, size_t& bracketCounter, size_t paramSweepCount, bool defaultToRange) { size_t bracketStart = deepestBraket(str); Log(Log::DEBUG)<<str<<" bracket start "<<(bracketStart == std::string::npos ? std::string("npos") : std::to_string(bracketStart)); if(bracketStart == std::string::npos) { - Componant* componant = processBracket(str, paramSweepCount); + Componant* componant = processBracket(str, paramSweepCount, defaultToRange); if(!componant) - Log(Log::DEBUG)<<"Warning: can not create componant type B for "<<str; + throw parse_errror("can not create componant type B for " + str); return componant; } @@ -42,43 +42,18 @@ Componant *Model::processBrackets(std::string& str, size_t& bracketCounter, size std::string bracket = str.substr(bracketStart+1, bracketEnd-1-bracketStart); - Componant* componant = processBracket(bracket, paramSweepCount); + Componant* componant = processBracket(bracket, paramSweepCount, defaultToRange); if(!componant) - Log(Log::DEBUG)<<"can not create componant type A for "<<bracket; + throw parse_errror("can not create componant type B for " + str); _bracketComponants.push_back(componant); str.erase(str.begin()+bracketStart, str.begin()+bracketEnd+1); str.insert(str.begin()+bracketStart, bracketCounter+48); ++bracketCounter; - return processBrackets(str, bracketCounter, paramSweepCount); + return processBrackets(str, bracketCounter, paramSweepCount, defaultToRange); } -std::string Model::getParamStr(const std::string& str, size_t index) -{ - if(static_cast<int64_t>(str.size())-index < 3 || str[index+1] != '{') - { - Log(Log::WARN)<<"missing parameter string for "<<str[index]; - return ""; - } - - size_t end = opposingBraket(str, index, '}'); - std::string parameterStr = str.substr(index+2, end-index-2); - Log(Log::DEBUG)<<"param for "<<str[index]<<' '<<parameterStr; - return parameterStr; -} - -size_t Model::paramSkipIndex(const std::string& str, size_t index) -{ - if(index+2 > str.size() || str[index+1] != '{') - return index; - - size_t opposing = opposingBraket(str, index, '}'); - if(opposing != std::string::npos) - return opposing; - return index; -} - -Componant *Model::processBracket(std::string& str, size_t paramSweepCount) +Componant *Model::processBracket(std::string& str, size_t paramSweepCount, bool defaultToRange) { Log(Log::DEBUG)<<__func__<<'('<<str<<')'; std::vector<std::string> tokens = tokenize(str, '-', '{', '}'); @@ -96,37 +71,37 @@ Componant *Model::processBracket(std::string& str, size_t paramSweepCount) { case Cap::staticGetComponantChar(): { - componants.push_back(new Cap(getParamStr(nodeStr, i), paramSweepCount, true)); + componants.push_back(new Cap(getParamStr(nodeStr, i), paramSweepCount, defaultToRange)); i = paramSkipIndex(nodeStr, i); break; } case Resistor::staticGetComponantChar(): { - componants.push_back(new Resistor(getParamStr(nodeStr, i), paramSweepCount, true)); + componants.push_back(new Resistor(getParamStr(nodeStr, i), paramSweepCount, defaultToRange)); i = paramSkipIndex(nodeStr, i); break; } case Inductor::staticGetComponantChar(): { - componants.push_back(new Inductor(getParamStr(nodeStr, i), paramSweepCount, true)); + componants.push_back(new Inductor(getParamStr(nodeStr, i), paramSweepCount, defaultToRange)); i = paramSkipIndex(nodeStr, i); break; } case Cpe::staticGetComponantChar(): { - componants.push_back(new Cpe(getParamStr(nodeStr, i), paramSweepCount, true)); + componants.push_back(new Cpe(getParamStr(nodeStr, i), paramSweepCount, defaultToRange)); i = paramSkipIndex(nodeStr, i); break; } case Warburg::staticGetComponantChar(): { - componants.push_back(new Warburg(getParamStr(nodeStr, i), paramSweepCount, true)); + componants.push_back(new Warburg(getParamStr(nodeStr, i), paramSweepCount, defaultToRange)); i = paramSkipIndex(nodeStr, i); break; } case FiniteTransmitionline::staticGetComponantChar(): { - componants.push_back(new FiniteTransmitionline(getParamStr(nodeStr, i), paramSweepCount, true)); + componants.push_back(new FiniteTransmitionline(getParamStr(nodeStr, i), paramSweepCount, defaultToRange)); i = paramSkipIndex(nodeStr, i); break; } @@ -162,11 +137,47 @@ Componant *Model::processBracket(std::string& str, size_t paramSweepCount) return nullptr; } -Model::Model(const std::string& str, size_t paramSweepCount): _modelStr(str) +std::string Model::getParamStr(const std::string& str, size_t index) +{ + if(static_cast<int64_t>(str.size())-index < 3 || str[index+1] != '{') + { + Log(Log::WARN)<<"missing parameter string for "<<str[index]; + return ""; + } + + size_t end = opposingBraket(str, index, '}'); + std::string parameterStr = str.substr(index+2, end-index-2); + Log(Log::DEBUG)<<"param for "<<str[index]<<' '<<parameterStr; + return parameterStr; +} + +size_t Model::paramSkipIndex(const std::string& str, size_t index) +{ + if(index+2 > str.size() || str[index+1] != '{') + return index; + + size_t opposing = opposingBraket(str, index, '}'); + if(opposing != std::string::npos) + return opposing; + return index; +} + +Model::Model(const std::string& str, size_t paramSweepCount, bool defaultToRange): _modelStr(str) { size_t bracketCounter = 0; std::string strCpy(str); - _model = processBrackets(strCpy, bracketCounter, paramSweepCount); + _model = nullptr; + try + { + _model = processBrackets(strCpy, bracketCounter, paramSweepCount, defaultToRange); + } + catch(const parse_errror& err) + { + Log(Log::ERROR)<<err.what(); + if(_model != nullptr) + delete _model; + _model = nullptr; + } } Model::Model(const Model& in)