#include <iostream>
#include <string>
#include <vector>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/foreach.hpp>
#include <boost/property_tree/ptree.hpp>
#include <map>
#include <string>
// Assumes all arrays are flat except for the special case in 1687_if_RAIL, which is ignored for counting
std::map<std::string, int> countFabricBlocks(const boost::property_tree::ptree* pt) {
std::map<std::string, int> result;
if (!pt) return result;
auto pathsOpt = pt->get_child_optional("PATHS");
if (!pathsOpt) return result;
const auto& paths = pathsOpt.get();
for (const auto& kv : paths) {
const auto& arr = kv.second;
// Check if the first value is "SERIAL"
auto it = arr.begin();
if (it == arr.end()) continue;
if (it->second.get_value<std::string>() != "SERIAL") continue;
// Check if the second value exists and is a string
++it;
if (it == arr.end()) continue;
std::string fabricName;
try {
fabricName = it->second.get_value<std::string>();
} catch (...) {
continue; // Not a string, skip
}
result[fabricName]++;
}
return result;
}
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
int main() {
std::string json_str = R"({
"PATHS": {
"SF_MAIN_RAIL": [
"SERIAL",
"rail_in_if",
"cpu_C7T1_fabric1_inst",
"down_if"
],
"cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P12": [
"SERIAL",
"cpu_C7T1_fabric1_inst",
"cpu_C7T1_comp1_inst_P6",
"cpu_C7T1_comp1_inst_P0",
"cpu_C7T1_comp1_inst_P3",
"cpu_C7T1_comp1_inst_P10",
"cpu_C7T1_comp1_inst_P12"
],
"cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P11": [
"SERIAL",
"cpu_C7T1_fabric1_inst",
"cpu_C7T1_comp1_inst_P7",
"cpu_C7T1_comp1_inst_P1",
"cpu_C7T1_comp1_inst_P4",
"cpu_C7T1_comp1_inst_P11"
],
"cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P5": [
"SERIAL",
"cpu_C7T1_fabric1_inst",
"cpu_C7T1_comp1_inst_P8",
"cpu_C7T1_comp1_inst_P2",
"cpu_C7T1_comp1_inst_P5"
],
"cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P9": [
"SERIAL",
"cpu_C7T1_fabric1_inst",
"cpu_C7T1_comp1_inst_P9"
],
"cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P5_2": [
"SERIAL",
"cpu_C7T1_fabric2_inst",
"cpu_C7T1_comp1_inst_P8",
"cpu_C7T1_comp1_inst_P2",
"cpu_C7T1_comp1_inst_P5"
],
"cpu_C7T1_fabric1_inst_to_codec_cpu_C7T1_comp1_inst_P9_2": [
"SERIAL",
"cpu_C7T1_fabric2_inst",
"cpu_C7T1_comp1_inst_P9"
]
}
})";
std::stringstream ss(json_str);
boost::property_tree::ptree pt;
boost::property_tree::read_json(ss, pt);
auto result = countFabricBlocks(&pt);
for (const auto& kv : result) {
std::cout << "key: " << kv.first << ", value: " << kv.second << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9wdHJlZS5ocHA+CiNpbmNsdWRlIDxib29zdC9wcm9wZXJ0eV90cmVlL3htbF9wYXJzZXIuaHBwPgojaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CgojaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9wdHJlZS5ocHA+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzdHJpbmc+CgovLyBBc3N1bWVzIGFsbCBhcnJheXMgYXJlIGZsYXQgZXhjZXB0IGZvciB0aGUgc3BlY2lhbCBjYXNlIGluIDE2ODdfaWZfUkFJTCwgd2hpY2ggaXMgaWdub3JlZCBmb3IgY291bnRpbmcKc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gY291bnRGYWJyaWNCbG9ja3MoY29uc3QgYm9vc3Q6OnByb3BlcnR5X3RyZWU6OnB0cmVlKiBwdCkgewogICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gcmVzdWx0OwogICAgaWYgKCFwdCkgcmV0dXJuIHJlc3VsdDsKCiAgICBhdXRvIHBhdGhzT3B0ID0gcHQtPmdldF9jaGlsZF9vcHRpb25hbCgiUEFUSFMiKTsKICAgIGlmICghcGF0aHNPcHQpIHJldHVybiByZXN1bHQ7CgogICAgY29uc3QgYXV0byYgcGF0aHMgPSBwYXRoc09wdC5nZXQoKTsKCiAgICBmb3IgKGNvbnN0IGF1dG8mIGt2IDogcGF0aHMpIHsKICAgICAgICBjb25zdCBhdXRvJiBhcnIgPSBrdi5zZWNvbmQ7CiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IHZhbHVlIGlzICJTRVJJQUwiCiAgICAgICAgYXV0byBpdCA9IGFyci5iZWdpbigpOwogICAgICAgIGlmIChpdCA9PSBhcnIuZW5kKCkpIGNvbnRpbnVlOwogICAgICAgIGlmIChpdC0+c2Vjb25kLmdldF92YWx1ZTxzdGQ6OnN0cmluZz4oKSAhPSAiU0VSSUFMIikgY29udGludWU7CgogICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWNvbmQgdmFsdWUgZXhpc3RzIGFuZCBpcyBhIHN0cmluZwogICAgICAgICsraXQ7CiAgICAgICAgaWYgKGl0ID09IGFyci5lbmQoKSkgY29udGludWU7CiAgICAgICAgc3RkOjpzdHJpbmcgZmFicmljTmFtZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBmYWJyaWNOYW1lID0gaXQtPnNlY29uZC5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCk7CiAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBOb3QgYSBzdHJpbmcsIHNraXAKICAgICAgICB9CiAgICAgICAgcmVzdWx0W2ZhYnJpY05hbWVdKys7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgojaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9qc29uX3BhcnNlci5ocHA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCkgewogICAgc3RkOjpzdHJpbmcganNvbl9zdHIgPSBSIih7CiAgICAgICAgIlBBVEhTIjogewogICAgICAgICAgICAiU0ZfTUFJTl9SQUlMIjogWwogICAgICAgICAgICAgICAgIlNFUklBTCIsCiAgICAgICAgICAgICAgICAicmFpbF9pbl9pZiIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0IiwKICAgICAgICAgICAgICAgICJkb3duX2lmIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0X3RvX2NvZGVjX2NwdV9DN1QxX2NvbXAxX2luc3RfUDEyIjogWwogICAgICAgICAgICAgICAgIlNFUklBTCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0IiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1A2IiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1AwIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1AzIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1AxMCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfY29tcDFfaW5zdF9QMTIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3RfdG9fY29kZWNfY3B1X0M3VDFfY29tcDFfaW5zdF9QMTEiOiBbCiAgICAgICAgICAgICAgICAiU0VSSUFMIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3QiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDciLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDEiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDQiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDExIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMV9pbnN0X3RvX2NvZGVjX2NwdV9DN1QxX2NvbXAxX2luc3RfUDUiOiBbCiAgICAgICAgICAgICAgICAiU0VSSUFMIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3QiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDgiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDIiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3RfdG9fY29kZWNfY3B1X0M3VDFfY29tcDFfaW5zdF9QOSI6IFsKICAgICAgICAgICAgICAgICJTRVJJQUwiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2ZhYnJpYzFfaW5zdCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfY29tcDFfaW5zdF9QOSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImNwdV9DN1QxX2ZhYnJpYzFfaW5zdF90b19jb2RlY19jcHVfQzdUMV9jb21wMV9pbnN0X1A1XzIiOiBbCiAgICAgICAgICAgICAgICAiU0VSSUFMIiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMyX2luc3QiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDgiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDIiLAogICAgICAgICAgICAgICAgImNwdV9DN1QxX2NvbXAxX2luc3RfUDUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjcHVfQzdUMV9mYWJyaWMxX2luc3RfdG9fY29kZWNfY3B1X0M3VDFfY29tcDFfaW5zdF9QOV8yIjogWwogICAgICAgICAgICAgICAgIlNFUklBTCIsCiAgICAgICAgICAgICAgICAiY3B1X0M3VDFfZmFicmljMl9pbnN0IiwKICAgICAgICAgICAgICAgICJjcHVfQzdUMV9jb21wMV9pbnN0X1A5IgogICAgICAgICAgICBdCiAgICAgICAgfQogICAgfSkiOwoKICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKGpzb25fc3RyKTsKICAgIGJvb3N0Ojpwcm9wZXJ0eV90cmVlOjpwdHJlZSBwdDsKICAgIGJvb3N0Ojpwcm9wZXJ0eV90cmVlOjpyZWFkX2pzb24oc3MsIHB0KTsKCiAgICBhdXRvIHJlc3VsdCA9IGNvdW50RmFicmljQmxvY2tzKCZwdCk7CgogICAgZm9yIChjb25zdCBhdXRvJiBrdiA6IHJlc3VsdCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAia2V5OiAiIDw8IGt2LmZpcnN0IDw8ICIsIHZhbHVlOiAiIDw8IGt2LnNlY29uZCA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==