Files
riscv-emulator/src/ProgramLoader.h
2025-07-08 15:18:00 +02:00

64 lines
1.7 KiB
C++

//
// Created by black on 06.07.25.
//
#ifndef PROGRAMLOADER_H
#define PROGRAMLOADER_H
#include <fstream>
#include <map>
#include <string>
#include <vector>
/// Der ProgramLoader, zuständig für das Lesen und Parsen des Quellcodes
class ProgramLoader {
private:
/**
* Der private Konstruktor für ProgramLoader
* */
explicit ProgramLoader() = default;
std::map<std::string, std::streampos> m_labels;
public:
/// Singleton Logik
ProgramLoader(const ProgramLoader &) = delete;
ProgramLoader(const ProgramLoader &&) = delete;
ProgramLoader &operator=(const ProgramLoader &) = delete;
ProgramLoader &operator=(const ProgramLoader &&) = delete;
/**
* Gibt die Singleton Instanz des ProgramLoaders zurück
*
* @return ProgramLoader Instanz
*/
static ProgramLoader *getInstance();
/**
* Parst eine Zeile des Assembly Codes und gibt diese als sortierten Vektor zurück
*
* @param input Eine Zeile aus dem Assembly Code
* @return Ein Vektor mit Befehl und dessen Argumenten
*/
static std::vector<std::string> parseLine(const std::string &input);
/**
* Durchscucht das aktuelle Programm nach Labeln und speichert diese zusammen mit den Zeilennummern in einer Map
*/
void indexFile(std::ifstream &m_programFile);
/**
* Gibt die Position des Streams (virtuellen Lesekopfes) im aktuellen Quellcode zurück
*
* @param label Das Label, dessen Streamposition zurückgegeben werden soll
* @return Die Streamposition des angegebenen Labels
*/
[[nodiscard]] std::streampos getStreamPosition(const std::string &label) const;
};
#endif //PROGRAMLOADER_H