Compare commits

..

2 Commits

Author SHA1 Message Date
Michael Ochmann 4d7a7bfd69 code quality: making all the pixel based renderers `final` 2 years ago
Michael Ochmann d3850939cd code quality: getting rid of `std::vector` of all the renderers 2 years ago
  1. 24
      src/QR.cpp
  2. 11
      src/QR.hpp
  3. 2
      src/renderers/BMPRenderer.hpp
  4. 2
      src/renderers/JPGRenderer.hpp
  5. 2
      src/renderers/PNGRenderer.hpp

@ -12,16 +12,8 @@
namespace massivedynamic { namespace massivedynamic {
QR::QR(const std::string& data, std::string outputFile, size_t size, qrcodegen::QrCode::Ecc type) : outputFile(std::move(outputFile)) { 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); qr(qrcodegen::QrCode::encodeText(data.c_str(), type)), size(size) {
static_assert(FormatLength == 5, "exhaustive formats: did you miss to add something here?");
this->renderers.insert({Format::CONSOLE, std::make_unique<ConsoleRenderer>(this->pixels, qr.getSize(), size)});
this->renderers.insert({Format::PNG, std::make_unique<PNGRenderer>(this->pixels, qr.getSize(), size)});
this->renderers.insert({Format::SVG, std::make_unique<SVGRenderer>(this->pixels, qr.getSize(), size)});
this->renderers.insert({Format::JPG, std::make_unique<JPGRenderer>(this->pixels, qr.getSize(), size)});
this->renderers.insert({Format::BMP, std::make_unique<BMPRenderer>(this->pixels, qr.getSize(), size)});
// this is inherently stupid, but "qrcodegen::QrCode" does not give access to the // this is inherently stupid, but "qrcodegen::QrCode" does not give access to the
// `segments` vector member and the class itself is marked final. // `segments` vector member and the class itself is marked final.
for (int y = 0; y < qr.getSize(); y++) { 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) { void QR::render(Format format) {
assert(this->renderers.find(format) != this->renderers.end() && "ERROR: a non-valid renderer has been selected"); static_assert(FormatLength == 5, "exhaustive formats: did you miss to add something here?");
switch(format) {
this->renderers.at(format)->render(this->outputFile); case Format::CONSOLE : this->renderTyped<ConsoleRenderer>(); break;
case Format::PNG : this->renderTyped<PNGRenderer>(); break;
case Format::SVG : this->renderTyped<SVGRenderer>(); break;
case Format::JPG : this->renderTyped<JPGRenderer>(); break;
case Format::BMP : this->renderTyped<BMPRenderer>(); break;
case Format::END : break;
}
} }
} }

@ -2,8 +2,6 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include <memory>
#include <unordered_map>
#include "qrcodegen.hpp" #include "qrcodegen.hpp"
#include "Renderer.hpp" #include "Renderer.hpp"
@ -25,7 +23,8 @@ namespace massivedynamic {
private: private:
std::string outputFile; std::string outputFile;
std::vector<bool> pixels; std::vector<bool> pixels;
std::unordered_map<Format, std::unique_ptr<Renderer>> renderers; qrcodegen::QrCode qr;
size_t size;
public: public:
QR(const std::string& data, std::string outputFile, size_t size, qrcodegen::QrCode::Ecc type); QR(const std::string& data, std::string outputFile, size_t size, qrcodegen::QrCode::Ecc type);
QR(const QR&&) = delete; QR(const QR&&) = delete;
@ -33,6 +32,12 @@ namespace massivedynamic {
~QR() = default; ~QR() = default;
void render(Format format); void render(Format format);
template<typename T>
void renderTyped() {
T renderer = T(this->pixels, this->qr.getSize(), this->size);
renderer.render(this->outputFile);
}
}; };
} }

@ -6,7 +6,7 @@
namespace massivedynamic { namespace massivedynamic {
class BMPRenderer : public PixelRenderer { class BMPRenderer final : public PixelRenderer {
public: public:
BMPRenderer(const std::vector<bool>& pixels, size_t sourceSize, size_t targetSize) : PixelRenderer(pixels, sourceSize, targetSize) {} BMPRenderer(const std::vector<bool>& pixels, size_t sourceSize, size_t targetSize) : PixelRenderer(pixels, sourceSize, targetSize) {}

@ -6,7 +6,7 @@
namespace massivedynamic { namespace massivedynamic {
class JPGRenderer : public PixelRenderer { class JPGRenderer final: public PixelRenderer {
public: public:
JPGRenderer(const std::vector<bool>& pixels, size_t sourceSize, size_t targetSize) : PixelRenderer(pixels, sourceSize, targetSize) {} JPGRenderer(const std::vector<bool>& pixels, size_t sourceSize, size_t targetSize) : PixelRenderer(pixels, sourceSize, targetSize) {}

@ -6,7 +6,7 @@
namespace massivedynamic { namespace massivedynamic {
class PNGRenderer : public PixelRenderer { class PNGRenderer final: public PixelRenderer {
public: public:
PNGRenderer(const std::vector<bool>& pixels, size_t sourceSize, size_t targetSize) : PixelRenderer(pixels, sourceSize, targetSize) {} PNGRenderer(const std::vector<bool>& pixels, size_t sourceSize, size_t targetSize) : PixelRenderer(pixels, sourceSize, targetSize) {}

Loading…
Cancel
Save