X-Git-Url: https://git.teslayout.com/public/public/public/?p=anna.git;a=blobdiff_plain;f=source%2Fstatistics%2FEngine.cpp;h=e804599713f8411ec08128b81e3f6019d21dd5c9;hp=ebde06c7fbc2748252db21216af76a0d7a6377b1;hb=028006fc5ee34967fcfffff24a2b1c8b410c26c3;hpb=3b71d6454d211ec50c2f3e04b04c607c382f2f29 diff --git a/source/statistics/Engine.cpp b/source/statistics/Engine.cpp index ebde06c..e804599 100644 --- a/source/statistics/Engine.cpp +++ b/source/statistics/Engine.cpp @@ -39,8 +39,8 @@ 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); } @@ -156,13 +156,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) throw(anna::RuntimeException) { + 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) throw() { + Accumulator *result = NULL; + + _accumulator_map_nc_it it = a_accumulators.find(name); + if (it != a_accumulators.end()) + result = it->second; + return result; } @@ -204,9 +217,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); @@ -240,8 +253,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; }