OSDN Git Service

Initial Commit
[qcad/qcad.git] / calcunits / QCalcManager.cpp
1 //---------------------------------------------------------------------------\r
2 // Management Class of QCalcUnit\r
3 //---------------------------------------------------------------------------\r
4 #include <iostream>\r
5 #include <vector>\r
6 \r
7 #include "QCalcManager.h"\r
8 #include "QCompilerCntl.h"\r
9 #include "QCalcUnit.h"\r
10 #include "QBits.h"\r
11 //---------------------------------------------------------------------------\r
12 /**\r
13  * Constructor\r
14  */\r
15 QCalcManager::QCalcManager(void) {\r
16   mNumberOfQBits  = 0;\r
17   mQCalcUnits.clear();\r
18 }\r
19 //---------------------------------------------------------------------------\r
20 /**\r
21  * Constructor\r
22  */\r
23 QCalcManager::QCalcManager(std::istream &is){\r
24   mNumberOfQBits  = 0;\r
25   mQCalcUnits.clear();\r
26   AddFromIntermediate(is);\r
27 }\r
28 //---------------------------------------------------------------------------\r
29 /**\r
30  * Destructor\r
31  */\r
32 QCalcManager::~QCalcManager(){\r
33   DeleteAll();\r
34 }\r
35 //---------------------------------------------------------------------------\r
36 // Interfaces\r
37 //---------------------------------------------------------------------------\r
38 /**\r
39  *  Compile intermediate\r
40  */\r
41 bool\r
42 QCalcManager::AddFromIntermediate(std::istream &is) {\r
43   QCompilerCntl qccntl(is);\r
44   QCalcUnit *cu;\r
45   DeleteAll();\r
46   if (true == qccntl.Compile()) {\r
47     unsigned int cntl_size = qccntl.GetNumberOfControl();\r
48     for (unsigned int i = 0; i < cntl_size; i++) {\r
49       cu = qccntl.AllocateControl(i);\r
50       if (NULL != cu) mQCalcUnits.push_back(cu);\r
51     }\r
52     mNumberOfQBits = qccntl.GetNumberOfQBits();\r
53     return true;\r
54   }else{\r
55     return false;\r
56   }\r
57 }\r
58 //---------------------------------------------------------------------------\r
59 /**\r
60  *  Calculate\r
61  */\r
62 void\r
63 QCalcManager::Calc(QBits * const qBits) {\r
64   if (qBits->GetNumberOfQBits() >= mNumberOfQBits) {\r
65     int unit_count = mQCalcUnits.size();\r
66     for (int i = 0; i < unit_count; i++) {\r
67       mQCalcUnits[i]->Calc(qBits);\r
68     }\r
69   } else {\r
70     //TODO: Error\r
71   }\r
72 }\r
73 //---------------------------------------------------------------------------\r
74 /**\r
75  *  AddUnit\r
76  */\r
77 void\r
78 QCalcManager::AddUnit(QCalcUnit *qc) {\r
79   if (qc) {\r
80     mQCalcUnits.push_back(qc);\r
81   }\r
82 }\r
83 //---------------------------------------------------------------------------\r
84 /**\r
85  *  Delete units\r
86  */\r
87 void\r
88 QCalcManager::DeleteAll(void) {\r
89   mNumberOfQBits  = 0;\r
90   int vec_size = mQCalcUnits.size();\r
91   for (int i = 0; i < vec_size; i++) {\r
92     delete mQCalcUnits[i];\r
93   }\r
94   mQCalcUnits.clear();\r
95 }\r
96 //---------------------------------------------------------------------------\r