Skip to content

Commit 63f5d78

Browse files
committed
Implemented commands in main
1 parent db3a8d1 commit 63f5d78

File tree

3 files changed

+256
-49
lines changed

3 files changed

+256
-49
lines changed

src/main.cpp

+247-48
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,133 @@
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+
8135
int 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

src/wsjcpp_obj_tree.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,12 @@ bool WsjcppObjTree::hasNode(WsjcppObjTreeNode *pNode) {
293293

294294
// ---------------------------------------------------------------------
295295

296+
const std::vector<WsjcppObjTreeNode *> &WsjcppObjTree::getAllNodes() {
297+
return m_vNodes;
298+
}
299+
300+
// ---------------------------------------------------------------------
301+
296302
int WsjcppObjTree::getRoots(std::vector<WsjcppObjTreeNode *> &vRoots) {
297303
int nRet = 0;
298304
std::vector<WsjcppObjTreeNode *>::iterator it = m_vNodes.begin();
@@ -457,7 +463,7 @@ bool WsjcppObjTreeNodeString::readDataPartFromFile(std::ifstream &f, std::string
457463
}
458464
nStringLen = *reinterpret_cast<uint32_t*>(arrInteger);
459465
char *pStr = new char[nStringLen];
460-
466+
461467
f.read(pStr, nStringLen);
462468
if (!f) {
463469
delete[] pStr;

src/wsjcpp_obj_tree.h

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <wsjcpp_core.h>
55
#include <string>
66
#include <map>
7+
#include <fstream>
78

89
// not enum - because need more extendable from different modules
910

@@ -95,6 +96,7 @@ class WsjcppObjTree {
9596
}
9697
bool isSupportType(uint16_t );
9798
bool hasNode(WsjcppObjTreeNode *);
99+
const std::vector<WsjcppObjTreeNode *> &getAllNodes();
98100

99101
template<class T, class A>
100102
int findNodes(const A &val, std::vector<T *> &vFoundNodes) {

0 commit comments

Comments
 (0)