/* * PacketStructure.cpp * * Created on: Dec 7, 2022 * Author: valerio */ #include <PacketStructureTxt.h> using namespace inaf::oasbo::Packets; std::vector<std::tuple<uint, std::string, uint>> PacketStructureTxt::readStructureFromSource( std::string source) { std::ifstream file; file.open(source, std::ios::in); stringArrayFile = this->toStringArray(file); uint start = 0; uint count = 0; this->structure = convertToTupleVector(start, count); file.close(); return structure; } std::vector<std::string> PacketStructureTxt::toStringArray( std::ifstream &file) { std::vector<std::string> out; std::string line; while (std::getline(file, line)) { out.push_back(line); } return out; } std::vector<std::tuple<uint, std::string, uint>> PacketStructureTxt::convertToTupleVector( uint &start, uint &count) { std::vector<std::tuple<uint, std::string, uint>> out; for (; start < stringArrayFile.size() && stringArrayFile.at(start).find("}") == std::string::npos; start++) { std::string line = stringArrayFile.at(start); if (line.find("#") != std::string::npos) { continue; } if (line.find("array") != std::string::npos) { uint arraySize = std::stoi( line.substr(line.find(":") + 1, line.find("{"))); std::vector<std::tuple<uint, std::string, uint>> array; uint newStart = start + 1; for (uint i = 0; i < arraySize; i++) { newStart = start + 1; array = convertToTupleVector(newStart, count); std::for_each(array.begin(), array.end(), [i](std::tuple<uint, std::string, uint> &line) { std::get<1>(line).append("_#").append( std::to_string(i)); }); out.insert(out.end(), array.begin(), array.end()); } start = newStart; } else { std::string fieldName = line.substr(0, line.find(" ")); fieldName.erase( std::remove_if(fieldName.begin(), fieldName.end(), ::isspace), fieldName.end()); std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower); out.push_back( std::make_tuple(count, fieldName, std::stoi(line.substr(line.find(" "))))); count += 1; } } return out; }