|
17 | 17 |
|
18 | 18 | #pragma once |
19 | 19 |
|
| 20 | +#include <charconv> |
20 | 21 | #include <cstdint> |
21 | 22 | #include <cstdio> |
22 | 23 | #include <sstream> |
23 | 24 | #include <string> |
24 | 25 | #include <string_view> |
25 | 26 |
|
26 | | -#include <simdjson.h> |
27 | | - |
28 | 27 | #include "arrow/util/visibility.h" |
29 | 28 |
|
30 | 29 | namespace arrow { |
@@ -78,115 +77,111 @@ inline std::string EscapeJsonString(std::string_view s) { |
78 | 77 | return ss.str(); |
79 | 78 | } |
80 | 79 |
|
81 | | -/// \brief JSON writer wrapper using simdjson |
82 | | -/// |
83 | | -/// This class wraps simdjson's mini_formatter to provide a convenient API |
84 | | -/// with automatic comma insertion between elements. |
| 80 | +/// \brief JSON writer with automatic comma insertion between elements. |
85 | 81 | class JsonWriter { |
86 | 82 | public: |
87 | 83 | JsonWriter() = default; |
88 | 84 |
|
89 | 85 | void StartObject() { |
90 | 86 | MaybeComma(); |
91 | | - formatter_.start_object(); |
| 87 | + buffer_ += '{'; |
92 | 88 | needs_comma_ = false; |
93 | 89 | } |
94 | 90 |
|
95 | 91 | void EndObject() { |
96 | | - formatter_.end_object(); |
| 92 | + buffer_ += '}'; |
97 | 93 | needs_comma_ = true; |
98 | 94 | } |
99 | 95 |
|
100 | 96 | void StartArray() { |
101 | 97 | MaybeComma(); |
102 | | - formatter_.start_array(); |
| 98 | + buffer_ += '['; |
103 | 99 | needs_comma_ = false; |
104 | 100 | } |
105 | 101 |
|
106 | 102 | void EndArray() { |
107 | | - formatter_.end_array(); |
| 103 | + buffer_ += ']'; |
108 | 104 | needs_comma_ = true; |
109 | 105 | } |
110 | 106 |
|
111 | 107 | void Key(std::string_view key) { |
112 | 108 | MaybeComma(); |
113 | | - formatter_.key(key); |
| 109 | + buffer_ += EscapeJsonString(key); |
| 110 | + buffer_ += ':'; |
114 | 111 | needs_comma_ = false; |
115 | 112 | } |
116 | 113 |
|
117 | 114 | void String(std::string_view value) { |
118 | 115 | MaybeComma(); |
119 | | - formatter_.string(value); |
| 116 | + buffer_ += EscapeJsonString(value); |
120 | 117 | needs_comma_ = true; |
121 | 118 | } |
122 | 119 |
|
123 | 120 | void Bool(bool value) { |
124 | 121 | MaybeComma(); |
125 | | - if (value) { |
126 | | - formatter_.true_atom(); |
127 | | - } else { |
128 | | - formatter_.false_atom(); |
129 | | - } |
| 122 | + buffer_ += value ? "true" : "false"; |
130 | 123 | needs_comma_ = true; |
131 | 124 | } |
132 | 125 |
|
133 | 126 | void Int(int32_t value) { |
134 | 127 | MaybeComma(); |
135 | | - formatter_.number(static_cast<int64_t>(value)); |
| 128 | + buffer_ += std::to_string(value); |
136 | 129 | needs_comma_ = true; |
137 | 130 | } |
138 | 131 |
|
139 | 132 | void Int64(int64_t value) { |
140 | 133 | MaybeComma(); |
141 | | - formatter_.number(value); |
| 134 | + buffer_ += std::to_string(value); |
142 | 135 | needs_comma_ = true; |
143 | 136 | } |
144 | 137 |
|
145 | 138 | void Uint(uint32_t value) { |
146 | 139 | MaybeComma(); |
147 | | - formatter_.number(static_cast<uint64_t>(value)); |
| 140 | + buffer_ += std::to_string(value); |
148 | 141 | needs_comma_ = true; |
149 | 142 | } |
150 | 143 |
|
151 | 144 | void Uint64(uint64_t value) { |
152 | 145 | MaybeComma(); |
153 | | - formatter_.number(value); |
| 146 | + buffer_ += std::to_string(value); |
154 | 147 | needs_comma_ = true; |
155 | 148 | } |
156 | 149 |
|
157 | 150 | void Double(double value) { |
158 | 151 | MaybeComma(); |
159 | | - formatter_.number(value); |
| 152 | + char buf[32]; |
| 153 | + auto result = std::to_chars(buf, buf + sizeof(buf), value); |
| 154 | + buffer_.append(buf, result.ptr - buf); |
160 | 155 | needs_comma_ = true; |
161 | 156 | } |
162 | 157 |
|
163 | 158 | void Null() { |
164 | 159 | MaybeComma(); |
165 | | - formatter_.null_atom(); |
| 160 | + buffer_ += "null"; |
166 | 161 | needs_comma_ = true; |
167 | 162 | } |
168 | 163 |
|
169 | 164 | /// Write a raw character (for unquoted values like decimal numbers) |
170 | | - void RawChar(char c) { formatter_.one_char(c); } |
| 165 | + void RawChar(char c) { buffer_ += c; } |
171 | 166 |
|
172 | 167 | /// Mark that a raw value was written (for comma tracking) |
173 | 168 | void MarkValueWritten() { needs_comma_ = true; } |
174 | 169 |
|
175 | | - std::string_view GetString() const { return formatter_.str(); } |
| 170 | + std::string_view GetString() const { return buffer_; } |
176 | 171 |
|
177 | 172 | void Clear() { |
178 | | - formatter_.clear(); |
| 173 | + buffer_.clear(); |
179 | 174 | needs_comma_ = false; |
180 | 175 | } |
181 | 176 |
|
182 | 177 | private: |
183 | 178 | void MaybeComma() { |
184 | 179 | if (needs_comma_) { |
185 | | - formatter_.comma(); |
| 180 | + buffer_ += ','; |
186 | 181 | } |
187 | 182 | } |
188 | 183 |
|
189 | | - simdjson::internal::mini_formatter formatter_; |
| 184 | + std::string buffer_; |
190 | 185 | bool needs_comma_ = false; |
191 | 186 | }; |
192 | 187 |
|
|
0 commit comments