X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fstatistics%2FEngine.cpp;h=5417e4ec4528b8f203f9591de7d9b2d565d73b3a;hb=5a6cba5fde2b2f538a7515f8293cc0a8d9589dfa;hp=ebde06c7fbc2748252db21216af76a0d7a6377b1;hpb=c6b62fd814b6e5b4e3ba65b6f092f6aa4e1d298d;p=anna.git diff --git a/source/statistics/Engine.cpp b/source/statistics/Engine.cpp index ebde06c..5417e4e 100644 --- a/source/statistics/Engine.cpp +++ b/source/statistics/Engine.cpp @@ -39,15 +39,15 @@ Engine::Engine() { //------------------------------------------------------------ Engine::~Engine() //------------------------------------------------------------------------------ Engine::~Engine() { - for (_accumulator_vector_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) - delete (*it); + for (_accumulator_map_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) + delete (it->second); } //------------------------------------------------------------------------------ //--------------------------------------------------------- Engine::addConcept() //------------------------------------------------------------------------------ -int Engine::addConcept(const std::string & description, const std::string & unit, const bool & integerNatureSample) throw() { +int Engine::addConcept(const std::string & description, const std::string & unit, const bool & integerNatureSample) { a_sequence_concept_id++; _concept_identification_t aux; aux.SampleFile = ""; // sample dump disabled by default for new concepts @@ -62,7 +62,7 @@ int Engine::addConcept(const std::string & description, const std::string & unit //------------------------------------------------------------------------------ //--------------------------------------------------------- Engine::getConcept() //------------------------------------------------------------------------------ -bool Engine::getConcept(const int & id, std::string & description, std::string & unit, bool & integerNatureSample) const throw() { +bool Engine::getConcept(const int & id, std::string & description, std::string & unit, bool & integerNatureSample) const { _concept_identification_map_iter it = a_concept_identification_map.find(id); if(it == a_concept_identification_map.end()) return false; @@ -77,7 +77,7 @@ bool Engine::getConcept(const int & id, std::string & description, std::string & //------------------------------------------------------------------------------ //---------------------------------------------------- Engine::enableSampleLog() //------------------------------------------------------------------------------ -bool Engine::enableSampleLog(const int & id, const char *sampleFileName) throw() { +bool Engine::enableSampleLog(const int & id, const char *sampleFileName) { _concept_identification_map_nc_iter it; std::string providedName = sampleFileName ? sampleFileName : "sample"; std::string *SampleFile_ptr; @@ -99,12 +99,9 @@ bool Engine::enableSampleLog(const int & id, const char *sampleFileName) throw() // For all concepts: _concept_identification_map_nc_iter it_min(a_concept_identification_map.begin()); _concept_identification_map_nc_iter it_max(a_concept_identification_map.end()); - for(it = it_min; it != it_max; it++) { realName = ""; - if(providedName != "") realName = anna::functions::asString("%s.%d.csv", providedName.c_str(), (*it).first); - SampleFile_ptr = &((*it).second.SampleFile); *SampleFile_ptr = realName; } @@ -116,22 +113,28 @@ bool Engine::enableSampleLog(const int & id, const char *sampleFileName) throw() //------------------------------------------------------------------------------ //--------------------------------------------------- Engine::disableSampleLog() //------------------------------------------------------------------------------ -bool Engine::disableSampleLog(const int & id) throw() { - _concept_identification_map_nc_iter it = a_concept_identification_map.find(id); +bool Engine::disableSampleLog(const int & id) { - if(it == a_concept_identification_map.end()) return false; + if(id != -1) { + _concept_identification_map_nc_iter it = a_concept_identification_map.find(id); - // Access to map - std::string *SampleFile_ptr = &((*it).second.SampleFile); - *SampleFile_ptr = ""; - return true; + if(it == a_concept_identification_map.end()) return false; + + // Access to map + std::string *SampleFile_ptr = &((*it).second.SampleFile); + *SampleFile_ptr = ""; + return true; + } + + // For all concepts: + return enableSampleLog(id /* -1 */, ""); } //------------------------------------------------------------------------------ //--------------------------------------------------- Engine::disableSampleLog() //------------------------------------------------------------------------------ -bool Engine::logSample(const int & conceptId, const anna::Millisecond & unixTimestamp, const double & value) const throw() { +bool Engine::logSample(const int & conceptId, const anna::Millisecond & unixTimestamp, const double & value) const { anna::Guard guard(a_mutex); _concept_identification_map_iter it = a_concept_identification_map.find(conceptId); @@ -156,13 +159,26 @@ bool Engine::logSample(const int & conceptId, const anna::Millisecond & unixTime //------------------------------------------------------------------------------ -//----------------------------------------------------------- Engine::asString() +//-------------------------------------------------- Engine::createAccumulator() //------------------------------------------------------------------------------ -Accumulator *Engine::createAccumulator(const std::string &name) throw() { - Accumulator *result; +Accumulator *Engine::createAccumulator(const std::string &name) noexcept(false) { + Accumulator *result = getAccumulator(name); + + if (result) + throw anna::RuntimeException(anna::functions::asString("Cannot register another accumulator with the same name: %s", name.c_str()), ANNA_FILE_LOCATION); result = new Accumulator(name); - a_accumulators.push_back(result); + a_accumulators[name] = result; + return result; +} + +Accumulator* Engine::getAccumulator(const std::string &name) { + Accumulator *result = NULL; + + _accumulator_map_nc_it it = a_accumulators.find(name); + if (it != a_accumulators.end()) + result = it->second; + return result; } @@ -170,7 +186,7 @@ Accumulator *Engine::createAccumulator(const std::string &name) throw() { //------------------------------------------------------------------------------ //----------------------------------------------------------- Engine::asString() //------------------------------------------------------------------------------ -std::string Engine::asString(void) const throw() { +std::string Engine::asString(void) const { std::string trace; _concept_identification_map_iter iter; _concept_identification_map_iter iter_min(a_concept_identification_map.begin()); @@ -193,7 +209,7 @@ std::string Engine::asString(void) const throw() { trace += "\n"; trace += "\n Concept id: "; trace += anna::functions::asString((*iter).first); - if((*iter).second.SampleFile != "") trace += "\n Sample file: "; trace += (*iter).second.SampleFile; + if((*iter).second.SampleFile != "") { trace += "\n Sample file: "; trace += (*iter).second.SampleFile; } trace += "\n Description: "; trace += (*iter).second.Description; trace += "\n Unit: "; trace += (*iter).second.Unit; @@ -204,9 +220,9 @@ std::string Engine::asString(void) const throw() { // Accumulators: trace += "\nNumber of accumulators= "; trace += anna::functions::asString(a_accumulators.size()); - for (_accumulator_vector_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) { + for (_accumulator_map_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) { trace += "\n"; - trace += (*it)->asString(); + trace += it->second->asString(); } return (trace); @@ -216,7 +232,7 @@ std::string Engine::asString(void) const throw() { //------------------------------------------------------------------------------ //-------------------------------------------------------------- Engine::asXML() //------------------------------------------------------------------------------ -anna::xml::Node* Engine::asXML(anna::xml::Node* parent, const int & numberOfDecimals) const throw() { +anna::xml::Node* Engine::asXML(anna::xml::Node* parent, const int & numberOfDecimals) const { anna::xml::Node* result = parent->createChild("anna.statistics.Engine"); _concept_identification_map_iter iter; _concept_identification_map_iter iter_min(a_concept_identification_map.begin()); @@ -240,8 +256,8 @@ anna::xml::Node* Engine::asXML(anna::xml::Node* parent, const int & numberOfDeci // Accumulators: anna::xml::Node* accumulators = result->createChild("anna.statistics.Accumulators"); accumulators->createAttribute("RegisteredAccumulators", a_accumulators.size()); - for (_accumulator_vector_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) - (*it)->asXML(accumulators); + for (_accumulator_map_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) + it->second->asXML(accumulators); return result; }