Skip to content
Snippets Groups Projects
PacketStructureTxt.cpp 2.02 KiB
Newer Older
Valerio Pastore's avatar
Valerio Pastore committed
/*
 * PacketStructure.cpp
 *
 *  Created on: Dec 7, 2022
 *      Author: valerio
 */

#include <PacketStructureTxt.h>

using namespace inaf::oasbo::Packets;
std::vector<std::tuple<int, std::string, int>> PacketStructureTxt::readStructureFromSource(std::string source) {
Valerio Pastore's avatar
Valerio Pastore committed
	std::ifstream file;
	file.open(source, std::ios::in);
Valerio Pastore's avatar
Valerio Pastore committed
	stringArrayFile = this->toStringArray(file);
	size_t start = 0;
	size_t count = 0;
	this->structure = convertToTupleVector(start, count);
	file.close();
	return structure;
Valerio Pastore's avatar
Valerio Pastore committed
}

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<int, std::string, int>> PacketStructureTxt::convertToTupleVector(
		size_t &start, size_t &count) {
	std::vector<std::tuple<int, std::string, int>> 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) {
			size_t arraySize = std::stoi(
					line.substr(line.find(":") + 1, line.find("{")));
			size_t i;
			std::vector<std::tuple<int, std::string, int>> array;
			size_t newStart = start + 1;
			for (i = 0; i < arraySize; i++) {
				newStart = start + 1;
				array = convertToTupleVector(newStart, count);
				std::for_each(array.begin(), array.end(),
						[i](std::tuple<int, std::string, int> &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());

			out.push_back(
					std::make_tuple(count, fieldName,
							std::stoi(line.substr(line.find(" ")))));
			count += 1;
		}
	}
	return out;
}