inline Val parseArr() { Arr arr; // Skip '[' ++idx; // Empty array if(isC(']')) goto end; // Reserve some memory arr.reserve(10); while(true) { // Get value arr.emplace_back(parseVal()); // Check for another value if(isC(',')) { ++idx; continue; } // Check for end of the array if(isC(']')) break; throwError("Invalid array", std::string{"Expected either `,` or `]`, got `"} + getC() + "`"); } end: // Skip ']' ++idx; return Val{arr}; }
void XtrazResponsePrivate::parseSrv(QXmlStreamReader &xml) { while (!xml.atEnd()) { xml.readNext(); if (xml.isStartElement()) { if (xml.name() == "id") service = xml.readElementText(); else if (xml.name() == "val") parseVal(xml); else xml.skipCurrentElement(); } else if (xml.isEndElement()) { return; } } }
inline Val parseObj() { Obj obj; // Skip '{' ++idx; // Empty object if(isC('}')) goto end; // Reserve some memory obj.reserve(10); while(true) { // Read string key if(!isC('"')) throwError("Invalid object", std::string{"Expected `\"` , got `"} + getC() + "`"); auto key(readStr()); // Read ':' if(!isC(':')) throwError("Invalid object", std::string{"Expected `:` , got `"} + getC() + "`"); // Skip ':' ++idx; // Read value obj[std::move(key)] = parseVal(); // Check for another key-value pair if(isC(',')) { ++idx; continue; } // Check for end of the object if(isC('}')) break; throwError("Invalid object", std::string{"Expected either `,` or `}`, got `"} + getC() + "`"); } end: // Skip '}' ++idx; return Val{obj}; }