TU-Programmieren_2/exercise6/task3.Image.hpp
2025-04-09 10:22:44 +02:00

64 lines
1.9 KiB
C++

/// @file
/// @brief Task3: Simple SVG-Writer
#pragma once
#include "task2.Element.hpp" // task2::Element
#include <filesystem> // std::filesystem::path
#include <fstream> // std::ofstream
#include <ostream> // std::endl
#include <vector> // std::vector
namespace task2 {
/// @brief Simple SVG-Writer using the task2::Element interface
class Image {
public:
/// @brief Constructs an Image from a root SVG element
/// @param root Pointer to a dynamically allocated element
/// - ownership of the dynamic resource (pointer) is transfered to the class instance
Image(Element* root) : root(root), elements() {}
/// @brief Adds a SVG element inside the root element
/// @param elem Pointer to a dynamically allocated element
/// - ownership of the dynamic resource (pointer) is transfered to the class instance
void add(Element* elem) { elements.push_back(elem); }
/// @brief Writes the Image to a file
/// @param filepath Filename of the image to be written
void save(std::filesystem::path filepath) const {
std::ofstream fs;
fs.exceptions(std::ifstream::badbit);
fs.open(filepath);
fs << root->open() << std::endl;
if (!root->text().empty())
fs << root->text() << std::endl;
for (const auto& e : elements) {
fs << " " << e->open() << std::endl;
if (!e->text().empty())
fs << " " << e->text() << std::endl;
if (!e->close().empty())
fs << " " << e->close() << std::endl;
}
if (!root->close().empty())
fs << root->close() << std::endl;
}
/// @brief Destructor
/// @note Deallocates all dynamic resources owned by this instance
~Image() {
for (auto& e : elements)
delete e;
delete root;
}
private:
Element* root; ///< root element containing all other elements
std::vector<Element*> elements; ///< sequence of elements
};
} // namespace task2