Remove dynamic exceptions
[anna.git] / include / anna / core / oam / CounterScope.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_core_oam_CounterScope_hpp
10 #define anna_core_oam_CounterScope_hpp
11
12 #include <anna/core/functions.hpp>
13 #include <anna/core/RuntimeException.hpp>
14 #include <anna/core/mt/Mutex.hpp>
15
16 #include <anna/core/oam/Counter.hpp>
17
18 namespace anna {
19
20 class Guard;
21
22 namespace xml {
23 class Node;
24 }
25
26 namespace oam {
27
28
29 /**
30    Ámbito de contadores. Contiene un grupo logico de contadores.
31 */
32 class CounterScope  : public Mutex {
33 public:
34
35   static const int MaxCounter = 1000; /**< Numero maximo de contador por cada ambito */
36
37   /**
38      Destructor.
39   */
40   ~CounterScope();
41
42   /**
43      Devuelve el nombre logico del contador, que coincidira con el indicado a la hora
44      de crear el contador mediante el metodo CounterScope::create.
45      \return El nombre logico del contador.
46   */
47   const std::string& getName() const { return a_name; }
48
49   /**
50      Devuelve el identificador del ambito
51      \return El identificador del ambito.
52   */
53   const int getId() const { return a_id; }
54
55   /**
56      Crea un nuevo contador.
57      \param counter Numero logico del contador a crear. Debera ser menor de MaxCounter.
58      \param name Nombre logico del ambito.
59   */
60   void create(const int counter, const char* name) noexcept(false);
61
62   /**
63      Devuelve una cadena con la informacion relevante de este objeto.
64      \return Una cadena con la informacion relevante de este objeto.
65   */
66   std::string asString() const ;
67
68   /**
69    * Devuelve la información relevante de esta instancia en un documento XML.
70    * \return la información relevante de esta instancia en un documento XML.
71    */
72   xml::Node* asXML(xml::Node* parent) const noexcept(false);
73
74 protected:
75   /**
76    * Incrementa el contador recibido como parámetro.
77    * \warning La invocación a este método deberá hacerse sobre una sección crítica que proteja
78    * a este ámbito.
79    * \return El valor actual del contador.
80    */
81   Counter::type_t increment(const int counter, const Counter::type_t value) noexcept(false);
82
83   /**
84    * Establece el valor del contador recibido como parámetro.
85    * \warning La invocación a este método deberá hacerse sobre una sección crítica que proteja
86    * a este ámbito.
87    * \return El valor actual del contador.
88    */
89   Counter::type_t assign(const int counter, const Counter::type_t value) noexcept(false);
90
91   /**
92    * Devuelve el valor actual del contador pasado como parámetro.
93    * \param counter Identificador del contedor cuyo valor queremos obtener.
94    */
95   Counter::type_t getValue(const int counter) const noexcept(false);
96
97   /**
98    * Devuelve la instancia del contador. Puede ser NULL.
99    * \return la instancia del contador.
100    */
101   const Counter* getCounter(const int counter) const noexcept(false);
102
103 public:
104
105   /**
106    * Devuelve el valor actual acumulado del contador pasado como parámetro.
107    * \param counter Identificador del contedor cuyo valor acumulado queremos obtener.
108    */
109   U64 getAccValue(const int counter) const noexcept(false);
110
111   /**
112    * Resetea los valores acumulados totales de los contadores incluidos en el ámbito.
113    * \return Numero de contadores afectados que tenian un acumulado no nulo.
114    */
115   int resetAccValues() noexcept(false);
116
117 private:
118   const int a_id;
119   const std::string a_name;
120   Counter* a_counters [MaxCounter];
121
122   CounterScope(const int id, const char* name) :
123     Mutex(Mutex::Mode::Recursive),
124     a_id(id),
125     a_name(name) {
126     anna_memset(a_counters, 0, sizeof(a_counters));
127   }
128
129   friend class Safe;
130   friend class Handler;
131   friend class Module;
132 };
133
134 }
135 }
136
137 #endif
138