From d3850939cd6449ad93353bcb81ca66945da066d3 Mon Sep 17 00:00:00 2001 From: Michael Ochmann Date: Sun, 26 Feb 2023 17:09:42 +0100 Subject: [PATCH] code quality: getting rid of `std::vector` of all the renderers --- src/QR.cpp | 24 +++++++++++------------- src/QR.hpp | 11 ++++++++--- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/QR.cpp b/src/QR.cpp index 608e2cf..7cee284 100644 --- a/src/QR.cpp +++ b/src/QR.cpp @@ -12,16 +12,8 @@ namespace massivedynamic { -QR::QR(const std::string& data, std::string outputFile, size_t size, qrcodegen::QrCode::Ecc type) : outputFile(std::move(outputFile)) { - qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(data.c_str(), type); - - static_assert(FormatLength == 5, "exhaustive formats: did you miss to add something here?"); - this->renderers.insert({Format::CONSOLE, std::make_unique(this->pixels, qr.getSize(), size)}); - this->renderers.insert({Format::PNG, std::make_unique(this->pixels, qr.getSize(), size)}); - this->renderers.insert({Format::SVG, std::make_unique(this->pixels, qr.getSize(), size)}); - this->renderers.insert({Format::JPG, std::make_unique(this->pixels, qr.getSize(), size)}); - this->renderers.insert({Format::BMP, std::make_unique(this->pixels, qr.getSize(), size)}); - +QR::QR(const std::string& data, std::string outputFile, size_t size, qrcodegen::QrCode::Ecc type) : outputFile(std::move(outputFile)), + qr(qrcodegen::QrCode::encodeText(data.c_str(), type)), size(size) { // this is inherently stupid, but "qrcodegen::QrCode" does not give access to the // `segments` vector member and the class itself is marked final. for (int y = 0; y < qr.getSize(); y++) { @@ -32,9 +24,15 @@ QR::QR(const std::string& data, std::string outputFile, size_t size, qrcodegen:: } void QR::render(Format format) { - assert(this->renderers.find(format) != this->renderers.end() && "ERROR: a non-valid renderer has been selected"); - - this->renderers.at(format)->render(this->outputFile); + static_assert(FormatLength == 5, "exhaustive formats: did you miss to add something here?"); + switch(format) { + case Format::CONSOLE : this->renderTyped(); break; + case Format::PNG : this->renderTyped(); break; + case Format::SVG : this->renderTyped(); break; + case Format::JPG : this->renderTyped(); break; + case Format::BMP : this->renderTyped(); break; + case Format::END : break; + } } } \ No newline at end of file diff --git a/src/QR.hpp b/src/QR.hpp index ed90cf1..edcc80d 100644 --- a/src/QR.hpp +++ b/src/QR.hpp @@ -2,8 +2,6 @@ #include #include -#include -#include #include "qrcodegen.hpp" #include "Renderer.hpp" @@ -25,7 +23,8 @@ namespace massivedynamic { private: std::string outputFile; std::vector pixels; - std::unordered_map> renderers; + qrcodegen::QrCode qr; + size_t size; public: QR(const std::string& data, std::string outputFile, size_t size, qrcodegen::QrCode::Ecc type); QR(const QR&&) = delete; @@ -33,6 +32,12 @@ namespace massivedynamic { ~QR() = default; void render(Format format); + + template + void renderTyped() { + T renderer = T(this->pixels, this->qr.getSize(), this->size); + renderer.render(this->outputFile); + } }; } \ No newline at end of file