3#ifndef AWKWARD_IO_JSON_H_
4#define AWKWARD_IO_JSON_H_
45 string(
const char* x, int64_t length) = 0;
63 json(
const char* data) = 0;
92 const char* nan_string =
nullptr,
93 const char* infinity_string =
nullptr,
94 const char* minus_infinity_string =
nullptr,
95 const char* complex_real_string =
nullptr,
96 const char* complex_imag_string =
nullptr);
110 string(
const char* x, int64_t length)
override;
122 json(
const char* data)
override;
129 const char* nan_string_;
130 const char* infinity_string_;
131 const char* minus_infinity_string_;
132 const char* complex_real_string_;
133 const char* complex_imag_string_;
156 const char* nan_string =
nullptr,
157 const char* infinity_string =
nullptr,
158 const char* minus_infinity_string =
nullptr,
159 const char* complex_real_string =
nullptr,
160 const char* complex_imag_string =
nullptr);
174 string(
const char* x, int64_t length)
override;
186 json(
const char* data)
override;
193 const char* nan_string_;
194 const char* infinity_string_;
195 const char* minus_infinity_string_;
196 const char* complex_real_string_;
197 const char* complex_imag_string_;
224 const char* nan_string =
nullptr,
225 const char* infinity_string =
nullptr,
226 const char* minus_infinity_string =
nullptr,
227 const char* complex_real_string =
nullptr,
228 const char* complex_imag_string =
nullptr);
242 string(
const char* x, int64_t length)
override;
254 json(
const char* data)
override;
258 const char* nan_string_;
259 const char* infinity_string_;
260 const char* minus_infinity_string_;
261 const char* complex_real_string_;
262 const char* complex_imag_string_;
289 const char* nan_string =
nullptr,
290 const char* infinity_string =
nullptr,
291 const char* minus_infinity_string =
nullptr,
292 const char* complex_real_string =
nullptr,
293 const char* complex_imag_string =
nullptr);
307 string(
const char* x, int64_t length)
override;
319 json(
const char* data)
override;
323 const char* nan_string_;
324 const char* infinity_string_;
325 const char* minus_infinity_string_;
326 const char* complex_real_string_;
327 const char* complex_imag_string_;
344 const char* nan_string =
nullptr,
345 const char* infinity_string =
nullptr,
346 const char* minus_infinity_string =
nullptr);
364 const char* nan_string =
nullptr,
365 const char* infinity_string =
nullptr,
366 const char* minus_infinity_string =
nullptr);
374 virtual int64_t
read(int64_t num_bytes,
char* buffer) = 0;
398 const char* nan_string =
nullptr,
399 const char* posinf_string =
nullptr,
400 const char* neginf_string =
nullptr);
407 const char* nan_string,
408 const char* posinf_string,
409 const char* neginf_string,
410 const char* jsonassembly,
416 return current_stack_depth_;
421 return current_instruction_;
426 return instructions_.data()[current_instruction_ * 4];
431 return instructions_.data()[current_instruction_ * 4 + 1];
436 return instructions_.data()[current_instruction_ * 4 + 2];
441 return instructions_.data()[current_instruction_ * 4 + 3];
446 current_instruction_++;
451 current_instruction_--;
456 instruction_stack_.data()[current_stack_depth_] = current_instruction_;
457 current_stack_depth_++;
458 current_instruction_ = jump_to;
463 current_stack_depth_--;
464 current_instruction_ = instruction_stack_.data()[current_stack_depth_];
469 int64_t* offsets = string_offsets_.data();
470 char* chars = characters_.data();
474 for (int64_t i = stringsstart; i <
argument3(); i++) {
476 stop = offsets[i + 1];
477 if (strncmp(str, &chars[start], stop - start) == 0) {
478 return i - stringsstart;
485 inline int64_t
find_key(
const char* str)
noexcept {
486 int64_t* offsets = string_offsets_.data();
487 char* chars = characters_.data();
491 for (int64_t i = current_instruction_ + 1; i <= current_instruction_ +
argument1(); i++) {
492 stringi = instructions_.data()[i * 4 + 1];
493 start = offsets[stringi];
494 stop = offsets[stringi + 1];
495 if (strncmp(str, &chars[start], stop - start) == 0) {
496 return instructions_.data()[i * 4 + 2];
504 buffers_uint8_[
index].append(*
reinterpret_cast<uint8_t*
>(&x));
509 buffers_uint8_[
index].append(x);
514 buffers_uint8_[
index].extend(values, num_items);
519 buffers_int64_[
index].append(x);
524 buffers_int64_[
index].append(
static_cast<int64_t
>(x));
529 buffers_int64_[
index].append(buffers_int64_[
index].last() + x);
534 buffers_float64_[
index].append(x);
539 return counters_[
index]++;
557 return output_names_.size();
562 return output_names_[i];
567 switch (output_dtypes_[i]) {
583 switch (output_dtypes_[i]) {
585 return buffers_uint8_[output_which_[i]].nbytes();
587 return buffers_uint8_[output_which_[i]].nbytes();
589 return buffers_int64_[output_which_[i]].nbytes() / 8;
591 return buffers_float64_[output_which_[i]].nbytes() / 8;
599 switch (output_dtypes_[i]) {
601 buffers_uint8_[output_which_[i]].concatenate(
602 reinterpret_cast<uint8_t*
>(external_pointer)
606 buffers_uint8_[output_which_[i]].concatenate(
607 reinterpret_cast<uint8_t*
>(external_pointer)
611 buffers_int64_[output_which_[i]].concatenate(
612 reinterpret_cast<int64_t*
>(external_pointer)
616 buffers_float64_[output_which_[i]].concatenate(
617 reinterpret_cast<double*
>(external_pointer)
624 std::vector<int64_t> instructions_;
625 std::vector<char> characters_;
626 std::vector<int64_t> string_offsets_;
628 std::vector<std::string> output_names_;
629 std::vector<util::dtype> output_dtypes_;
630 std::vector<int64_t> output_which_;
631 std::vector<GrowableBuffer<uint8_t>> buffers_uint8_;
632 std::vector<GrowableBuffer<int64_t>> buffers_int64_;
633 std::vector<GrowableBuffer<double>> buffers_float64_;
635 int64_t current_instruction_;
636 std::vector<int64_t> instruction_stack_;
637 int64_t current_stack_depth_;
638 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:372
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:513
void step_forward() noexcept
HERE.
Definition: json.h:445
void pop_stack() noexcept
HERE.
Definition: json.h:462
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:523
void output_fill(int64_t i, void *external_pointer) const
HERE.
Definition: json.h:598
int64_t instruction() const noexcept
HERE.
Definition: json.h:425
int64_t length() const noexcept
HERE.
Definition: json.h:543
void write_float64(int64_t index, double x) noexcept
HERE.
Definition: json.h:533
int64_t find_enum(const char *str) noexcept
HERE.
Definition: json.h:468
void write_int64(int64_t index, int64_t x) noexcept
HERE.
Definition: json.h:518
int64_t current_instruction() const noexcept
HERE.
Definition: json.h:420
int64_t argument1() const noexcept
HERE.
Definition: json.h:430
int64_t num_outputs() const
HERE.
Definition: json.h:556
void step_backward() noexcept
HERE.
Definition: json.h:450
void write_uint8(int64_t index, uint8_t x) noexcept
HERE.
Definition: json.h:508
int64_t get_and_increment(int64_t index) noexcept
HERE.
Definition: json.h:538
void write_add_int64(int64_t index, int64_t x) noexcept
HERE.
Definition: json.h:528
int64_t argument2() const noexcept
HERE.
Definition: json.h:435
void add_to_length(int64_t length) noexcept
HERE.
Definition: json.h:548
std::string output_name(int64_t i) const
HERE.
Definition: json.h:561
void write_int8(int64_t index, int8_t x) noexcept
HERE.
Definition: json.h:503
void push_stack(int64_t jump_to) noexcept
HERE.
Definition: json.h:455
int64_t find_key(const char *str) noexcept
HERE.
Definition: json.h:485
int64_t argument3() const noexcept
HERE.
Definition: json.h:440
std::string debug() const noexcept
HERE.
int64_t output_num_items(int64_t i) const
HERE.
Definition: json.h:582
std::string output_dtype(int64_t i) const
HERE.
Definition: json.h:566
int64_t current_stack_depth() const noexcept
HERE.
Definition: json.h:415
Produces a JSON-formatted file.
Definition: json.h:203
void field(const char *x) override
Insert a key for a key-value pair.
void json(const char *data) override
Write raw JSON as a string.
void boolean(bool x) override
Append a boolean value x.
void real(double x) override
Append a real value x.
void endrecord() override
End the current record.
void endlist() override
End the current list.
void beginrecord() override
Begin a record.
ToJsonFile(FILE *destination, int64_t maxdecimals, int64_t buffersize, const char *nan_string=nullptr, const char *infinity_string=nullptr, const char *minus_infinity_string=nullptr, const char *complex_real_string=nullptr, const char *complex_imag_string=nullptr)
Creates a ToJsonFile with a full set of parameters.
void complex(std::complex< double > x) override
Append a complex value x.
void string(const char *x, int64_t length) override
Append a string value x.
void integer(int64_t x) override
Append an integer value x.
~ToJsonFile()
Empty destructor; required for some C++ reason.
void null() override
Append a null value.
void beginlist() override
Begin a list.
Produces a pretty JSON-formatted file.
Definition: json.h:268
void field(const char *x) override
Insert a key for a key-value pair.
void json(const char *data) override
Write raw JSON as a string.
void boolean(bool x) override
Append a boolean value x.
ToJsonPrettyFile(FILE *destination, int64_t maxdecimals, int64_t buffersize, const char *nan_string=nullptr, const char *infinity_string=nullptr, const char *minus_infinity_string=nullptr, const char *complex_real_string=nullptr, const char *complex_imag_string=nullptr)
Creates a ToJsonPrettyFile with a full set of parameters.
void real(double x) override
Append a real value x.
void endrecord() override
End the current record.
void endlist() override
End the current list.
void beginrecord() override
Begin a record.
void complex(std::complex< double > x) override
Append a complex value x.
void string(const char *x, int64_t length) override
Append a string value x.
void integer(int64_t x) override
Append an integer value x.
void null() override
Append a null value.
~ToJsonPrettyFile()
Empty destructor; required for some C++ reason.
void beginlist() override
Begin a list.
Produces a pretty JSON-formatted string.
Definition: json.h:139
void field(const char *x) override
Insert a key for a key-value pair.
void json(const char *data) override
Write raw JSON as a string.
ToJsonPrettyString(int64_t maxdecimals, const char *nan_string=nullptr, const char *infinity_string=nullptr, const char *minus_infinity_string=nullptr, const char *complex_real_string=nullptr, const char *complex_imag_string=nullptr)
Creates a ToJsonPrettyString with a full set of parameters.
void boolean(bool x) override
Append a boolean value x.
void real(double x) override
Append a real value x.
void endrecord() override
End the current record.
void endlist() override
End the current list.
void beginrecord() override
Begin a record.
void complex(std::complex< double > x) override
Append a complex value x.
void string(const char *x, int64_t length) override
Append a string value x.
void integer(int64_t x) override
Append an integer value x.
const std::string tostring()
Return the accumulated data as a string.
~ToJsonPrettyString()
Empty destructor; required for some C++ reason.
void null() override
Append a null value.
void beginlist() override
Begin a list.
Produces a JSON-formatted string.
Definition: json.h:75
void field(const char *x) override
Insert a key for a key-value pair.
void json(const char *data) override
Write raw JSON as a string.
void boolean(bool x) override
Append a boolean value x.
void real(double x) override
Append a real value x.
void endrecord() override
End the current record.
void endlist() override
End the current list.
void beginrecord() override
Begin a record.
ToJsonString(int64_t maxdecimals, const char *nan_string=nullptr, const char *infinity_string=nullptr, const char *minus_infinity_string=nullptr, const char *complex_real_string=nullptr, const char *complex_imag_string=nullptr)
Creates a ToJsonString with a full set of parameters.
void complex(std::complex< double > x) override
Append a complex value x.
void string(const char *x, int64_t length) override
Append a string value x.
void integer(int64_t x) override
Append an integer value x.
~ToJsonString()
Empty destructor; required for some C++ reason.
const std::string tostring()
Return the accumulated data as a string.
void null() override
Append a null value.
void beginlist() override
Begin a list.
virtual void complex(std::complex< double > x)=0
Append a complex value x.
virtual void integer(int64_t x)=0
Append an integer value x.
void field(const std::string &x)
Insert a key for a key-value pair.
virtual void field(const char *x)=0
Insert a key for a key-value pair.
virtual void endrecord()=0
End the current record.
virtual ~ToJson()
Virtual destructor acts as a first non-inline virtual function that determines a specific translation...
virtual void string(const char *x, int64_t length)=0
Append a string value x.
virtual void endlist()=0
End the current list.
virtual void null()=0
Append a null value.
virtual void boolean(bool x)=0
Append a boolean value x.
virtual void json(const char *data)=0
Write raw JSON as a string.
virtual void beginlist()=0
Begin a list.
void string(const std::string &x)
Append a string value x.
virtual void real(double x)=0
Append a real value x.
virtual void beginrecord()=0
Begin a record.
#define LIBAWKWARD_EXPORT_SYMBOL
Definition: common.h:45
Definition: BitMaskedArray.h:15
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.
LIBAWKWARD_EXPORT_SYMBOL int64_t FromJsonString(const char *source, ArrayBuilder &builder, const char *nan_string=nullptr, const char *infinity_string=nullptr, const char *minus_infinity_string=nullptr)
Parses a JSON-encoded string using an ArrayBuilder.
LIBAWKWARD_EXPORT_SYMBOL int64_t FromJsonFile(FILE *source, ArrayBuilder &builder, int64_t buffersize, const char *nan_string=nullptr, const char *infinity_string=nullptr, const char *minus_infinity_string=nullptr)
Parses a JSON-encoded file using an ArrayBuilder.