Remove dynamic exceptions
[anna.git] / include / anna / timex / MicroMeter.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_timex_MicroMeter_hpp
10 #define anna_timex_MicroMeter_hpp
11
12 #include <anna/core/functions.hpp>
13
14 namespace anna {
15
16 namespace timex {
17
18 /**
19    Facilita la medicion de los tiempos empleados las distintas partes de nuestra aplicacion.
20
21    Permite calcular tiempos acumulados como tiempos individuales. Por ejemplo:
22
23    \code
24
25    #include <anna.timex.MicroMeter.h>
26
27    void foo () {
28       timex::MicroMeter meter;
29
30       goo ();
31       Microsecond gooTime = meter.getDelay ();
32
33       hoo ();
34       Microsecond goohooTime = meter.setControlPoint ();
35
36       joo ();
37       Microsecond jooTime = meter.getDelay ();
38    }
39    \endcode
40 */
41 class MicroMeter {
42 public:
43   /**
44      Constructor
45      Inicializa la cuenta de temporizacion.
46   */
47   MicroMeter() { a_timestamp = functions::microsecond(); a_topReference = (Microsecond)0; }
48
49   /**
50    * Constructor copia.
51    * Copia la cuenta de utilizacion de la instancia recibida como parametro.
52    * \param other Instancia de la copiar los parametros para calcular el tiempo transcurrido.
53    */
54   MicroMeter(const MicroMeter& other) : a_timestamp(other.a_timestamp) { a_topReference = (Microsecond)0; ;}
55
56   /**
57    * Inicializa la cuenta de temporizacion. Este metodo es invocado automaticamente desde el contructor la clase
58    * por lo que si vamos usar esta instancia para tomar un unica medida no es necesario invocarlo.
59    * \warning Elimina el punto de referencia temporal que puediera haberse establecido con #setTopReference.
60    * \return El número de milisegundos transcurridos desde la última vez que inicializamos la cuenta de temporizacion.
61    */
62   Microsecond setControlPoint() {
63     Microsecond now = functions::microsecond();
64     Microsecond result = (now > a_timestamp) ? (now - a_timestamp) : (Microsecond)0;
65     a_timestamp = now;
66     clearTopReference();
67     return result;
68   }
69
70   /**
71    * Se da la posiblidad de establecer un punto de referencia temporal de forma
72    * que cuando se invoque a MicroMeter::getDelay, el calculo de la diferencia de tiempo
73    * no se hará entre la marca de tiempo y el tiempo actual, sino la marca de
74    * tiempo y ésta marca de referencia.
75    *
76    * Esta funcionalidad ha sido requerida para medir el tiempo de ejecución "real"
77    * de tareas que se ejecutan dentro de un thread. Ya que puede pasar un tiempo
78    * indeterminado desde que se termina la tarea MT (momento en el que se establecerá
79    * la marca de tiempo) y el núcleo y demás partes pueden tener conocimiento de que
80    * esa tarea ha sido finalidad.
81    */
82   void setTopReference(const Microsecond & topReference) { a_topReference = topReference; }
83
84   /**
85    * Elimina el punto de referencia temporal.
86    */
87   void clearTopReference() { a_topReference = (Microsecond)0; }
88
89   /**
90    * Devuelve el número de milisegundos transcurridos desde la última vez que inicializamos la cuenta de temporización.
91    * Si se ha establecido un punto de referencia mediante #setTopReference, devolverá la diferencia entre el
92    * el punto de control y la referencia, en otro caso, devolverá la diferencia entre el punto de control y el
93    * momento actual.
94    * \return El número de milisegundos transcurridos desde la última vez que inicializamos la cuenta de temporizacion.
95    * \warning Si detecta algun fallo devolvera 0.
96    */
97   Microsecond getDelay() const {
98     Microsecond now = (a_topReference == 0) ? functions::microsecond() : a_topReference;
99     return (now > a_timestamp) ? (now - a_timestamp) : (Microsecond)0;
100   }
101
102   /**
103    * Operador copia.
104    * \param timestamp Milisegundo en el que inicilizar la cuenta de esta instancia.
105    * \warning Elimina el punto de referencia temporal que puediera haberse establecido con #setTopReference.
106    * \see anna::functions::microsecond.
107    */
108   MicroMeter& operator= (const Microsecond & timestamp) { a_timestamp = timestamp; a_topReference = (Microsecond)0; return *this; }
109
110   /**
111    * Operador copia.
112    * \param other Instancia de la que copiar.
113    */
114   MicroMeter& operator= (const MicroMeter& other) { a_timestamp = other.a_timestamp; a_topReference = other.a_topReference; return *this; }
115
116 private:
117   Microsecond a_topReference;
118   Microsecond a_timestamp;
119 };
120
121 }
122 }
123
124 #endif
125
126