5
5
#include < wsjcpp_obj_tree.h>
6
6
#include < wsjcpp_obj_tree_node_building.h>
7
7
8
+ class CustomTree : public WsjcppObjTree {
9
+ public:
10
+ CustomTree () {
11
+ setUserVersionOfTree (1 );
12
+ addSupportType<WsjcppObjTreeNodeString>();
13
+ addSupportType<WsjcppObjTreeNodeInteger>();
14
+ addSupportType<WsjcppObjTreeNodeFloat>();
15
+ addSupportType<WsjcppObjTreeNodeDouble>();
16
+ addSupportType<WsjcppObjTreeNodeBuilding>();
17
+ }
18
+ void fillExample () {
19
+ clearNodes ();
20
+ Address addr0 (" Morpheus" ," 1/35a" );
21
+ WsjcppObjTreeChainDeclare chain (this );
22
+ chain
23
+ .add (addr0)
24
+ .up ()
25
+ .add (" Motherboard" )
26
+ .add (" CPU_SOCKET" )
27
+ .add (" count" )
28
+ .add (1 ).up ()
29
+ .up ()
30
+ .add (" frequency" )
31
+ .add (3.2 ).up ()
32
+ .up ()
33
+ .up ()
34
+ .add (" GPU_SOCKET" )
35
+ .add (1 ).up ()
36
+ .up ()
37
+ .add (" USB-A" )
38
+ .add (4 ).up ()
39
+ .up ()
40
+ .add (" PCI" )
41
+ .add (3 ).up ()
42
+ .up ()
43
+ .add (" PCI_EXPRESS" )
44
+ .add (1 ).up ()
45
+ .up ()
46
+ .up ()
47
+ ;
48
+
49
+ std::vector<WsjcppObjTreeNodeBuilding *> vFoundNodes;
50
+ if (this ->findNodes (addr0, vFoundNodes) > 0 ) {
51
+ for (int i = 0 ; i < vFoundNodes.size (); i++) {
52
+ vFoundNodes[i]->setNumberOfFloors (5 );
53
+ }
54
+ }
55
+ }
56
+
57
+ void randomTree (int nSize) {
58
+ long nTime = WsjcppCore::currentTime_milliseconds ();
59
+ std::cout << " Starting generate random tree with " << nSize << " nodes..." << std::endl;
60
+ WsjcppCore::initRandom ();
61
+ long nTimeStep = nTime;
62
+ for (int i = 0 ; i < nSize; i++) {
63
+ uint16_t nType = rand () % 4 ;
64
+ WsjcppObjTreeNode *pParentNode = nullptr ;
65
+ if (getAllNodes ().size () > 0 ) {
66
+ int nParentIdx = rand () % getAllNodes ().size ();
67
+ pParentNode = getAllNodes ()[nParentIdx];
68
+ }
69
+
70
+ if (nType == 0 ) {
71
+ auto *pNode = new WsjcppObjTreeNodeString (this , WsjcppCore::createUuid ());
72
+ addNode (pParentNode, pNode);
73
+ } else if (nType == 1 ) {
74
+ auto *pNode = new WsjcppObjTreeNodeInteger (this , rand () % 100000 );
75
+ addNode (pParentNode, pNode);
76
+ } else if (nType == 2 ) {
77
+ double nVal = rand () % 1000000 ;
78
+ nVal /= 100 ;
79
+ auto *pNode = new WsjcppObjTreeNodeDouble (this , nVal);
80
+ addNode (pParentNode, pNode);
81
+ } else if (nType == 3 ) {
82
+ std::string s1 = WsjcppCore::createUuid ();
83
+ std::string s2 = WsjcppCore::createUuid ();
84
+ Address (s1,s2);
85
+ auto *pNode = new WsjcppObjTreeNodeBuilding (this , Address (s1,s2));
86
+ pNode->setNumberOfFloors (rand () % 100 );
87
+ addNode (pParentNode, pNode);
88
+ }
89
+ if (WsjcppCore::currentTime_milliseconds () - nTimeStep > 3000 ) {
90
+ long nTimeElapsed = WsjcppCore::currentTime_milliseconds () - nTime;
91
+ long nTimeLeft = (nTimeElapsed * (nSize - i)) / i;
92
+ int nProcents = i*100 /nSize;
93
+ std::cout
94
+ << " Generated (" << nProcents << " %) "
95
+ << i << " /" << nSize << " nodes."
96
+ << " Time elapsed: " << (WsjcppCore::currentTime_milliseconds () - nTime) << " ms. "
97
+ << " Time left until completion " << nTimeLeft << " ms"
98
+ << std::endl;
99
+
100
+ nTimeStep = WsjcppCore::currentTime_milliseconds ();
101
+ }
102
+ }
103
+ nTime = WsjcppCore::currentTime_milliseconds () - nTime;
104
+ std::cout << " Finished. Time elapsed " << nTime << " ms" << std::endl;
105
+ }
106
+
107
+ };
108
+
109
+ void printHelp (std::string sProgramName ) {
110
+ std::cout << std::endl
111
+ << " Usage: " << sProgramName << " [OPTIONS]" << std::endl
112
+ << " Options: " << std::endl
113
+ << " --help | -h help" << std::endl
114
+ << " Input or source data can be (only one): " << std::endl
115
+ << " --input <file> | -i <file> input binary file with tree" << std::endl
116
+ << " --random N | -r N generate random data (more than 0 and less than 1000000)" << std::endl
117
+ << " --example | -e hardcoded example" << std::endl
118
+ << " Output data can be (only one): " << std::endl
119
+ << " --output <file> | -o <file> output binary file for tree" << std::endl
120
+ << " --print | -p output binary file for tree" << std::endl
121
+ << std::endl
122
+ << " Command examples:" << std::endl
123
+ << " Print example of the tree: " << std::endl
124
+ << " '" << sProgramName << " -e -p'" << std::endl
125
+ << " Print random tree: " << std::endl
126
+ << " '" << sProgramName << " -r 20 -p'" << std::endl
127
+ << " Output example of the tree to file: " << std::endl
128
+ << " '" << sProgramName << " -e -o some.wsjcpp-obj-tree'" << std::endl
129
+ << " Input from file and output to file: " << std::endl
130
+ << " '" << sProgramName << " -i some.wsjcpp-obj-tree -o some2.wsjcpp-obj-tree'" << std::endl
131
+ << std::endl
132
+ ;
133
+ };
134
+
8
135
int main (int argc, const char * argv[]) {
9
136
std::string TAG = " MAIN" ;
10
137
std::string appName = std::string (WSJCPP_APP_NAME);
@@ -14,60 +141,132 @@ int main(int argc, const char* argv[]) {
14
141
}
15
142
WsjcppLog::setPrefixLogFile (" wsjcpp" );
16
143
WsjcppLog::setLogDirectory (" .logs" );
17
-
18
- WsjcppObjTree tree;
19
- tree.addSupportType <WsjcppObjTreeNodeString>();
20
- tree.addSupportType <WsjcppObjTreeNodeInteger>();
21
- tree.addSupportType <WsjcppObjTreeNodeFloat>();
22
- tree.addSupportType <WsjcppObjTreeNodeDouble>();
23
- tree.addSupportType <WsjcppObjTreeNodeBuilding>();
24
-
25
- Address addr0 (" Morpheus" ," 1/35a" );
26
-
27
- WsjcppObjTreeChainDeclare chain (&tree);
28
- chain
29
- .add (addr0)
30
- .up ()
31
- .add (" Motherboard" )
32
- .add (" CPU_SOCKET" )
33
- .add (" count" )
34
- .add (1 ).up ()
35
- .up ()
36
- .add (" frequency" )
37
- .add (3.2 ).up ()
38
- .up ()
39
- .up ()
40
- .add (" GPU_SOCKET" )
41
- .add (1 ).up ()
42
- .up ()
43
- .add (" USB-A" )
44
- .add (4 ).up ()
45
- .up ()
46
- .add (" PCI" )
47
- .add (3 ).up ()
48
- .up ()
49
- .add (" PCI_EXPRESS" )
50
- .add (1 ).up ()
51
- .up ()
52
- .up ()
53
- ;
54
-
55
- std::vector<WsjcppObjTreeNodeBuilding *> vFoundNodes;
56
- if (tree.findNodes (addr0, vFoundNodes) > 0 ) {
57
- for (int i = 0 ; i < vFoundNodes.size (); i++) {
58
- vFoundNodes[i]->setNumberOfFloors (5 );
144
+
145
+ std::vector<std::string> vArgs;
146
+ for (int i = 0 ; i < argc; i++) {
147
+ vArgs.push_back (std::string (argv[i]));
148
+ }
149
+ std::string sProgramName = vArgs[0 ];
150
+
151
+ // print help
152
+ for (int i = 0 ; i < vArgs.size (); i++) {
153
+ if (vArgs[i] == " -h" || vArgs[i] == " --help" ) {
154
+ printHelp (sProgramName );
155
+ return 0 ;
59
156
}
60
157
}
61
158
62
- std::cout << tree.toString ();
159
+ // select input
160
+ int nInputDefined = -1 ;
161
+ int nRandomSize = -1 ;
162
+ std::string sInputFile = " " ;
163
+ for (int i = 0 ; i < vArgs.size (); i++) {
164
+ std::string sArg = vArgs[i];
165
+ if (sArg == " -i" || sArg == " --input" ) {
166
+ nInputDefined = 1 ;
167
+ if (i + 1 >= vArgs.size ()) {
168
+ std::cout << " FAILED: after '" << sArg << " ' expected filename" << std::endl;
169
+ return -1 ;
170
+ }
171
+ sInputFile = vArgs[i+1 ];
172
+ if (!WsjcppCore::fileExists (sInputFile )) {
173
+ std::cout << " FAILED: Input file '" << sInputFile << " ' not exists" << std::endl;
174
+ return -1 ;
175
+ }
176
+ } else if (sArg == " -r" || sArg == " --random" ) {
177
+ nInputDefined = 2 ;
178
+ if (i + 1 >= vArgs.size ()) {
179
+ std::cout << " FAILED: after '" << sArg << " ' expected number argument" << std::endl;
180
+ return -1 ;
181
+ }
182
+ nRandomSize = std::atoi (vArgs[i+1 ].c_str ());
183
+ if (nRandomSize < 0 ) {
184
+ std::cout << " FAILED: after '" << sArg << " ' expected number more than 0" << std::endl;
185
+ return -1 ;
186
+ }
187
+ if (nRandomSize > 1000000 ) {
188
+ std::cout << " FAILED: after '" << sArg << " ' expected number less than 1000000" << std::endl;
189
+ return -1 ;
190
+ }
191
+ } else if (sArg == " -e" || sArg == " --example" ) {
192
+ nInputDefined = 3 ;
193
+ }
194
+ }
63
195
64
- std::string sError ;
65
- tree.writeTreeToFile (" some.obj-tree" , sError );
66
- tree.readTreeFromFile (" some.obj-tree" , sError );
196
+ if (nInputDefined == -1 ) {
197
+ std::cout << " FAILED: way for input data not defined" << std::endl
198
+ << " Please try " << sProgramName << " --help " << std::endl
199
+ << std::endl;
200
+ return -1 ;
201
+ }
67
202
68
- std::cout << tree.toString ();
69
- WsjcppCore::removeFile (" some.obj-tree" );
203
+ // select output
204
+ int nOutputDefined = -1 ;
205
+ std::string sOutputFile = " " ;
206
+ for (int i = 0 ; i < vArgs.size (); i++) {
207
+ std::string sArg = vArgs[i];
208
+ if (sArg == " -o" || sArg == " --output" ) {
209
+ nOutputDefined = 1 ;
210
+ if (i + 1 >= vArgs.size ()) {
211
+ std::cout << " FAILED: after '" << sArg << " ' expected filename" << std::endl;
212
+ return -1 ;
213
+ }
214
+ sOutputFile = vArgs[i+1 ];
215
+ } else if (sArg == " -p" || sArg == " --print" ) {
216
+ nOutputDefined = 2 ;
217
+ }
218
+ }
219
+
220
+ if (nOutputDefined == -1 ) {
221
+ std::cout << " FAILED: way for output data not defined" << std::endl
222
+ << " Please try " << sProgramName << " --help " << std::endl
223
+ << std::endl;
224
+ return -1 ;
225
+ }
70
226
227
+ std::string sError ;
228
+ CustomTree tree;
229
+
230
+ long nTime = WsjcppCore::currentTime_milliseconds ();
231
+ switch (nInputDefined) {
232
+ case 1 : // input file
233
+ std::cout << " Reading file... " << sInputFile << std::endl;
234
+ if (!tree.readTreeFromFile (sInputFile , sError )) {
235
+ std::cout << " FAILED: Could not read file " << sInputFile << std::endl
236
+ << sError << std::endl
237
+ << std::endl;
238
+ return -1 ;
239
+ }
240
+ nTime = WsjcppCore::currentTime_milliseconds () - nTime;
241
+ std::cout << " Readed. Time elapsed " << nTime << " ms" << std::endl;
242
+ break ;
243
+ case 2 : // random
244
+ tree.randomTree (nRandomSize);
245
+ break ;
246
+ case 3 : // example
247
+ tree.fillExample ();
248
+ break ;
249
+ }
250
+
251
+ nTime = WsjcppCore::currentTime_milliseconds ();
252
+ switch (nOutputDefined) {
253
+ case 1 :
254
+ std::cout << " Writing file... " << sOutputFile << std::endl;
255
+ if (!tree.writeTreeToFile (sOutputFile , sError )) {
256
+ std::cout << " FAILED: Could not write file " << sOutputFile << std::endl
257
+ << sError << std::endl
258
+ << std::endl;
259
+ return -1 ;
260
+ }
261
+ nTime = WsjcppCore::currentTime_milliseconds () - nTime;
262
+ std::cout << " Wrote. Time elapsed " << nTime << " ms" << std::endl;
263
+ break ;
264
+ case 2 :
265
+ std::cout << tree.toString ();
266
+ nTime = WsjcppCore::currentTime_milliseconds () - nTime;
267
+ std::cout << " Printed. Time elapsed " << nTime << " ms" << std::endl;
268
+ break ;
269
+ }
71
270
return 0 ;
72
271
}
73
272
0 commit comments