@@ -41,76 +41,70 @@ struct stat_s {
41
41
42
42
using stat_t = struct stat_s ;
43
43
44
+
45
+
46
+ really_inline void simdjson_process_atom (stat_t &s,
47
+ simdjson::document::element element) {
48
+ if (element.is_integer ()) {
49
+ s.integer_count ++;
50
+ } else if (element.is_string ()) {
51
+ s.string_count ++;
52
+ } else if (element.is_float ()) {
53
+ s.float_count ++;
54
+ } else if (element.is_bool ()) {
55
+ if (element.as_bool ()) {
56
+ s.true_count ++;
57
+ } else {
58
+ s.false_count ++;
59
+ }
60
+ } else if (element.is_null ()) {
61
+ s.null_count ++;
62
+ }
63
+ }
64
+
65
+ void simdjson_recurse (stat_t &s, simdjson::document::element element) {
66
+ if (element.is_array ()) {
67
+ s.array_count ++;
68
+ auto [array, array_error] = element.as_array ();
69
+ for (auto child : array) {
70
+ if (child.is_array () || child.is_object ()) {
71
+ simdjson_recurse (s, child);
72
+ } else {
73
+ simdjson_process_atom (s, child);
74
+ }
75
+ }
76
+ } else if (element.is_object ()) {
77
+ s.object_count ++;
78
+ auto [object, object_error] = element.as_object ();
79
+ for (auto [key, value] : object) {
80
+ s.string_count ++; // for key
81
+ if (value.is_array () || value.is_object ()) {
82
+ simdjson_recurse (s, value);
83
+ } else {
84
+ simdjson_process_atom (s, value);
85
+ }
86
+ }
87
+ } else {
88
+ simdjson_process_atom (s, element);
89
+ }
90
+ }
91
+
44
92
stat_t simdjson_compute_stats (const simdjson::padded_string &p) {
45
- stat_t answer;
46
- simdjson::ParsedJson pj = simdjson::build_parsed_json (p);
47
- answer.valid = pj.is_valid ();
48
- if (!answer.valid ) {
93
+ stat_t answer{};
94
+ simdjson::document::parser parser;
95
+ auto [doc, error] = parser.parse (p);
96
+ if (error) {
97
+ answer.valid = false ;
49
98
return answer;
50
99
}
100
+ answer.valid = true ;
51
101
answer.backslash_count =
52
102
count_backslash (reinterpret_cast <const uint8_t *>(p.data ()), p.size ());
53
103
answer.non_ascii_byte_count = count_nonasciibytes (
54
104
reinterpret_cast <const uint8_t *>(p.data ()), p.size ());
55
105
answer.byte_count = p.size ();
56
- answer.integer_count = 0 ;
57
- answer.float_count = 0 ;
58
- answer.object_count = 0 ;
59
- answer.array_count = 0 ;
60
- answer.null_count = 0 ;
61
- answer.true_count = 0 ;
62
- answer.false_count = 0 ;
63
- answer.string_count = 0 ;
64
- answer.structural_indexes_count = pj.n_structural_indexes ;
65
- size_t tape_idx = 0 ;
66
- uint64_t tape_val = pj.doc .tape [tape_idx++];
67
- uint8_t type = (tape_val >> 56 );
68
- size_t how_many = 0 ;
69
- assert (type == ' r' );
70
- how_many = tape_val & simdjson::internal::JSON_VALUE_MASK;
71
- for (; tape_idx < how_many; tape_idx++) {
72
- tape_val = pj.doc .tape [tape_idx];
73
- // uint64_t payload = tape_val & simdjson::internal::JSON_VALUE_MASK;
74
- type = (tape_val >> 56 );
75
- switch (type) {
76
- case ' l' : // we have a long int
77
- answer.integer_count ++;
78
- tape_idx++; // skipping the integer
79
- break ;
80
- case ' u' : // we have a long uint
81
- answer.integer_count ++;
82
- tape_idx++; // skipping the integer
83
- break ;
84
- case ' d' : // we have a double
85
- answer.float_count ++;
86
- tape_idx++; // skipping the double
87
- break ;
88
- case ' n' : // we have a null
89
- answer.null_count ++;
90
- break ;
91
- case ' t' : // we have a true
92
- answer.true_count ++;
93
- break ;
94
- case ' f' : // we have a false
95
- answer.false_count ++;
96
- break ;
97
- case ' {' : // we have an object
98
- answer.object_count ++;
99
- break ;
100
- case ' }' : // we end an object
101
- break ;
102
- case ' [' : // we start an array
103
- answer.array_count ++;
104
- break ;
105
- case ' ]' : // we end an array
106
- break ;
107
- case ' "' : // we have a string
108
- answer.string_count ++;
109
- break ;
110
- default :
111
- break ; // ignore
112
- }
113
- }
106
+ answer.structural_indexes_count = parser.n_structural_indexes ;
107
+ simdjson_recurse (answer, doc.root ());
114
108
return answer;
115
109
}
116
110
0 commit comments