diff --git a/cpp/QrCode.cpp b/cpp/QrCode.cpp index a654d60..f831ef2 100644 --- a/cpp/QrCode.cpp +++ b/cpp/QrCode.cpp @@ -38,27 +38,17 @@ using std::vector; namespace qrcodegen { -QrCode::Ecc::Ecc(int ord, int fb) : - ordinal(ord), - formatBits(fb) {} - - -int QrCode::Ecc::getOrdinal() const { - return ordinal; +int QrCode::getFormatBits(Ecc ecl) { + switch (ecl) { + case Ecc::LOW : return 1; + case Ecc::MEDIUM : return 0; + case Ecc::QUARTILE: return 3; + case Ecc::HIGH : return 2; + default: throw "Assertion error"; + } } -int QrCode::Ecc::getFormatBits() const { - return formatBits; -} - - -const QrCode::Ecc QrCode::Ecc::LOW (0, 1); -const QrCode::Ecc QrCode::Ecc::MEDIUM (1, 0); -const QrCode::Ecc QrCode::Ecc::QUARTILE(2, 3); -const QrCode::Ecc QrCode::Ecc::HIGH (3, 2); - - QrCode QrCode::encodeText(const char *text, Ecc ecl) { vector segs(QrSegment::makeSegments(text)); return encodeSegments(segs, ecl); @@ -224,7 +214,7 @@ void QrCode::drawFunctionPatterns() { void QrCode::drawFormatBits(int mask) { // Calculate error correction code and pack bits - int data = errorCorrectionLevel.getFormatBits() << 3 | mask; // errCorrLvl is uint2, mask is uint3 + int data = getFormatBits(errorCorrectionLevel) << 3 | mask; // errCorrLvl is uint2, mask is uint3 int rem = data; for (int i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >> 9) * 0x537); @@ -309,8 +299,8 @@ vector QrCode::appendErrorCorrection(const vector &data) const throw "Invalid argument"; // Calculate parameter numbers - int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[errorCorrectionLevel.getOrdinal()][version]; - int blockEccLen = ECC_CODEWORDS_PER_BLOCK[errorCorrectionLevel.getOrdinal()][version]; + int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[static_cast(errorCorrectionLevel)][version]; + int blockEccLen = ECC_CODEWORDS_PER_BLOCK[static_cast(errorCorrectionLevel)][version]; int rawCodewords = getNumRawDataModules(version) / 8; int numShortBlocks = numBlocks - rawCodewords % numBlocks; int shortBlockLen = rawCodewords / numBlocks; @@ -537,8 +527,8 @@ int QrCode::getNumDataCodewords(int ver, Ecc ecl) { if (ver < MIN_VERSION || ver > MAX_VERSION) throw "Version number out of range"; return getNumRawDataModules(ver) / 8 - - ECC_CODEWORDS_PER_BLOCK[ecl.getOrdinal()][ver] - * NUM_ERROR_CORRECTION_BLOCKS[ecl.getOrdinal()][ver]; + - ECC_CODEWORDS_PER_BLOCK[static_cast(ecl)][ver] + * NUM_ERROR_CORRECTION_BLOCKS[static_cast(ecl)][ver]; } diff --git a/cpp/QrCode.hpp b/cpp/QrCode.hpp index fc5e89b..e868014 100644 --- a/cpp/QrCode.hpp +++ b/cpp/QrCode.hpp @@ -44,25 +44,16 @@ class QrCode final { /* * Represents the error correction level used in a QR Code symbol. */ - public: class Ecc final { + public: enum class Ecc { // Constants declared in ascending order of error protection. - public: const static Ecc LOW, MEDIUM, QUARTILE, HIGH; - - // Fields. - private: int ordinal; - private: int formatBits; - - // Constructor. - private: Ecc(int ord, int fb); - - // (Public) Returns a value in the range 0 to 3 (unsigned 2-bit integer). - public: int getOrdinal() const; - - // (Package-private) Returns a value in the range 0 to 3 (unsigned 2-bit integer). - public: int getFormatBits() const; + LOW = 0, MEDIUM = 1, QUARTILE = 2, HIGH = 3 }; + // Returns a value in the range 0 to 3 (unsigned 2-bit integer). + private: static int getFormatBits(Ecc ecl); + + /*---- Public static factory functions ----*/ diff --git a/cpp/QrCodeGeneratorWorker.cpp b/cpp/QrCodeGeneratorWorker.cpp index 59b53a7..d93cba1 100644 --- a/cpp/QrCodeGeneratorWorker.cpp +++ b/cpp/QrCodeGeneratorWorker.cpp @@ -37,11 +37,11 @@ using qrcodegen::QrCode; using qrcodegen::QrSegment; -static const QrCode::Ecc *(ECC_LEVELS[]) = { - &QrCode::Ecc::LOW, - &QrCode::Ecc::MEDIUM, - &QrCode::Ecc::QUARTILE, - &QrCode::Ecc::HIGH, +static const QrCode::Ecc ECC_LEVELS[] = { + QrCode::Ecc::LOW, + QrCode::Ecc::MEDIUM, + QrCode::Ecc::QUARTILE, + QrCode::Ecc::HIGH, }; @@ -83,7 +83,7 @@ int main() { try { // Try to make QR Code symbol const QrCode qr = QrCode::encodeSegments(segs, - *ECC_LEVELS[errCorLvl], minVersion, maxVersion, mask, boostEcl == 1); + ECC_LEVELS[errCorLvl], minVersion, maxVersion, mask, boostEcl == 1); // Print grid of modules std::cout << qr.getVersion() << std::endl; for (int y = 0; y < qr.getSize(); y++) {