std::vector<int64_t> parseInts(Tokens& tokens) { std::vector<int64_t> r; if (tokens.peek() == "[") { tokens.next(); while (tokens.peek() != "]") r.push_back(parseInt(tokens)); tokens.next(); } else { r.push_back(parseInt(tokens)); } return r; }
std::vector<bool> parseBools(Tokens& tokens) { std::vector<bool> r; if (tokens.peek() == "[") { tokens.next(); while (tokens.peek() != "]") r.push_back(parseBool(tokens)); tokens.next(); } else { r.push_back(parseBool(tokens)); } return r; }
std::vector<std::string> parseStrings(Tokens& tokens) { std::vector<std::string> r; if (tokens.peek() == "[") { tokens.next(); while (tokens.peek() != "]") r.push_back(parseString(tokens)); tokens.next(); } else { r.push_back(parseString(tokens)); } return r; }
Params parseParams(Tokens& tokens) { Params r; while (tokens.peek()[0] == '"') { auto param = parseString(tokens); if (param.rfind("string", 0) == 0 || param.rfind("texture", 0) == 0 || param.rfind("spectrum", 0) == 0) r.strings[param] = parseStrings(tokens); else if (param.rfind("integer", 0) == 0) r.ints[param] = parseInts(tokens); else if (param.rfind("bool", 0) == 0) r.bools[param] = parseBools(tokens); else r.reals[param] = parseReals(tokens); } return r; }