Merge with trunk r41342
[blender-staging.git] / source / gameengine / Ketsji / KX_TimeCategoryLogger.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file KX_TimeCategoryLogger.h
29  *  \ingroup ketsji
30  */
31
32 #ifndef __KX_TIME_CATEGORY_LOGGER_H
33 #define __KX_TIME_CATEGORY_LOGGER_H
34
35 #if defined(WIN32) && !defined(FREE_WINDOWS)
36 #pragma warning (disable:4786) // suppress stl-MSVC debug info warning
37 #endif
38
39 #include <map>
40
41 #include "KX_TimeLogger.h"
42
43 /**
44  * Stores and manages time measurements by category.
45  * Categories can be added dynamically.
46  * Average measurements can be established for each separate category
47  * or for all categories together.
48  */
49 class KX_TimeCategoryLogger {
50 public:
51         typedef int TimeCategory;
52
53         /**
54          * Constructor.
55          * @param maxNumMesasurements Maximum number of measurements stored (> 1).
56          */
57         KX_TimeCategoryLogger(unsigned int maxNumMeasurements = 10);
58
59         /**
60          * Destructor.
61          */
62         virtual ~KX_TimeCategoryLogger(void);
63
64         /**
65          * Changes the maximum number of measurements that can be stored.
66          */
67         virtual void SetMaxNumMeasurements(unsigned int maxNumMeasurements);
68
69         /**
70          * Changes the maximum number of measurements that can be stored.
71          */
72         virtual unsigned int GetMaxNumMeasurements(void) const;
73
74         /**
75          * Adds a category.
76          * @param category      The new category.
77          */
78         virtual void AddCategory(TimeCategory tc);
79
80         /**
81          * Starts logging in current measurement for the given category.
82          * @param tc                                    The category to log to.
83          * @param now                                   The current time.
84          * @param endOtherCategories    Whether to stop logging to other categories.
85          */
86         virtual void StartLog(TimeCategory tc, double now, bool endOtherCategories = true);
87
88         /**
89          * End logging in current measurement for the given category.
90          * @param tc    The category to log to.
91          * @param now   The current time.
92          */
93         virtual void EndLog(TimeCategory tc, double now);
94
95         /**
96          * End logging in current measurement for all categories.
97          * @param now   The current time.
98          */
99         virtual void EndLog(double now);
100
101         /**
102          * Logs time in next measurement.
103          * @param now   The current time.
104          */
105         virtual void NextMeasurement(double now);
106
107         /**
108          * Returns average of all but the current measurement time.
109          * @return The average of all but the current measurement.
110          */
111         virtual double GetAverage(TimeCategory tc);
112
113         /**
114          * Returns average for grand total.
115          */
116         virtual double GetAverage(void);
117
118 protected:
119         /**  
120          * Disposes loggers.
121          */  
122         virtual void DisposeLoggers(void);
123
124         /** Storage for the loggers. */
125         typedef std::map<TimeCategory, KX_TimeLogger*> KX_TimeLoggerMap;
126         KX_TimeLoggerMap m_loggers;
127         /** Maximum number of measurements. */
128         unsigned int m_maxNumMeasurements;
129
130
131 #ifdef WITH_CXX_GUARDEDALLOC
132 public:
133         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TimeCategoryLogger"); }
134         void operator delete( void *mem ) { MEM_freeN(mem); }
135 #endif
136 };
137
138 #endif // __KX_TIME_CATEGORY_LOGGER_H
139