File: readme_examples_noexceptions.cpp

package info (click to toggle)
simdjson 4.2.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 27,936 kB
  • sloc: cpp: 171,612; ansic: 19,122; sh: 1,126; python: 842; makefile: 47; ruby: 25; javascript: 13
file content (197 lines) | stat: -rw-r--r-- 6,740 bytes parent folder | download | duplicates (2)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <iostream>
#include "simdjson.h"

using namespace std;
using namespace simdjson;

#ifdef SIMDJSON_CPLUSPLUS17
SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
void basics_error_1() {
  dom::parser parser;
  auto json = "1"_padded;

  dom::element doc;
  auto error = parser.parse(json).get(doc);
  if (error) { cerr << error << endl; exit(1); }
  // Use document here now that we've checked for the error
}
SIMDJSON_POP_DISABLE_WARNINGS
#endif

void basics_error_2() {
  auto cars_json = R"( [
    { "make": "Toyota", "model": "Camry",  "year": 2018, "tire_pressure": [ 40.1, 39.9, 37.7, 40.4 ] },
    { "make": "Kia",    "model": "Soul",   "year": 2012, "tire_pressure": [ 30.1, 31.0, 28.6, 28.7 ] },
    { "make": "Toyota", "model": "Tercel", "year": 1999, "tire_pressure": [ 29.8, 30.0, 30.2, 30.5 ] }
  ] )"_padded;
  dom::parser parser;
  dom::array cars;
  auto error = parser.parse(cars_json).get(cars);
  if (error) { cerr << error << endl; exit(1); }

  // Iterating through an array of objects
  for (dom::element car_element : cars) {
      dom::object car;
      if ((error = car_element.get(car))) { cerr << error << endl; exit(1); }

      // Accessing a field by name
      std::string_view make, model;
      if ((error = car["make"].get(make))) { cerr << error << endl; exit(1); }
      if ((error = car["model"].get(model))) { cerr << error << endl; exit(1); }
      cout << "Make/Model: " << make << "/" << model << endl;

      // Casting a JSON element to an integer
      uint64_t year{};
      if ((error = car["year"].get(year))) { cerr << error << endl; exit(1); }
      cout << "- This car is " << 2020 - year << "years old." << endl;

      // Iterating through an array of floats
      double total_tire_pressure = 0;
      dom::array tire_pressure_array;
      if ((error = car["tire_pressure"].get(tire_pressure_array))) { cerr << error << endl; exit(1); }
      for (dom::element tire_pressure_element : tire_pressure_array) {
          double tire_pressure;
          if ((error = tire_pressure_element.get(tire_pressure))) { cerr << error << endl; exit(1); }
          total_tire_pressure += tire_pressure;
      }
      cout << "- Average tire pressure: " << (total_tire_pressure / 4) << endl;

      // Writing out all the information about the car
      for (auto field : car) {
          cout << "- " << field.key << ": " << field.value << endl;
      }
  }
}

void basics_error_3() {
  auto abstract_json = R"( [
      {  "12345" : {"a":12.34, "b":56.78, "c": 9998877}   },
      {  "12545" : {"a":11.44, "b":12.78, "c": 11111111}  }
    ] )"_padded;
  dom::parser parser;
  dom::array array;
  auto error = parser.parse(abstract_json).get(array);
  if (error) { cerr << error << endl; exit(1); }
  // Iterate through an array of objects
  for (dom::element elem : array) {
      dom::object obj;
      if ((error = elem.get(obj))) { cerr << error << endl; exit(1); }
      for (auto key_value : obj) {
          cout << "key: " << key_value.key << " : ";
          dom::object innerobj;
          if ((error = key_value.value.get(innerobj))) { cerr << error << endl; exit(1); }

          double va{}, vb{};
          if ((error = innerobj["a"].get(va))) { cerr << error << endl; exit(1); }
          cout << "a: " << va << ", ";
          if ((error = innerobj["b"].get(vb))) { cerr << error << endl; exit(1); }
          cout << "b: " << vb << ", ";

          int64_t vc{};
          if ((error = innerobj["c"].get(vc))) { cerr << error << endl; exit(1); }
          cout << "c: " << vc << endl;
      }
  }
}

void basics_error_4() {
  auto abstract_json = R"(
    {  "str" : { "123" : {"abc" : 3.14 } } } )"_padded;
  dom::parser parser;
  double v;
  auto error = parser.parse(abstract_json)["str"]["123"]["abc"].get(v);
  if (error) { cerr << error << endl; exit(1); }
  cout << "number: " << v << endl;
}




#ifdef SIMDJSON_CPLUSPLUS17
void basics_error_2_cpp17() {
  auto cars_json = R"( [
    { "make": "Toyota", "model": "Camry",  "year": 2018, "tire_pressure": [ 40.1, 39.9, 37.7, 40.4 ] },
    { "make": "Kia",    "model": "Soul",   "year": 2012, "tire_pressure": [ 30.1, 31.0, 28.6, 28.7 ] },
    { "make": "Toyota", "model": "Tercel", "year": 1999, "tire_pressure": [ 29.8, 30.0, 30.2, 30.5 ] }
  ] )"_padded;
  dom::parser parser;
  dom::array cars;
  auto error = parser.parse(cars_json).get(cars);
  if (error) { cerr << error << endl; exit(1); }

  // Iterating through an array of objects
  for (dom::element car_element : cars) {
    dom::object car;
    error = car_element.get(car);
    if (error) { cerr << error << endl; exit(1); }

    // Accessing a field by name
    dom::element make, model;
    if ((error = car["make"].get(make))) { cerr << error << endl; exit(1); }
    if ((error = car["model"].get(model))) { cerr << error << endl; exit(1); }
    cout << "Make/Model: " << make << "/" << model << endl;

    // Casting a JSON element to an integer
    uint64_t year{};
    if ((error = car["year"].get(year))) { cerr << error << endl; exit(1); }
    cout << "- This car is " << 2020 - year << "years old." << endl;

    // Iterating through an array of floats
    double total_tire_pressure = 0;
    dom::array tire_pressure_array;
    if ((error = car["tire_pressure"].get(tire_pressure_array))) { cerr << error << endl; exit(1); }
    for (dom::element tire_pressure_element : tire_pressure_array) {
      double tire_pressure;
      if ((error = tire_pressure_element.get(tire_pressure))) { cerr << error << endl; exit(1); }
      total_tire_pressure += tire_pressure;
    }
    cout << "- Average tire pressure: " << (total_tire_pressure / 4) << endl;

    // Writing out all the information about the car
    for (auto [key, value] : car) {
      cout << "- " << key << ": " << value << endl;
    }
  }
}
#endif

// See https://github.com/miloyip/nativejson-benchmark/blob/master/src/tests/simdjsontest.cpp
simdjson::dom::parser parser{};

bool parse_double(const char *j, double &d) {
  auto error = parser.parse(j, std::strlen(j))
        .at(0)
        .get(d);
  if (error) { return false; }
  return true;
}

bool parse_string(const char *j, std::string &s) {
  std::string_view answer;
  auto error = parser.parse(j,strlen(j))
        .at(0)
        .get(answer);
  if (error) { return false; }
  s.assign(answer.data(), answer.size());
  return true;
}


int main() {
  double x{};
  parse_double("[1.1]",x);
  if(x != 1.1) {
    std::cerr << "bug in parse_double!" << std::endl;
    return EXIT_FAILURE;
  }
  std::string s{};
  parse_string("[\"my string\"]", s);
  if(s != "my string") {
    std::cerr << "bug in parse_string!" << std::endl;
    return EXIT_FAILURE;
  }
  basics_error_2();
  basics_error_3();
  basics_error_4();
  return EXIT_SUCCESS;
}