From 3c6ef83046fa9c3b814fedb33b6a2a3f1108e095 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 14 Apr 2020 22:31:21 -0400 Subject: [PATCH] Trying to correct the documentation so that it actually describes how the code behaves. (Attempt two) (#712) * Trying to correct the documentation so that it actually describes how the code behaves. * tweaking the wording. * Improving. * Removing confusing sentence. * Fixing formatting. * Now with working example, tested. * Added a smaller piece of code --- doc/basics.md | 17 ++++++++++++----- tests/CMakeLists.txt | 1 + tests/extracting_values_example.cpp | 12 ++++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 tests/extracting_values_example.cpp diff --git a/doc/basics.md b/doc/basics.md index 1654472b..4caf65cd 100644 --- a/doc/basics.md +++ b/doc/basics.md @@ -59,9 +59,17 @@ Once you have an element, you can navigate it with idiomatic C++ iterators, oper * **Extracting Values:** You can cast a JSON element to a native type: `double(element)` or `double x = json_element`. This works for double, uint64_t, int64_t, bool, - dom::object and dom::array. You can also use is_*typename*()` to test if it is a - given type, and as_*typename*() to do the cast and return an error code on failure instead of an - exception. + dom::object and dom::array. An exception is thrown if the cast is not possible. You can also use is<*typename*>() to test if it is a + given type, or use the `type()` method: e.g., `element.type() == dom::element_type::DOUBLE`. Instead of casting, you can use get<*typename*>() to get the value: casts and get<*typename*>() can be used interchangeably. You can use a variant usage of get<*typename*>() with error codes to avoid exceptions: e.g., + ```c++ + simdjson::error_code error; + double value; // variable where we store the value to be parsed + simdjson::padded_string numberstring = "1.2"_padded; // our JSON input ("1.2") + simdjson::dom::parser parser; + parser.parse(numberstring).get().tie(value,error); + if (error) { std::cerr << error << std::endl; return EXIT_FAILURE; } + std::cout << "I parsed " << value << " from " << numberstring.data() << std::endl; + ``` * **Field Access:** To get the value of the "foo" field in an object, use `object["foo"]`. * **Array Iteration:** To iterate through an array, use `for (auto value : array) { ... }`. If you know the type of the value, you can cast it right there, too! `for (double value : array) { ... }` @@ -173,7 +181,7 @@ behavior. > use it. If your project treats aliased, this means you can't use the same names in `auto [x, error]` > without triggering warnings or error (and particularly can't use the word "error" every time). To > circumvent this, you can use this instead: -> +> > ```c++ > dom::element doc; > simdjson::error_code error; @@ -343,4 +351,3 @@ The parsed results (`dom::document`, `dom::element`, `array`, `object`) depend o The CPU detection, which runs the first time parsing is attempted and switches to the fastest parser for your CPU, is transparent and thread-safe. - diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d8c30bcb..c6273ae3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -26,6 +26,7 @@ add_cpp_test(integer_tests integer_tests.cpp) add_cpp_test(jsoncheck jsoncheck.cpp) add_cpp_test(parse_many_test parse_many_test.cpp) add_cpp_test(pointercheck pointercheck.cpp quicktests) +add_cpp_test(extracting_values_example extracting_values_example.cpp quicktests) set_property( TEST basictests errortests integer_tests jsoncheck parse_many_test pointercheck diff --git a/tests/extracting_values_example.cpp b/tests/extracting_values_example.cpp new file mode 100644 index 00000000..facd100b --- /dev/null +++ b/tests/extracting_values_example.cpp @@ -0,0 +1,12 @@ +#include +#include "simdjson.h" + +int main() { + simdjson::error_code error; + double value; // variable where we store the value to be parsed + simdjson::padded_string numberstring = "1.2"_padded; // our JSON input ("1.2") + simdjson::dom::parser parser; + parser.parse(numberstring).get().tie(value,error); + if (error) { std::cerr << error << std::endl; return EXIT_FAILURE; } + std::cout << "I parsed " << value << " from " << numberstring.data() << std::endl; +}