55#include < wsjcpp_obj_tree.h>
66#include < wsjcpp_obj_tree_node_building.h>
77
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+
8135int main (int argc, const char * argv[]) {
9136 std::string TAG = " MAIN" ;
10137 std::string appName = std::string (WSJCPP_APP_NAME);
@@ -14,60 +141,132 @@ int main(int argc, const char* argv[]) {
14141 }
15142 WsjcppLog::setPrefixLogFile (" wsjcpp" );
16143 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 ;
59156 }
60157 }
61158
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+ }
63195
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+ }
67202
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+ }
70226
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+ }
71270 return 0 ;
72271}
73272
0 commit comments