X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fstatistics%2FEngine.cpp;h=e804599713f8411ec08128b81e3f6019d21dd5c9;hb=7a95a46884196bba99dec374276f229d84832a32;hp=b6e1ee1071b9d7a60af80062682f86de138aa26c;hpb=93366a0bda79e6fd6e7dad6316bfcf8cc82f5731;p=anna.git diff --git a/source/statistics/Engine.cpp b/source/statistics/Engine.cpp index b6e1ee1..e804599 100644 --- a/source/statistics/Engine.cpp +++ b/source/statistics/Engine.cpp @@ -9,7 +9,7 @@ // Local #include #include - +#include #include #include @@ -24,6 +24,10 @@ using namespace anna::statistics; //****************************************************************************** //----------------------------------------------------------------------- Engine //****************************************************************************** + +//------------------------------------------------------------------------------ +//------------------------------------------------------------- Engine::Engine() +//------------------------------------------------------------------------------ Engine::Engine() { statistics::sccs::activate(); a_enabled = false; @@ -31,6 +35,15 @@ Engine::Engine() { } +//------------------------------------------------------------------------------ +//------------------------------------------------------------ Engine::~Engine() +//------------------------------------------------------------------------------ +Engine::~Engine() { + for (_accumulator_map_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) + delete (it->second); +} + + //------------------------------------------------------------------------------ //--------------------------------------------------------- Engine::addConcept() //------------------------------------------------------------------------------ @@ -119,6 +132,8 @@ bool Engine::disableSampleLog(const int & id) throw() { //--------------------------------------------------- Engine::disableSampleLog() //------------------------------------------------------------------------------ bool Engine::logSample(const int & conceptId, const anna::Millisecond & unixTimestamp, const double & value) const throw() { + anna::Guard guard(a_mutex); + _concept_identification_map_iter it = a_concept_identification_map.find(conceptId); if(it == a_concept_identification_map.end()) return false; @@ -139,6 +154,32 @@ bool Engine::logSample(const int & conceptId, const anna::Millisecond & unixTime return true; } + +//------------------------------------------------------------------------------ +//-------------------------------------------------- Engine::createAccumulator() +//------------------------------------------------------------------------------ +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[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; +} + + //------------------------------------------------------------------------------ //----------------------------------------------------------- Engine::asString() //------------------------------------------------------------------------------ @@ -173,6 +214,14 @@ std::string Engine::asString(void) const throw() { } trace += "\n"; + + // Accumulators: + trace += "\nNumber of accumulators= "; trace += anna::functions::asString(a_accumulators.size()); + for (_accumulator_map_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) { + trace += "\n"; + trace += it->second->asString(); + } + return (trace); } @@ -201,6 +250,11 @@ anna::xml::Node* Engine::asXML(anna::xml::Node* parent, const int & numberOfDeci concept->createAttribute("IntegerNatureSample", (*iter).second.IntegerNatureSample ? "yes" : "no"); } + // Accumulators: + anna::xml::Node* accumulators = result->createChild("anna.statistics.Accumulators"); + accumulators->createAttribute("RegisteredAccumulators", a_accumulators.size()); + for (_accumulator_map_it it = a_accumulators.begin(); it != a_accumulators.end(); it++) + it->second->asXML(accumulators); + return result; } -