Merge pull request #936 from simdjson/dlemire/new_examples

New examples.
This commit is contained in:
Daniel Lemire 2020-06-18 18:29:06 -04:00 committed by GitHub
commit 5ccdbef7d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 5 deletions

View File

@ -39,9 +39,9 @@ You can compile with:
c++ myproject.cpp simdjson.cpp
```
Note:
Note:
- Users on macOS and other platforms were default compilers do not provide C++11 compliant by default should request it with the appropriate flag (e.g., `c++ myproject.cpp simdjson.cpp`).
- Visual Studio users should compile with the `_CRT_SECURE_NO_WARNINGS` flag to avoid warnings with respect to our use of standard C functions such as `fopen`.
- Visual Studio users should compile with the `_CRT_SECURE_NO_WARNINGS` flag to avoid warnings with respect to our use of standard C functions such as `fopen`.
The Basics: Loading and Parsing JSON Documents
@ -95,8 +95,8 @@ Once you have an element, you can navigate it with idiomatic C++ iterators, oper
* **Array Index:** To get at an array value by index, use the at() method: `array.at(0)` gets the
first element.
> Note that array[0] does not compile, because implementing [] gives the impression indexing is a
> O(1) operation, which it is not presently in simdjson. Instead, you should iterate over the elements
> using a for-loop, as in our examples.
> O(1) operation, which it is not presently in simdjson. Instead, you should iterate over the elements
> using a for-loop, as in our examples.
* **Array and Object size** Given an array or an object, you can get its size (number of elements or keys)
with the `size()` method.
* **Checking an Element Type:** You can check an element's type with `element.type()`. It
@ -399,6 +399,35 @@ And another one:
Notice how we can string several operation (`parser.parse(abstract_json)["str"]["123"]["abc"].get<double>()`) and only check for the error once, a strategy we call *error chaining*.
The next two functions will take as input a JSON document containing an array with a single element, either a string or a number. They return true upon success.
```C++
simdjson::dom::parser parser{};
bool parse_double(const char *j, double &d) {
simdjson::error_code error;
parser.parse(j, std::strlen(j))
.at(0)
.get<double>()
.tie(d, error);
if (error) { return false; }
return true;
}
bool parse_string(const char *j, std::string &s) {
simdjson::error_code error;
std::string_view answer;
parser.parse(j,strlen(j))
.at(0)
.get<std::string_view>()
.tie(answer, error);
if (error) { return false; }
s.assign(answer.data(), answer.size());
return true;
}
```
### Exceptions
Users more comfortable with an exception flow may choose to directly cast the `simdjson_result<T>` to the desired type:

View File

@ -131,6 +131,8 @@ void basics_error_5() {
}
#ifdef SIMDJSON_CPLUSPLUS17
void basics_error_3_cpp17() {
auto cars_json = R"( [
@ -183,10 +185,49 @@ void basics_error_3_cpp17() {
}
#endif
simdjson::dom::parser parser;
// See https://github.com/miloyip/nativejson-benchmark/blob/master/src/tests/simdjsontest.cpp
bool ParseDouble(const char *j, double &d) {
simdjson::error_code error;
parser.parse(j, std::strlen(j))
.at(0)
.get<double>()
.tie(d, error);
if (error) { return false; }
return true;
}
// See https://github.com/miloyip/nativejson-benchmark/blob/master/src/tests/simdjsontest.cpp
bool ParseString(const char *j, std::string &s) {
simdjson::error_code error;
std::string_view answer;
parser.parse(j,strlen(j))
.at(0)
.get<std::string_view>()
.tie(answer, error);
if (error) { return false; }
s.assign(answer.data(), answer.size());
return true;
}
int main() {
double x{};
ParseDouble("[1.1]",x);
if(x != 1.1) {
std::cerr << "bug in ParseDouble!" << std::endl;
return EXIT_FAILURE;
}
std::string s{};
ParseString("[\"my string\"]", s);
if(s != "my string") {
std::cerr << "bug in ParseString!" << std::endl;
return EXIT_FAILURE;
}
basics_error_2();
basics_error_3();
basics_error_4();
basics_error_5();
return 0;
return EXIT_SUCCESS;
}