3#ifndef AWKWARD_IO_JSON_H_
4#define AWKWARD_IO_JSON_H_
24 virtual int64_t
read(int64_t num_bytes,
char* buffer) = 0;
48 const char* nan_string =
nullptr,
49 const char* posinf_string =
nullptr,
50 const char* neginf_string =
nullptr);
57 const char* nan_string,
58 const char* posinf_string,
59 const char* neginf_string,
60 const char* jsonassembly,
70 return current_stack_depth_;
75 return current_instruction_;
80 return instructions_.data()[
static_cast<size_t>(current_instruction_) * 4];
85 return instructions_.data()[
static_cast<size_t>(current_instruction_) * 4 + 1];
90 return instructions_.data()[
static_cast<size_t>(current_instruction_) * 4 + 2];
95 return instructions_.data()[
static_cast<size_t>(current_instruction_) * 4 + 3];
100 current_instruction_++;
105 current_instruction_--;
110 instruction_stack_.data()[
static_cast<size_t>(current_stack_depth_)] = current_instruction_;
111 current_stack_depth_++;
112 current_instruction_ = jump_to;
117 current_stack_depth_--;
118 current_instruction_ = instruction_stack_.data()[
static_cast<size_t>(current_stack_depth_)];
122 int64_t* offsets = string_offsets_.data();
123 char* chars = characters_.data();
127 for (int64_t i = stringsstart; i <
argument3(); i++) {
129 stop = offsets[i + 1];
130 if (strncmp(str, &chars[start],
static_cast<size_t>(stop - start)) == 0) {
131 return i - stringsstart;
138 inline int64_t
find_key(
const char* str)
noexcept {
139 int64_t* offsets = string_offsets_.data();
140 char* chars = characters_.data();
150 record_current_field_[
static_cast<size_t>(
argument2())]++;
152 record_current_field_[
static_cast<size_t>(
argument2())] = 0;
154 j = record_current_field_[
static_cast<size_t>(
argument2())];
156 i = current_instruction_ + 1 + j;
157 stringi = instructions_.data()[
static_cast<size_t>(i) * 4 + 1];
158 start = offsets[stringi];
159 stop = offsets[stringi + 1];
160 if (strncmp(str, &chars[start],
static_cast<size_t>(stop - start)) == 0) {
162 chunkmask =
static_cast<uint64_t
>(1) << (j & 0x3f);
163 if ((record_checklist_[
static_cast<size_t>(
argument2())][
static_cast<size_t>(j >> 6)] & chunkmask) == 0) {
167 record_checklist_[
static_cast<size_t>(
argument2())][
static_cast<size_t>(j >> 6)] &= ~chunkmask;
172 for (i = current_instruction_ + 1; i <= current_instruction_ +
argument1(); i++) {
174 if (i != current_instruction_ + 1 + record_current_field_[
static_cast<size_t>(
argument2())]) {
175 stringi = instructions_.data()[
static_cast<size_t>(i) * 4 + 1];
176 start = offsets[stringi];
177 stop = offsets[stringi + 1];
178 if (strncmp(str, &chars[start],
static_cast<size_t>(stop - start)) == 0) {
180 j = i - (current_instruction_ + 1);
181 record_current_field_[
static_cast<size_t>(
argument2())] = j;
183 chunkmask =
static_cast<uint64_t
>(1) << (j & 0x3f);
184 if ((record_checklist_[
static_cast<size_t>(
argument2())][
static_cast<size_t>(j >> 6)] & chunkmask) == 0) {
188 record_checklist_[
static_cast<size_t>(
argument2())][
static_cast<size_t>(j >> 6)] &= ~chunkmask;
198 uint64_t chunkmask =
static_cast<uint64_t
>(1) << (j & 0x3f);
199 return (record_checklist_[
static_cast<size_t>(record_identifier)][
static_cast<size_t>(j >> 6)] & chunkmask) == 0;
204 return instructions_.data()[
static_cast<size_t>(i) * 4 + 2];
208 inline void start_object(int64_t keytableheader_instruction)
noexcept {
209 int64_t record_identifier = instructions_.data()[
static_cast<size_t>(keytableheader_instruction) * 4 + 2];
210 record_checklist_[
static_cast<size_t>(record_identifier)].assign(
211 record_checklist_init_[
static_cast<size_t>(record_identifier)].begin(),
212 record_checklist_init_[
static_cast<size_t>(record_identifier)].end()
217 inline bool end_object(int64_t keytableheader_instruction)
const noexcept {
218 int64_t record_identifier = instructions_.data()[
static_cast<size_t>(keytableheader_instruction) * 4 + 2];
219 uint64_t should_be_zero = 0;
220 for (uint64_t chunk : record_checklist_[
static_cast<size_t>(record_identifier)]) {
221 should_be_zero |= chunk;
223 return should_be_zero == 0;
228 buffers_uint8_[
static_cast<size_t>(index)].append(*
reinterpret_cast<uint8_t*
>(&x));
233 buffers_uint8_[
static_cast<size_t>(index)].append(x);
237 inline void write_many_uint8(int64_t index, int64_t num_items,
const uint8_t* values)
noexcept {
238 buffers_uint8_[
static_cast<size_t>(index)].extend(values,
static_cast<size_t>(num_items));
243 buffers_int64_[
static_cast<size_t>(index)].append(x);
248 buffers_int64_[
static_cast<size_t>(index)].append(
static_cast<int64_t
>(x));
253 buffers_int64_[
static_cast<size_t>(index)].append(buffers_int64_[
static_cast<size_t>(index)].last() + x);
258 buffers_float64_[
static_cast<size_t>(index)].append(x);
263 return counters_[
static_cast<size_t>(index)]++;
281 return static_cast<int64_t
>(output_names_.size());
286 return output_names_[
static_cast<size_t>(i)];
291 switch (output_dtypes_[
static_cast<size_t>(i)]) {
292 case util::dtype::int8:
294 case util::dtype::uint8:
296 case util::dtype::int64:
298 case util::dtype::float64:
307 switch (output_dtypes_[
static_cast<size_t>(i)]) {
308 case util::dtype::int8:
309 return static_cast<int64_t
>(buffers_uint8_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].nbytes());
310 case util::dtype::uint8:
311 return static_cast<int64_t
>(buffers_uint8_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].nbytes());
312 case util::dtype::int64:
313 return static_cast<int64_t
>(buffers_int64_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].nbytes() / 8);
314 case util::dtype::float64:
315 return static_cast<int64_t
>(buffers_float64_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].nbytes() / 8);
323 switch (output_dtypes_[
static_cast<size_t>(i)]) {
324 case util::dtype::int8:
325 buffers_uint8_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].concatenate(
326 reinterpret_cast<uint8_t*
>(external_pointer)
329 case util::dtype::uint8:
330 buffers_uint8_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].concatenate(
331 reinterpret_cast<uint8_t*
>(external_pointer)
334 case util::dtype::int64:
335 buffers_int64_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].concatenate(
336 reinterpret_cast<int64_t*
>(external_pointer)
339 case util::dtype::float64:
340 buffers_float64_[
static_cast<size_t>(output_which_[
static_cast<size_t>(i)])].concatenate(
341 reinterpret_cast<double*
>(external_pointer)
350 std::vector<int64_t> instructions_;
351 std::vector<char> characters_;
352 std::vector<int64_t> string_offsets_;
354 std::vector<int64_t> record_current_field_;
355 std::vector<std::vector<uint64_t>> record_checklist_init_;
356 std::vector<std::vector<uint64_t>> record_checklist_;
358 std::vector<std::string> output_names_;
359 std::vector<util::dtype> output_dtypes_;
360 std::vector<int64_t> output_which_;
361 std::vector<GrowableBuffer<uint8_t>> buffers_uint8_;
362 std::vector<GrowableBuffer<int64_t>> buffers_int64_;
363 std::vector<GrowableBuffer<double>> buffers_float64_;
365 int64_t current_instruction_;
366 std::vector<int64_t> instruction_stack_;
367 int64_t current_stack_depth_;
368 std::vector<int64_t> counters_;
User interface to the Builder system: the ArrayBuilder is a fixed reference while the Builder subclas...
Definition ArrayBuilder.h:23
Abstract class to represent a file-like object, something with a read(num_bytes) method....
Definition json.h:22
virtual int64_t read(int64_t num_bytes, char *buffer)=0
void write_many_uint8(int64_t index, int64_t num_items, const uint8_t *values) noexcept
HERE.
Definition json.h:237
FromJsonObjectSchema(const FromJsonObjectSchema &)=delete
FromJsonObjectSchema & operator=(FromJsonObjectSchema &)=delete
void step_forward() noexcept
HERE.
Definition json.h:99
void pop_stack() noexcept
HERE.
Definition json.h:116
void start_object(int64_t keytableheader_instruction) noexcept
HERE.
Definition json.h:208
FromJsonObjectSchema(FileLikeObject *source, int64_t buffersize, bool read_one, const char *nan_string, const char *posinf_string, const char *neginf_string, const char *jsonassembly, int64_t initial, double resize)
void write_uint64(int64_t index, uint64_t x) noexcept
HERE.
Definition json.h:247
void output_fill(int64_t i, void *external_pointer) const
HERE.
Definition json.h:322
int64_t instruction() const noexcept
HERE.
Definition json.h:79
int64_t length() const noexcept
HERE.
Definition json.h:267
void write_float64(int64_t index, double x) noexcept
HERE.
Definition json.h:257
int64_t find_enum(const char *str) noexcept
HERE.
Definition json.h:121
void write_int64(int64_t index, int64_t x) noexcept
HERE.
Definition json.h:242
int64_t current_instruction() const noexcept
HERE.
Definition json.h:74
int64_t argument1() const noexcept
HERE.
Definition json.h:84
int64_t num_outputs() const
HERE.
Definition json.h:280
bool end_object(int64_t keytableheader_instruction) const noexcept
HERE.
Definition json.h:217
void step_backward() noexcept
HERE.
Definition json.h:104
void write_uint8(int64_t index, uint8_t x) noexcept
HERE.
Definition json.h:232
int64_t get_and_increment(int64_t index) noexcept
HERE.
Definition json.h:262
void write_add_int64(int64_t index, int64_t x) noexcept
HERE.
Definition json.h:252
int64_t argument2() const noexcept
HERE.
Definition json.h:89
void add_to_length(int64_t length) noexcept
HERE.
Definition json.h:272
std::string output_name(int64_t i) const
HERE.
Definition json.h:285
void write_int8(int64_t index, int8_t x) noexcept
HERE.
Definition json.h:227
void push_stack(int64_t jump_to) noexcept
HERE.
Definition json.h:109
int64_t find_key(const char *str) noexcept
HERE.
Definition json.h:138
int64_t argument3() const noexcept
HERE.
Definition json.h:94
std::string debug() const noexcept
HERE.
int64_t output_num_items(int64_t i) const
HERE.
Definition json.h:306
std::string output_dtype(int64_t i) const
HERE.
Definition json.h:290
bool key_already_filled(int64_t record_identifier, int64_t j) const noexcept
HERE.
Definition json.h:197
int64_t key_instruction_at(int64_t i) const noexcept
HERE.
Definition json.h:203
int64_t current_stack_depth() const noexcept
HERE.
Definition json.h:69
#define EXPORT_SYMBOL
Definition common.h:14
Definition ArrayBuilder.h:14
EXPORT_SYMBOL void fromjsonobject(FileLikeObject *source, ArrayBuilder &builder, int64_t buffersize, bool read_one, const char *nan_string=nullptr, const char *posinf_string=nullptr, const char *neginf_string=nullptr)
Parses a JSON-encoded file-like object using an ArrayBuilder.