Remove dynamic exceptions
[anna.git] / include / anna / statistics / Engine.hpp
index bb376f8..e0c9233 100644 (file)
@@ -11,6 +11,8 @@
 
 #include <anna/core/Singleton.hpp>
 #include <anna/core/util/Millisecond.hpp>
+#include <anna/core/RuntimeException.hpp>
+#include <anna/core/mt/Mutex.hpp>
 
 // Standard
 #include <string>
@@ -32,6 +34,9 @@ namespace anna {
 namespace statistics {
 
 
+class Accumulator;
+
+
 typedef struct {
 
   std::string SampleFile; // Sample file to optional writtings
@@ -45,6 +50,9 @@ typedef std::map <int, _concept_identification_t> _concept_identification_map_t;
 typedef std::map <int, _concept_identification_t>::const_iterator _concept_identification_map_iter;
 typedef std::map <int, _concept_identification_t>::iterator _concept_identification_map_nc_iter;
 
+typedef std::map <std::string, Accumulator*> _accumulator_map_t;
+typedef std::map <std::string, Accumulator*>::const_iterator _accumulator_map_it;
+typedef std::map <std::string, Accumulator*>::iterator _accumulator_map_nc_it;
 
 
 /**
@@ -57,6 +65,9 @@ class Engine : public anna::Singleton <Engine> {
 
 public:
 
+  /** Destructor */
+  ~Engine();
+
   // Sets
 
   /**
@@ -71,19 +82,19 @@ public:
   *
   * @return Assigned concept identification number (sequence)
   */
-  int addConcept(const std::string & description, const std::string & unit, const bool & integerNatureSample = true) throw();
+  int addConcept(const std::string & description, const std::string & unit, const bool & integerNatureSample = true) ;
 
 
   /**
   * Stops statistics engine
   */
-  void enable(void) throw() { a_enabled = true; }
+  void enable(void) { a_enabled = true; }
 
 
   /**
   * Starts statistics engine
   */
-  void disable(void) throw() { a_enabled = false; }
+  void disable(void) { a_enabled = false; }
 
   /**
   * Enable sample log for statistics processings. Engine starts with this feature disabled. When a new concept id is added
@@ -98,17 +109,18 @@ public:
   * @return @em false if not concept is registered with provided id
   * @warning Many systems add concepts dynamically. This method only affects to current concepts registered at statistics engine.
   */
-  bool enableSampleLog(const int & id = -1, const char *sampleFileName = NULL) throw();
+  bool enableSampleLog(const int & id = -1, const char *sampleFileName = NULL) ;
 
 
   /**
   * Disable sample log for statistics processings
   *
-  * @param id Concept identification.
+  * @param id Concept identification. If -1 value is provided, all concepts will be deactivated.
   *
   * @return @em false if not concept is registered with provided id
+  * @warning Many systems add concepts dynamically. This method only affects to current concepts registered at statistics engine.
   */
-  bool disableSampleLog(const int & id) throw();
+  bool disableSampleLog(const int & id = -1) ;
 
   // Gets
 
@@ -122,13 +134,33 @@ public:
   *
   * @return @em false if not concept is registered with provided id
   */
-  bool getConcept(const int & id, std::string & description, std::string & unit, bool & integerNatureSample) const throw();
+  bool getConcept(const int & id, std::string & description, std::string & unit, bool & integerNatureSample) const ;
 
 
   /**
   * Boolean about engine state (enabled / disabled)
   */
-  bool enabled(void) const throw() { return (a_enabled); }
+  bool enabled(void) const { return (a_enabled); }
+
+
+  /**
+   * Creates a statistic accumulator
+   *
+   * @param name Accumulator name
+   *
+   * \return The accumulator created or exception when already exists for the provided name.
+   */
+  Accumulator *createAccumulator(const std::string &name) noexcept(false);
+
+  /**
+   * Returns accumulator instance identified by name.
+   *
+   * \param name Accumulator name
+   *
+   * \return The accumulator instance identified by name provided, NULL if not found
+   */
+  Accumulator* getAccumulator(const std::string &name) ;
+
 
 
   /**
@@ -136,7 +168,7 @@ public:
   *
   * @return String with class content
   */
-  std::string asString(void) const throw();
+  std::string asString(void) const ;
 
 
   /**
@@ -146,7 +178,7 @@ public:
   *
   * @return XML with class content
   */
-  anna::xml::Node* asXML(anna::xml::Node* parent, const int & numberOfDecimals = 2) const throw();
+  anna::xml::Node* asXML(anna::xml::Node* parent, const int & numberOfDecimals = 2) const ;
 
 
 private:
@@ -154,10 +186,12 @@ private:
   Engine(); // private constructor
 
   _concept_identification_map_t a_concept_identification_map;
+  _accumulator_map_t a_accumulators; // you could create accumulators regardless the engine, but this is easier and asXML will show all the information easily
   bool a_enabled;
   int a_sequence_concept_id;
+  anna::Mutex a_mutex; // for logSample
 
-  bool logSample(const int & conceptId, const anna::Millisecond & unixTimestamp, const double & value) const throw();
+  bool logSample(const int & conceptId, const anna::Millisecond & unixTimestamp, const double & value) const ;
 
   friend class anna::Singleton <Engine>;
   friend class Accumulator;