-
Notifications
You must be signed in to change notification settings - Fork 259
Expand file tree
/
Copy pathtest_rapid_sax.cpp
More file actions
118 lines (101 loc) · 2.52 KB
/
test_rapid_sax.cpp
File metadata and controls
118 lines (101 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "rapidjson/reader.h"
#include <rapidjson/istreamwrapper.h>
#include <cstdio>
#include <iostream>
#include <libnotify.hpp>
#include <sstream>
#include <unistd.h>
#include <fstream>
using namespace std;
using namespace rapidjson;
class CoordinateHandler : public BaseReaderHandler<UTF8<>, CoordinateHandler> {
public:
CoordinateHandler() : state_(kStart), x_(), y_(), z_() {}
bool Double(double d) {
switch (state_) {
case kX: x_ += d; state_ = kCoordinatesElement; break;
case kY: y_ += d; state_ = kCoordinatesElement; break;
case kZ: z_ += d; state_ = kCoordinatesElement; break;
default: break;
}
return true;
}
bool StartObject() {
switch (state_) {
case kStart: state_ = kRoot; break;
case kCoordinatesArray: state_ = kCoordinatesElement; break;
default: break;
}
return true;
}
bool Key(const Ch* str, SizeType len, bool copy) {
switch (state_) {
case kRoot:
if (len == sizeof("coordinates") - 1 && memcmp(str, "coordinates", sizeof("coordinates") - 1) == 0)
state_ = kCoordinates;
break;
case kCoordinatesElement:
if (len == 1 && str[0] >= 'x' && str[0] <= 'z')
state_ = static_cast<State>(kX + (str[0] - 'x'));
break;
default: break;
}
return true;
}
bool EndObject(SizeType) {
switch (state_) {
case kCoordinatesElement: state_ = kCoordinatesArray; break;
default: break;
}
return true;
}
bool StartArray() {
switch (state_) {
case kCoordinates: state_ = kCoordinatesArray; break;
default: break;
}
return true;
}
bool EndArray(SizeType len) {
switch (state_) {
case kCoordinatesArray:
std::cout << x_ / len << std::endl;
std::cout << y_ / len << std::endl;
std::cout << z_ / len << std::endl;
state_ = kCoordinates;
break;
default: break;
}
return true;
}
private:
enum State {
kStart,
kRoot,
kCoordinates,
kCoordinatesArray,
kCoordinatesElement,
kX,
kY,
kZ
}state_;
double x_, y_, z_;
};
void read_file(const string& filename, stringstream &buffer) {
ifstream f(filename);
if (f.good()) {
buffer << f.rdbuf();
}
}
int main() {
stringstream ss;
read_file("/tmp/1.json", ss);
stringstream ostr;
ostr << "C++ RapidJSON SAX\t" << getpid();
notify(ostr.str());
IStreamWrapper isw(ss);
Reader reader;
CoordinateHandler handler;
reader.Parse(isw, handler);
notify("stop");
}