All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
json.h
Go to the documentation of this file.
1// BSD 3-Clause License; see https://github.com/scikit-hep/awkward-1.0/blob/main/LICENSE
2
3#ifndef AWKWARD_IO_JSON_H_
4#define AWKWARD_IO_JSON_H_
5
6#include <complex>
7#include <cstdio>
8#include <string>
9
10#include "awkward/common.h"
15#include "awkward/util.h"
16
17namespace awkward {
23 public:
24 virtual int64_t read(int64_t num_bytes, char* buffer) = 0;
25 };
26
45 ArrayBuilder& builder,
46 int64_t buffersize,
47 bool read_one,
48 const char* nan_string = nullptr,
49 const char* posinf_string = nullptr,
50 const char* neginf_string = nullptr);
51
53 public:
55 int64_t buffersize,
56 bool read_one,
57 const char* nan_string,
58 const char* posinf_string,
59 const char* neginf_string,
60 const char* jsonassembly,
61 int64_t initial,
62 double resize);
63
65 inline int64_t current_stack_depth() const noexcept {
66 return current_stack_depth_;
67 }
68
70 inline int64_t current_instruction() const noexcept {
71 return current_instruction_;
72 }
73
75 inline int64_t instruction() const noexcept {
76 return instructions_.data()[current_instruction_ * 4];
77 }
78
80 inline int64_t argument1() const noexcept {
81 return instructions_.data()[current_instruction_ * 4 + 1];
82 }
83
85 inline int64_t argument2() const noexcept {
86 return instructions_.data()[current_instruction_ * 4 + 2];
87 }
88
90 inline int64_t argument3() const noexcept {
91 return instructions_.data()[current_instruction_ * 4 + 3];
92 }
93
95 inline void step_forward() noexcept {
96 current_instruction_++;
97 }
98
100 inline void step_backward() noexcept {
101 current_instruction_--;
102 }
103
105 inline void push_stack(int64_t jump_to) noexcept {
106 instruction_stack_.data()[current_stack_depth_] = current_instruction_;
107 current_stack_depth_++;
108 current_instruction_ = jump_to;
109 }
110
112 inline void pop_stack() noexcept {
113 current_stack_depth_--;
114 current_instruction_ = instruction_stack_.data()[current_stack_depth_];
115 }
116
118 inline int64_t find_enum(const char* str) noexcept {
119 int64_t* offsets = string_offsets_.data();
120 char* chars = characters_.data();
121 int64_t stringsstart = argument2();
122 int64_t start;
123 int64_t stop;
124 for (int64_t i = stringsstart; i < argument3(); i++) {
125 start = offsets[i];
126 stop = offsets[i + 1];
127 if (strncmp(str, &chars[start], (size_t)(stop - start)) == 0) {
128 return i - stringsstart;
129 }
130 }
131 return -1;
132 }
133
135 inline int64_t find_key(const char* str) noexcept {
136 int64_t* offsets = string_offsets_.data();
137 char* chars = characters_.data();
138 int64_t stringi;
139 int64_t start;
140 int64_t stop;
141 for (int64_t i = current_instruction_ + 1; i <= current_instruction_ + argument1(); i++) {
142 stringi = instructions_.data()[i * 4 + 1];
143 start = offsets[stringi];
144 stop = offsets[stringi + 1];
145 if (strncmp(str, &chars[start], (size_t)(stop - start)) == 0) {
146 return instructions_.data()[i * 4 + 2];
147 }
148 }
149 return -1;
150 }
151
153 inline void write_int8(int64_t index, int8_t x) noexcept {
154 buffers_uint8_[(size_t)index].append(*reinterpret_cast<uint8_t*>(&x));
155 }
156
158 inline void write_uint8(int64_t index, uint8_t x) noexcept {
159 buffers_uint8_[(size_t)index].append(x);
160 }
161
163 inline void write_many_uint8(int64_t index, int64_t num_items, const uint8_t* values) noexcept {
164 buffers_uint8_[(size_t)index].extend(values, (size_t)num_items);
165 }
166
168 inline void write_int64(int64_t index, int64_t x) noexcept {
169 buffers_int64_[(size_t)index].append(x);
170 }
171
173 inline void write_uint64(int64_t index, uint64_t x) noexcept {
174 buffers_int64_[(size_t)index].append(static_cast<int64_t>(x));
175 }
176
178 inline void write_add_int64(int64_t index, int64_t x) noexcept {
179 buffers_int64_[(size_t)index].append(buffers_int64_[(size_t)index].last() + x);
180 }
181
183 inline void write_float64(int64_t index, double x) noexcept {
184 buffers_float64_[(size_t)index].append(x);
185 }
186
188 inline int64_t get_and_increment(int64_t index) noexcept {
189 return counters_[(size_t)index]++;
190 }
191
193 int64_t length() const noexcept {
194 return length_;
195 }
196
198 inline void add_to_length(int64_t length) noexcept {
199 length_ += length;
200 }
201
203 std::string debug() const noexcept;
204
206 int64_t num_outputs() const {
207 return (int64_t)output_names_.size();
208 }
209
211 std::string output_name(int64_t i) const {
212 return output_names_[(size_t)i];
213 }
214
216 std::string output_dtype(int64_t i) const {
217 switch (output_dtypes_[(size_t)i]) {
219 return "int8";
221 return "uint8";
223 return "int64";
225 return "float64";
226 default:
227 return "unknown";
228 }
229 }
230
232 int64_t output_num_items(int64_t i) const {
233 switch (output_dtypes_[(size_t)i]) {
235 return (int64_t)buffers_uint8_[(size_t)output_which_[(size_t)i]].nbytes();
237 return (int64_t)buffers_uint8_[(size_t)output_which_[(size_t)i]].nbytes();
239 return (int64_t)buffers_int64_[(size_t)output_which_[(size_t)i]].nbytes() / 8;
241 return (int64_t)buffers_float64_[(size_t)output_which_[(size_t)i]].nbytes() / 8;
242 default:
243 return -1;
244 }
245 }
246
248 void output_fill(int64_t i, void* external_pointer) const {
249 switch (output_dtypes_[(size_t)i]) {
251 buffers_uint8_[(size_t)output_which_[(size_t)i]].concatenate(
252 reinterpret_cast<uint8_t*>(external_pointer)
253 );
254 break;
256 buffers_uint8_[(size_t)output_which_[(size_t)i]].concatenate(
257 reinterpret_cast<uint8_t*>(external_pointer)
258 );
259 break;
261 buffers_int64_[(size_t)output_which_[(size_t)i]].concatenate(
262 reinterpret_cast<int64_t*>(external_pointer)
263 );
264 break;
266 buffers_float64_[(size_t)output_which_[(size_t)i]].concatenate(
267 reinterpret_cast<double*>(external_pointer)
268 );
269 break;
270 default:
271 break;
272 }
273 }
274
275 private:
276 std::vector<int64_t> instructions_;
277 std::vector<char> characters_;
278 std::vector<int64_t> string_offsets_;
279
280 std::vector<std::string> output_names_;
281 std::vector<util::dtype> output_dtypes_;
282 std::vector<int64_t> output_which_;
283 std::vector<GrowableBuffer<uint8_t>> buffers_uint8_;
284 std::vector<GrowableBuffer<int64_t>> buffers_int64_;
285 std::vector<GrowableBuffer<double>> buffers_float64_;
286
287 int64_t current_instruction_;
288 std::vector<int64_t> instruction_stack_;
289 int64_t current_stack_depth_;
290 std::vector<int64_t> counters_;
291
292 int64_t length_;
293 };
294
295}
296
297#endif // AWKWARD_IO_JSON_H_
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
Definition json.h:52
void write_many_uint8(int64_t index, int64_t num_items, const uint8_t *values) noexcept
HERE.
Definition json.h:163
void step_forward() noexcept
HERE.
Definition json.h:95
void pop_stack() noexcept
HERE.
Definition json.h:112
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:173
void output_fill(int64_t i, void *external_pointer) const
HERE.
Definition json.h:248
int64_t instruction() const noexcept
HERE.
Definition json.h:75
int64_t length() const noexcept
HERE.
Definition json.h:193
void write_float64(int64_t index, double x) noexcept
HERE.
Definition json.h:183
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:168
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:206
void step_backward() noexcept
HERE.
Definition json.h:100
void write_uint8(int64_t index, uint8_t x) noexcept
HERE.
Definition json.h:158
int64_t get_and_increment(int64_t index) noexcept
HERE.
Definition json.h:188
void write_add_int64(int64_t index, int64_t x) noexcept
HERE.
Definition json.h:178
int64_t argument2() const noexcept
HERE.
Definition json.h:85
void add_to_length(int64_t length) noexcept
HERE.
Definition json.h:198
std::string output_name(int64_t i) const
HERE.
Definition json.h:211
void write_int8(int64_t index, int8_t x) noexcept
HERE.
Definition json.h:153
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:232
std::string output_dtype(int64_t i) const
HERE.
Definition json.h:216
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.