· 6 years ago · Mar 09, 2020, 09:20 AM
1#include <boost/hana.hpp>
2
3#include <iostream>
4#include <list>
5#include <sstream>
6#include <string>
7#include <vector>
8#include <assert.h>
9#include <assert.h>
10
11using namespace boost;
12
13
14template<typename T>
15std::enable_if_t<std::is_same<T, int>::value, T> from_json(std::istream &in);
16template<typename T>
17std::enable_if_t<std::is_same<T, std::string>::value, T> from_json(std::istream &in);
18template<typename T>
19std::enable_if_t<std::is_same<T, double>::value, T> from_json(std::istream &in);
20template<typename T>
21std::enable_if_t<hana::Struct<T>::value, T> from_json(std::istream &in);
22template<typename Xs>
23std::enable_if_t<std::vector<Xs>::value, Xs> from_json(std::istream &in);
24template<typename Xs>
25std::enable_if_t<hana::Sequence<Xs>::value, Xs> from_json(std::istream &in);
26
27
28template<typename T>
29std::enable_if_t<std::is_same<T, int>::value, T> from_json(std::istream &in) {
30 T result;
31 in >> result;
32 return result;
33}
34
35template<typename T>
36std::enable_if_t<std::is_same<T, std::string>::value, T> from_json(std::istream &in) {
37 char quote;
38 in >> quote;
39
40 T result;
41 char c;
42 while (in.get(c) && c != '"') {
43 result += c;
44 }
45 return result;
46}
47
48template<typename T>
49std::enable_if_t<std::is_same<T, double>::value, T> from_json(std::istream &in) {
50 T result;
51 in >> result;
52 return result;
53}
54
55template<typename T>
56std::enable_if_t<hana::Struct<T>::value, T> from_json(std::istream &in) {
57 T result;
58 char brace;
59 in >> brace;
60
61 hana::for_each(hana::keys(result), [&](auto key) {
62 in.ignore(std::numeric_limits<std::streamsize>::max(), ':');
63 auto &member = hana::at_key(result, key);
64 using Member = std::remove_reference_t<decltype(member)>;
65 member = from_json<Member>(in);
66 });
67 in >> brace;
68 return result;
69}
70
71template<typename Xs>
72std::enable_if_t<std::vector<Xs>::value, Xs> from_json(std::istream &in) {
73 Xs result;
74 char bracket;
75 in >> bracket;
76 hana::length(result).times.with_index([&](auto i) {
77 if (i != 0u) {
78 char comma;
79 in >> comma;
80 }
81
82 auto &element = hana::at(result, i);
83 using Element = std::remove_reference_t<decltype(element)>;
84 element = from_json<Element>(in);
85 });
86 in >> bracket;
87 return result;
88}
89
90template<typename Xs>
91std::enable_if_t<hana::Sequence<Xs>::value, Xs> from_json(std::istream &in) {
92 Xs result;
93 char bracket;
94 in >> bracket;
95 hana::length(result).times.with_index([&](auto i) {
96 if (i != 0u) {
97 char comma;
98 in >> comma;
99 }
100
101 auto &element = hana::at(result, i);
102 using Element = std::remove_reference_t<decltype(element)>;
103 element = from_json<Element>(in);
104 });
105 in >> bracket;
106 return result;
107}
108
109
110struct Options {
111 BOOST_HANA_DEFINE_STRUCT(Options,(int, start),
112 (int, end),
113 (int, step),
114 (int, length)
115 );
116};
117
118struct Benchmark {
119 BOOST_HANA_DEFINE_STRUCT(Benchmark,
120 (std::string, name),
121 (std::string, type),
122 (Options, options));
123};
124
125struct Device {
126 BOOST_HANA_DEFINE_STRUCT(Device, (std::String, type), (std::string, serial), (std::string, interface));
127};
128
129
130struct Connection {
131 BOOST_HANA_DEFINE_STRUCT(Connection, (std::string, host), (int, port), (int, api));
132};
133
134struct Root {
135 BOOST_HANA_DEFINE_STRUCT(BenchmarkSetup,
136 (Connection, connection),
137 (Device, device),
138 (std::vector<Benchmark>, benchmarks));
139};
140
141
142int main(){
143std::istringstream json(R"EOS(
144{
145 "connection" : {
146 "host": "127.0.0.1",
147 "port": 8004,
148 "api": 6
149 },
150 "device" : {
151 "type": "xxx",
152 "serial": "xxx",
153 "interface": "xxx"
154 },
155 "benchmarks": [
156 {
157 "name":"compilation-perf",
158 "type": "compilation",
159 "options": {
160 "start": 1024,
161 "end": 4096,
162 "step": 1024,
163 "length": 1024
164 }
165 },
166 {
167 "name":"compilation-perf",
168 "type": "transfer",
169 "options": {
170 "start": 1024,
171 "end": 4096,
172 "step": 1024,
173 "length": 1024
174 }
175 }
176 ]
177}
178)EOS");
179
180auto benchmark = from_json<BenchmarkSetup>(buffer);
181
182return 0;
183}