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,
66 return current_stack_depth_;
71 return current_instruction_;
76 return instructions_.data()[current_instruction_ * 4];
81 return instructions_.data()[current_instruction_ * 4 + 1];
86 return instructions_.data()[current_instruction_ * 4 + 2];
91 return instructions_.data()[current_instruction_ * 4 + 3];
96 current_instruction_++;
101 current_instruction_--;
106 instruction_stack_.data()[current_stack_depth_] = current_instruction_;
107 current_stack_depth_++;
108 current_instruction_ = jump_to;
113 current_stack_depth_--;
114 current_instruction_ = instruction_stack_.data()[current_stack_depth_];
119 int64_t* offsets = string_offsets_.data();
120 char* chars = characters_.data();
124 for (int64_t i = stringsstart; i <
argument3(); i++) {
126 stop = offsets[i + 1];
127 if (strncmp(str, &chars[start], (
size_t)(stop - start)) == 0) {
128 return i - stringsstart;
135 inline int64_t
find_key(
const char* str)
noexcept {
136 int64_t* offsets = string_offsets_.data();
137 char* chars = characters_.data();
153 i = current_instruction_ + 1 + j;
154 stringi = instructions_.data()[i * 4 + 1];
155 start = offsets[stringi];
156 stop = offsets[stringi + 1];
157 if (strncmp(str, &chars[start], (
size_t)(stop - start)) == 0) {
159 chunkmask = (uint64_t)1 << (j & 0x3f);
160 if ((record_checklist_[
argument2()][j >> 6] & chunkmask) == 0) {
164 record_checklist_[
argument2()][j >> 6] &= ~chunkmask;
169 for (i = current_instruction_ + 1; i <= current_instruction_ +
argument1(); i++) {
171 if (i != current_instruction_ + 1 + record_current_field_[
argument2()]) {
172 stringi = instructions_.data()[i * 4 + 1];
173 start = offsets[stringi];
174 stop = offsets[stringi + 1];
175 if (strncmp(str, &chars[start], (
size_t)(stop - start)) == 0) {
177 j = i - (current_instruction_ + 1);
180 chunkmask = (uint64_t)1 << (j & 0x3f);
181 if ((record_checklist_[
argument2()][j >> 6] & chunkmask) == 0) {
185 record_checklist_[
argument2()][j >> 6] &= ~chunkmask;
195 uint64_t chunkmask = (uint64_t)1 << (j & 0x3f);
196 return (record_checklist_[record_identifier][j >> 6] & chunkmask) == 0;
201 return instructions_.data()[i * 4 + 2];
205 inline void start_object(int64_t keytableheader_instruction)
noexcept {
206 int64_t record_identifier = instructions_.data()[keytableheader_instruction * 4 + 2];
207 record_checklist_[record_identifier].assign(
208 record_checklist_init_[record_identifier].begin(),
209 record_checklist_init_[record_identifier].end()
214 inline bool end_object(int64_t keytableheader_instruction)
const noexcept {
215 int64_t record_identifier = instructions_.data()[keytableheader_instruction * 4 + 2];
216 uint64_t should_be_zero = 0;
217 for (uint64_t chunk : record_checklist_[record_identifier]) {
218 should_be_zero |= chunk;
220 return should_be_zero == 0;
214 inline bool end_object(int64_t keytableheader_instruction)
const noexcept {
…}
225 buffers_uint8_[(size_t)index].append(*
reinterpret_cast<uint8_t*
>(&x));
230 buffers_uint8_[(size_t)index].append(x);
234 inline void write_many_uint8(int64_t index, int64_t num_items,
const uint8_t* values)
noexcept {
235 buffers_uint8_[(size_t)index].extend(values, (
size_t)num_items);
234 inline void write_many_uint8(int64_t index, int64_t num_items,
const uint8_t* values)
noexcept {
…}
240 buffers_int64_[(size_t)index].append(x);
245 buffers_int64_[(size_t)index].append(
static_cast<int64_t
>(x));
250 buffers_int64_[(size_t)index].append(buffers_int64_[(
size_t)index].last() + x);
255 buffers_float64_[(size_t)index].append(x);
260 return counters_[(size_t)index]++;
278 return (int64_t)output_names_.size();
283 return output_names_[(size_t)i];
288 switch (output_dtypes_[(
size_t)i]) {
304 switch (output_dtypes_[(
size_t)i]) {
306 return (int64_t)buffers_uint8_[(size_t)output_which_[(
size_t)i]].nbytes();
308 return (int64_t)buffers_uint8_[(size_t)output_which_[(
size_t)i]].nbytes();
310 return (int64_t)buffers_int64_[(size_t)output_which_[(
size_t)i]].nbytes() / 8;
312 return (int64_t)buffers_float64_[(size_t)output_which_[(
size_t)i]].nbytes() / 8;
320 switch (output_dtypes_[(
size_t)i]) {
322 buffers_uint8_[(size_t)output_which_[(
size_t)i]].concatenate(
323 reinterpret_cast<uint8_t*
>(external_pointer)
327 buffers_uint8_[(size_t)output_which_[(
size_t)i]].concatenate(
328 reinterpret_cast<uint8_t*
>(external_pointer)
332 buffers_int64_[(size_t)output_which_[(
size_t)i]].concatenate(
333 reinterpret_cast<int64_t*
>(external_pointer)
337 buffers_float64_[(size_t)output_which_[(
size_t)i]].concatenate(
338 reinterpret_cast<double*
>(external_pointer)
347 std::vector<int64_t> instructions_;
348 std::vector<char> characters_;
349 std::vector<int64_t> string_offsets_;
351 std::vector<int64_t> record_current_field_;
352 std::vector<std::vector<uint64_t>> record_checklist_init_;
353 std::vector<std::vector<uint64_t>> record_checklist_;
355 std::vector<std::string> output_names_;
356 std::vector<util::dtype> output_dtypes_;
357 std::vector<int64_t> output_which_;
358 std::vector<GrowableBuffer<uint8_t>> buffers_uint8_;
359 std::vector<GrowableBuffer<int64_t>> buffers_int64_;
360 std::vector<GrowableBuffer<double>> buffers_float64_;
362 int64_t current_instruction_;
363 std::vector<int64_t> instruction_stack_;
364 int64_t current_stack_depth_;
365 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:234
void step_forward() noexcept
HERE.
Definition json.h:95
void pop_stack() noexcept
HERE.
Definition json.h:112
void start_object(int64_t keytableheader_instruction) noexcept
HERE.
Definition json.h:205
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:244
void output_fill(int64_t i, void *external_pointer) const
HERE.
Definition json.h:319
int64_t instruction() const noexcept
HERE.
Definition json.h:75
int64_t length() const noexcept
HERE.
Definition json.h:264
void write_float64(int64_t index, double x) noexcept
HERE.
Definition json.h:254
int64_t find_enum(const char *str) noexcept
HERE.
Definition json.h:118
void write_int64(int64_t index, int64_t x) noexcept
HERE.
Definition json.h:239
int64_t current_instruction() const noexcept
HERE.
Definition json.h:70
int64_t argument1() const noexcept
HERE.
Definition json.h:80
int64_t num_outputs() const
HERE.
Definition json.h:277
bool end_object(int64_t keytableheader_instruction) const noexcept
HERE.
Definition json.h:214
void step_backward() noexcept
HERE.
Definition json.h:100
void write_uint8(int64_t index, uint8_t x) noexcept
HERE.
Definition json.h:229
int64_t get_and_increment(int64_t index) noexcept
HERE.
Definition json.h:259
void write_add_int64(int64_t index, int64_t x) noexcept
HERE.
Definition json.h:249
int64_t argument2() const noexcept
HERE.
Definition json.h:85
void add_to_length(int64_t length) noexcept
HERE.
Definition json.h:269
std::string output_name(int64_t i) const
HERE.
Definition json.h:282
void write_int8(int64_t index, int8_t x) noexcept
HERE.
Definition json.h:224
void push_stack(int64_t jump_to) noexcept
HERE.
Definition json.h:105
int64_t find_key(const char *str) noexcept
HERE.
Definition json.h:135
int64_t argument3() const noexcept
HERE.
Definition json.h:90
std::string debug() const noexcept
HERE.
int64_t output_num_items(int64_t i) const
HERE.
Definition json.h:303
std::string output_dtype(int64_t i) const
HERE.
Definition json.h:287
bool key_already_filled(int64_t record_identifier, int64_t j) const noexcept
HERE.
Definition json.h:194
int64_t key_instruction_at(int64_t i) const noexcept
HERE.
Definition json.h:200
int64_t current_stack_depth() const noexcept
HERE.
Definition json.h:65
#define LIBAWKWARD_EXPORT_SYMBOL
Definition common.h:44
Definition ArrayBuilder.h:14
LIBAWKWARD_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.