#pragma once #include "ResourceType.h" #include "n64/Cartridge.h" #include #include #include #include #include #include #include #include #include #define REGISTER(type, c) { ExportType::type, std::make_shared() }, #define SEGMENT_OFFSET(a) ((uint32_t)(a)&0x00FFFFFF) #define SEGMENT_NUMBER(x) ((x >> 24) & 0xFF) #define tab "\t" #define fourSpaceTab " " enum class ExportType { Header, Code, Binary, }; class IParsedData {}; template class GenericData : public IParsedData { public: T mData; }; class BaseExporter { public: virtual void Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) = 0; static void WriteHeader(LUS::BinaryWriter& write, LUS::ResourceType resType, int32_t version); }; class BaseFactory { public: virtual std::optional> parse(std::vector& buffer, YAML::Node& data) = 0; std::optional> GetExporter(ExportType type) { auto exporters = this->GetExporters(); if (exporters.find(type) != exporters.end()) { return exporters[type]; } return std::nullopt; } private: virtual std::unordered_map> GetExporters() = 0; };