MCPcopy Create free account
hub / github.com/coi/coi / generate_array_field_parse

Function generate_array_field_parse

src/codegen/json_codegen.cc:170–213  ·  view source on GitHub ↗

Generate inline parsing code for an array field

Source from the content-addressed store, hash-verified

168
169// Generate inline parsing code for an array field
170static void generate_array_field_parse(std::stringstream& ss,
171 const std::string& elem_type,
172 const std::string& field_name,
173 uint32_t field_idx,
174 const std::string& result_var,
175 const std::string& meta_var,
176 const std::string& src_var,
177 const std::string& pos_var,
178 const std::string& len_var,
179 const std::string& indent,
180 int depth) {
181 std::string d = std::to_string(depth);
182 std::string arr_view = "_arr_view" + d;
183 std::string aes = "_aes" + d, aep = "_aep" + d, aelen = "_aelen" + d;
184 std::string aok = "_aok" + d;
185 std::string ae_view = "_ae_view" + d, ae = "_ae" + d, ae_meta = "_ae_meta" + d, ae_ok = "_ae_ok" + d;
186
187 ss << indent << "auto " << arr_view << " = __coi_json::isolate(" << src_var << ", " << pos_var << ", " << len_var << ");\n";
188 ss << indent << "if (" << arr_view << ".length() > 0) {\n";
189 ss << indent << " __coi_json::for_each(" << arr_view << ".data(), 0, " << arr_view << ".length(), [&](const char* " << aes << ", uint32_t " << aep << ", uint32_t " << aelen << ") {\n";
190
191 if (elem_type == "string") {
192 ss << indent << " " << result_var << "." << field_name << ".push_back(__coi_json::ext_str(" << aes << ", " << aep << ", " << aelen << "));\n";
193 } else if (elem_type == "int" || elem_type == "float" || elem_type == "bool") {
194 ss << indent << " bool " << aok << ";\n";
195 ss << indent << " " << result_var << "." << field_name << ".push_back(__coi_json::ext_" << elem_type << "(" << aes << ", " << aep << ", " << aelen << ", " << aok << "));\n";
196 } else if (!elem_type.empty() && std::isupper(elem_type[0]) && DataTypeRegistry::instance().lookup(elem_type)) {
197 // Nested data type array
198 ss << indent << " auto " << ae_view << " = __coi_json::isolate(" << aes << ", " << aep << ", " << aelen << ");\n";
199 ss << indent << " if (" << ae_view << ".length() > 0) {\n";
200 ss << indent << " " << elem_type << " " << ae << "{};\n";
201 ss << indent << " " << elem_type << "Meta " << ae_meta << "{};\n";
202 ss << indent << " bool " << ae_ok << ";\n";
203 generate_object_fields_parse(ss, elem_type, ae, ae_meta,
204 ae_view + ".data()", ae_view + ".length()", ae_ok,
205 indent + " ", depth + 1);
206 ss << indent << " " << result_var << "." << field_name << ".push_back(" << ae << ");\n";
207 ss << indent << " }\n";
208 }
209
210 ss << indent << " });\n";
211 ss << indent << " " << meta_var << ".set(" << field_idx << ");\n";
212 ss << indent << "}\n";
213}
214
215// Generate inline parsing code for a nested object field
216static void generate_nested_field_parse(std::stringstream& ss,

Callers 1

Calls 2

lookupMethod · 0.80

Tested by

no test coverage detected