Generate inline parsing code for an array field
| 168 | |
| 169 | // Generate inline parsing code for an array field |
| 170 | static 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 |
| 216 | static void generate_nested_field_parse(std::stringstream& ss, |
no test coverage detected