Skip to content

Commit a16908c

Browse files
committed
rebase, more cleaning, add likely fix/check for potential Windows encoding issue
1 parent 2b5bf82 commit a16908c

File tree

7 files changed

+148
-229
lines changed

7 files changed

+148
-229
lines changed

inst/include/RcppSimdJson/deserialize.hpp

Lines changed: 44 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,6 @@ inline auto deserialize(simdjson::dom::element parsed, const Parse_Opts& parse_o
334334
template <typename json_T, bool is_file>
335335
inline simdjson::simdjson_result<simdjson::dom::element> parse(simdjson::dom::parser& parser,
336336
const json_T& json) {
337-
338337
if constexpr (utils::resembles_vec_raw<json_T>()) {
339338
/* if `json` is a raw (unsigned char) vector, we can cheat */
340339
return parser.parse(
@@ -347,16 +346,16 @@ inline simdjson::simdjson_result<simdjson::dom::element> parse(simdjson::dom::pa
347346
}
348347

349348
if constexpr (utils::resembles_r_string<json_T>()) {
350-
if constexpr (is_file) {
349+
if constexpr (is_file) { /* if `json` is a string and file path...*/
350+
/* ... check for a `memDecompress()`-compatible file extension... */
351351
if (const auto file_type = utils::get_memDecompress_type(std::string_view(json))) {
352352
return parse<Rcpp::RawVector, IS_NOT_FILE>(
353-
parser,
353+
parser, /* ... and decompress to a RawVector if so, then parse that */
354354
utils::decompress(std::string(json), Rcpp::String((*file_type).data())));
355-
} else { /* no file (compressed) type */
356-
return parser.load(std::string(json));
357355
}
356+
return parser.load(std::string(json)); /* otherwise, just `parser::load()` the file */
358357
} else {
359-
return parser.parse(std::string_view(json));
358+
return parser.parse(std::string_view(json)); /* if not file, just parse the string */
360359
}
361360
}
362361
}
@@ -372,22 +371,22 @@ inline SEXP query_and_deserialize(simdjson::dom::element p
372371
}
373372

374373
if (query.empty()) {
374+
/* if `query` is empty (""), parse/deserialize as if there's no query */
375375
return deserialize(parsed, parse_opts);
376376
}
377377

378378
if constexpr (query_error_ok) {
379379
if (auto [queried, query_error] = parsed.at(std::string_view(query)); !query_error) {
380380
return deserialize(queried, parse_opts);
381-
} else { /* parse_error != simdjson::error_code::SUCCESS */
382-
return on_query_error;
383381
}
382+
return on_query_error;
383+
384384
} else { /* !query_error_ok */
385385
auto [queried, query_error] = parsed.at(std::string_view(query));
386386
if (query_error) {
387387
Rcpp::stop(simdjson::error_message(query_error));
388-
} else { /* query_error == simdjson::error_code::SUCCESS */
389-
return deserialize(queried, parse_opts);
390388
}
389+
return deserialize(queried, parse_opts);
391390
}
392391
}
393392

@@ -404,16 +403,15 @@ inline SEXP parse_and_deserialize(simdjson::dom::parser& p
404403
if constexpr (parse_error_ok) {
405404
if (auto [parsed, parse_error] = parse<json_T, is_file>(parser, json); !parse_error) {
406405
return deserialize(parsed, parse_opts);
407-
} else { /* parse_error == simdjson::error_code::SUCCESS */
408-
return on_parse_error;
409406
}
407+
return on_parse_error;
408+
410409
} else {
411410
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
412411
if (parse_error) {
413412
Rcpp::stop(simdjson::error_message(parse_error));
414-
} else { /* parse_error != simdjson::error_code::SUCCESS */
415-
return deserialize(parsed, parse_opts);
416413
}
414+
return deserialize(parsed, parse_opts);
417415
}
418416
}
419417

@@ -432,16 +430,15 @@ inline SEXP parse_query_and_deserialize(simdjson::dom::parser& p
432430
if constexpr (parse_error_ok) {
433431
if (auto [parsed, parse_error] = parse<json_T, is_file>(parser, json); !parse_error) {
434432
return query_and_deserialize<query_error_ok>(parsed, query, on_query_error, parse_opts);
435-
} else { /* parse_error != simdjson::error_code::SUCCESS */
436-
return on_parse_error;
437433
}
434+
return on_parse_error;
435+
438436
} else {
439437
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
440438
if (parse_error) {
441439
Rcpp::stop(simdjson::error_message(parse_error));
442-
} else { /* parse_error == simdjson::error_code::SUCCESS */
443-
return query_and_deserialize<query_error_ok>(parsed, query, on_query_error, parse_opts);
444440
}
441+
return query_and_deserialize<query_error_ok>(parsed, query, on_query_error, parse_opts);
445442
}
446443
}
447444

@@ -504,27 +501,22 @@ inline SEXP flat_query(const json_T& json,
504501
out[i] = query_and_deserialize<query_error_ok>(
505502
parsed, query[i], on_query_error, parse_opts);
506503
}
507-
508504
out.attr("names") = query.attr("names");
509505
return out;
510-
511-
} else { /* parse_error != simdjson::error_code::SUCCESS */
512-
return on_parse_error;
513506
}
507+
return on_parse_error;
514508

515509
} else { /* !parse_error_ok */
516510
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
517511
if (parse_error) {
518512
Rcpp::stop(simdjson::error_message(parse_error));
519-
} else { /* parse_error == simdjson::error_code::SUCCESS */
520-
for (R_xlen_t i = 0; i < n; ++i) {
521-
out[i] = query_and_deserialize<query_error_ok>(
522-
parsed, query[i], on_query_error, parse_opts);
523-
}
524-
525-
out.attr("names") = query.attr("names");
526-
return out;
527513
}
514+
for (R_xlen_t i = 0; i < n; ++i) {
515+
out[i] = query_and_deserialize<query_error_ok>(
516+
parsed, query[i], on_query_error, parse_opts);
517+
}
518+
out.attr("names") = query.attr("names");
519+
return out;
528520
}
529521
}
530522

@@ -540,7 +532,6 @@ inline SEXP flat_query(const json_T& json,
540532
query_error_ok>(
541533
parser, json[i], query[0], on_parse_error, on_query_error, parse_opts);
542534
}
543-
544535
out.attr("names") = json.attr("names");
545536
return out;
546537

@@ -592,29 +583,27 @@ inline SEXP nested_query(const json_T& json,
592583
res[j] = query_and_deserialize<query_error_ok>(
593584
parsed, query[i][j], on_query_error, parse_opts);
594585
}
595-
596586
res.attr("names") = query[i].attr("names");
597587
out[i] = res;
598588
}
599-
} else { /* parse_error != simdjson::error_code::SUCCESS */
600-
return on_parse_error;
601589
}
590+
591+
return on_parse_error;
592+
602593
} else { /* !parse_error_ok */
603594
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
604595
if (parse_error) {
605596
Rcpp::stop(simdjson::error_message(parse_error));
606-
} else { /* parse_error == simdjson::error_code::SUCCESS */
607-
for (R_xlen_t i = 0; i < n; ++i) {
608-
const R_xlen_t n_queries = std::size(query[i]);
609-
Rcpp::List res(n_queries);
610-
for (R_xlen_t j = 0; j < std::size(query[i]); ++j) {
611-
res[j] = query_and_deserialize<query_error_ok>(
612-
parsed, query[i][j], on_query_error, parse_opts);
613-
}
614-
615-
res.attr("names") = query[i].attr("names");
616-
out[i] = res;
597+
}
598+
for (R_xlen_t i = 0; i < n; ++i) {
599+
const R_xlen_t n_queries = std::size(query[i]);
600+
Rcpp::List res(n_queries);
601+
for (R_xlen_t j = 0; j < std::size(query[i]); ++j) {
602+
res[j] = query_and_deserialize<query_error_ok>(
603+
parsed, query[i][j], on_query_error, parse_opts);
617604
}
605+
res.attr("names") = query[i].attr("names");
606+
out[i] = res;
618607
}
619608
}
620609

@@ -631,25 +620,25 @@ inline SEXP nested_query(const json_T& json,
631620
}
632621
res.attr("names") = query[i].attr("names");
633622
out[i] = res;
634-
} else { /* parse_error != simdjson::error_code::SUCCESS */
635-
out[i] = on_parse_error;
636623
}
624+
out[i] = on_parse_error;
625+
637626
} else { /* !parse_error_ok */
638627
auto [parsed, parse_error] = parse<decltype(json[i]), is_file>(parser, json[i]);
639628
if (parse_error) {
640629
Rcpp::stop(simdjson::error_message(parse_error));
641-
} else { /* parse_error == simdjson::error_code::SUCCESS */
642-
Rcpp::List res(n_queries);
643-
for (R_xlen_t j = 0; j < n_queries; ++j) {
644-
res[j] = query_and_deserialize<query_error_ok>(
645-
parsed, query[i][j], on_query_error, parse_opts);
646-
}
647-
res.attr("names") = query[i].attr("names");
648-
out[i] = res;
649630
}
631+
Rcpp::List res(n_queries);
632+
for (R_xlen_t j = 0; j < n_queries; ++j) {
633+
res[j] = query_and_deserialize<query_error_ok>(
634+
parsed, query[i][j], on_query_error, parse_opts);
635+
}
636+
res.attr("names") = query[i].attr("names");
637+
out[i] = res;
650638
}
651639
}
652640
}
641+
653642
if (utils::is_named(query)) {
654643
out.attr("names") = query.attr("names");
655644
} else {

0 commit comments

Comments
 (0)