1 #pragma once
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <vector>
5 
6 using namespace std;
7 
8 #define EXPENSE_LOG 0
9 #define MRD 1000000000
10 
11 #if EXPENSE_LOG==1
12 
13 #define EXPENSE_DEFINE \
14 ExpenseLog EL; \
15 ExpenseModule* EngineExpense=EL.AddModule("Static Engine Expenses"); \
16 ExpenseModule* PPExpense=EL.AddModule("Static Post Processing"); \
17 ExpenseModule* AdrOpExpense=EL.AddModule("Adress Operator");
18 #define EXTERN_EXPENSE_DEFINE extern ExpenseLog EL;
19 #define ENGINEEXPENSE_DEFINE extern ExpenseModule* EngineExpense;
20 #define POSTPROCEXPENSE_DEFINE extern ExpenseModule* PPExpense;
21 #define ADREXPENSE_DEFINE extern ExpenseModule* AdrOpExpense;
22 #define ENGINEEXPENSE(IA,IM,DA,DM,AS,BO) EngineExpense->AddOperations((IA),(IM),(DA),(DM),(AS),(BO));
23 #define POSTPROCEXPENSE(IA,IM,DA,DM,AS,BO) PPExpense->AddOperations((IA),(IM),(DA),(DM),(AS),(BO));
24 #define ADRESSEXPENSE(IA,IM,DA,DM,AS,BO) AdrOpExpense->AddOperations((IA),(IM),(DA),(DM),(AS),(BO));
25 #define EXPENSEPRINT EL.PrintAll(stderr);
26 #define EXPENSECLEAR EL.ClearAll();
27 #else
28 
29 #define EXPENSE_DEFINE
30 #define EXTERN_EXPENSE_DEFINE
31 #define ENGINEEXPENSE_DEFINE
32 #define POSTPROCEXPENSE_DEFINE
33 #define ADREXPENSE_DEFINE
34 #define ENGINEEXPENSE(IA,IM,DA,DM,AS,BO)
35 #define POSTPROCEXPENSE(IA,IM,DA,DM,AS,BO)
36 #define ADRESSEXPENSE(IA,IM,DA,DM,AS,BO)
37 #define EXPENSEPRINT
38 #define EXPENSECLEAR
39 #endif
40 
41 class ExpenseModule
42 {
43 	friend class ExpenseLog;
44 public:
45 	ExpenseModule(const char* moduleName);
46 	~ExpenseModule();
47 
48 	void Clear();
49 
50 	void AddDoubleAdditons(unsigned int number);
51 	void AddDoubleMultiplications(unsigned int number);
52 
53 	void AddIntAdditons(unsigned int number);
54 	void AddIntMultiplications(unsigned int number);
55 
56 	void AddAssignments(unsigned int number);
57 	void AddBoolOperations(unsigned int number);
58 
59 	void AddOperations(unsigned int IntAdd, unsigned int IntMul, unsigned int DoubleAdd, unsigned int DoubleMul, unsigned int Assigns, unsigned int BoolOp);
60 
61 	void PrintfSelf(FILE* file=stdout);
62 
63 protected:
64 	const char* chModuleName;
65 	unsigned int uiDoubleAdditions;
66 	unsigned int uiDoubleMultiplications;
67 	unsigned int uiIntAdditions;
68 	unsigned int uiIntMultiplications;
69 	unsigned int uiAssignments;
70 	unsigned int uiBoolOp;
71 	unsigned int uiMrdDA;
72 	unsigned int uiMrdDM;
73 	unsigned int uiMrdIA;
74 	unsigned int uiMrdIM;
75 	unsigned int uiMrdAssign;
76 	unsigned int uiMrdBO;
77 };
78 
79 class ExpenseLog
80 {
81 public:
82 	ExpenseLog(void);
83 	~ExpenseLog(void);
84 
85 	ExpenseModule* AddModule(const char* name);
86 	void PrintAll(FILE *file=stdout);
87 	void ClearAll();
88 protected:
89 	vector<ExpenseModule*> vModules;
90 };
91 
92 
93