From 806cb39103c0b0d2f1e9d77fc5914f88131ff425 Mon Sep 17 00:00:00 2001 From: John Keiser Date: Mon, 7 Dec 2020 13:44:58 -0800 Subject: [PATCH] Clean up some more benchmark/test code --- benchmark/partial_tweets/ondemand.h | 11 ++-- include/simdjson/generic/ondemand/value-inl.h | 11 +++- tests/ondemand/ondemand_basictests.cpp | 54 +++++++------------ 3 files changed, 33 insertions(+), 43 deletions(-) diff --git a/benchmark/partial_tweets/ondemand.h b/benchmark/partial_tweets/ondemand.h index 7ad3c816..8ba2079b 100644 --- a/benchmark/partial_tweets/ondemand.h +++ b/benchmark/partial_tweets/ondemand.h @@ -26,16 +26,15 @@ private: ondemand::parser parser{}; std::vector tweets{}; - simdjson_really_inline uint64_t nullable_int(ondemand::value && value) { + simdjson_really_inline uint64_t nullable_int(ondemand::value value) { if (value.is_null()) { return 0; } - return std::move(value); + return value; } - simdjson_really_inline twitter_user read_user(ondemand::object && user) { - // Move user into a local object so it gets destroyed (and moves the iterator) - ondemand::object u = std::move(user); - return { u["id"], u["screen_name"] }; + simdjson_really_inline twitter_user read_user(ondemand::object user) { + return { user["id"], user["screen_name"] }; } + static inline bool displayed_implementation = false; }; diff --git a/include/simdjson/generic/ondemand/value-inl.h b/include/simdjson/generic/ondemand/value-inl.h index 376527a7..9c8f222c 100644 --- a/include/simdjson/generic/ondemand/value-inl.h +++ b/include/simdjson/generic/ondemand/value-inl.h @@ -295,12 +295,19 @@ template simdjson_really_inline error_code simdjson_result(first).get(out); } -template<> simdjson_really_inline simdjson_result simdjson_result::get() & noexcept = delete; +template<> simdjson_really_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return std::move(first); +} template<> simdjson_really_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } -template<> simdjson_really_inline error_code simdjson_result::get(SIMDJSON_IMPLEMENTATION::ondemand::value &out) & noexcept = delete; +template<> simdjson_really_inline error_code simdjson_result::get(SIMDJSON_IMPLEMENTATION::ondemand::value &out) & noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} template<> simdjson_really_inline error_code simdjson_result::get(SIMDJSON_IMPLEMENTATION::ondemand::value &out) && noexcept { if (error()) { return error(); } out = std::forward(first); diff --git a/tests/ondemand/ondemand_basictests.cpp b/tests/ondemand/ondemand_basictests.cpp index d101cd35..8634c067 100644 --- a/tests/ondemand/ondemand_basictests.cpp +++ b/tests/ondemand/ondemand_basictests.cpp @@ -971,7 +971,7 @@ namespace dom_api_tests { int count = 0; for (simdjson_result val_result : doc_result) { ondemand::value val; - ASSERT_SUCCESS( std::move(val_result).get(val) ); + ASSERT_SUCCESS( val_result.get(val) ); T actual; ASSERT_SUCCESS( val.get(actual) ); ASSERT_EQUAL(expected, actual); @@ -1026,7 +1026,7 @@ namespace dom_api_tests { int count = 0; for (auto value_result : doc_result) { ondemand::value value; - ASSERT_SUCCESS( std::move(value_result).get(value) ); + ASSERT_SUCCESS( value_result.get(value) ); ASSERT_EQUAL( value.is_null(), true ); count++; } @@ -1398,13 +1398,8 @@ namespace twitter_tests { ASSERT_TRUE(test_ondemand_doc(json, [&](auto doc_result) { // Print users with a default profile. set default_users; - ondemand::array tweets; - ASSERT_SUCCESS( doc_result["statuses"].get(tweets) ); - for (auto tweet_value : tweets) { - auto tweet = tweet_value.get_object(); - - ondemand::object user; - ASSERT_SUCCESS( tweet["user"].get(user) ); + for (auto tweet : doc_result["statuses"]) { + auto user = tweet["user"].get_object(); // We have to get the screen name before default_profile because it appears first std::string_view screen_name; @@ -1429,17 +1424,11 @@ namespace twitter_tests { ASSERT_TRUE(test_ondemand_doc(json, [&](auto doc_result) { // Print image names and sizes set> image_sizes; - ondemand::array tweets; - ASSERT_SUCCESS( doc_result["statuses"].get(tweets) ); - for (auto tweet_value : tweets) { - auto tweet = tweet_value.get_object(); - auto entities = tweet["entities"].get_object(); - ondemand::array media; - if (entities["media"].get(media) == SUCCESS) { - for (auto image_value : media) { - auto image = image_value.get_object(); - auto sizes = image["sizes"].get_object(); - for (auto size : sizes) { + for (auto tweet : doc_result["statuses"]) { + auto media = tweet["entities"]["media"]; + if (!media.error()) { + for (auto image : media) { + for (auto size : image["sizes"].get_object()) { auto size_value = size.value().get_object(); uint64_t width, height; ASSERT_SUCCESS( size_value["w"].get(width) ); @@ -1462,9 +1451,7 @@ namespace twitter_tests { padded_string json; ASSERT_SUCCESS( padded_string::load(TWITTER_JSON).get(json) ); ASSERT_TRUE(test_ondemand_doc(json, [&](auto doc_result) { - auto metadata = doc_result["search_metadata"].get_object(); - uint64_t count; - ASSERT_SUCCESS( metadata["count"].get(count) ); + uint64_t count = doc_result["search_metadata"]["count"]; ASSERT_EQUAL( count, 100 ); return true; })); @@ -1477,8 +1464,7 @@ namespace twitter_tests { ASSERT_TRUE(test_ondemand_doc(json, [&](auto doc_result) { // Print users with a default profile. set default_users; - auto tweets = doc_result["statuses"]; - for (ondemand::object tweet : tweets) { + for (auto tweet : doc_result["statuses"]) { ondemand::object user = tweet["user"]; // We have to get the screen name before default_profile because it appears first @@ -1499,10 +1485,9 @@ namespace twitter_tests { ASSERT_TRUE(test_ondemand_doc(json, [&](auto doc_result) { // Print image names and sizes set> image_sizes; - for (ondemand::object tweet : doc_result["statuses"]) { - ondemand::object entities = tweet["entities"]; - auto media = entities["media"]; - if (media.error() == SUCCESS) { + for (auto tweet : doc_result["statuses"]) { + auto media = tweet["entities"]["media"]; + if (!media.error()) { for (ondemand::object image : media) { /** * Fun fact: id and id_str can differ: @@ -1512,12 +1497,11 @@ namespace twitter_tests { * 505866668485386241 cannot be represented as a double. * (not our fault) */ - uint64_t id_val = image["id"].get_uint64(); - std::cout << "id = " <