diff --git a/cpp/QrCode.cpp b/cpp/QrCode.cpp index 4ed4153..587b655 100644 --- a/cpp/QrCode.cpp +++ b/cpp/QrCode.cpp @@ -32,6 +32,7 @@ using std::int8_t; using std::uint8_t; using std::size_t; +using std::vector; namespace qrcodegen { @@ -48,19 +49,19 @@ const QrCode::Ecc QrCode::Ecc::HIGH (3, 2); QrCode QrCode::encodeText(const char *text, const Ecc &ecl) { - std::vector segs(QrSegment::makeSegments(text)); + vector segs(QrSegment::makeSegments(text)); return encodeSegments(segs, ecl); } -QrCode QrCode::encodeBinary(const std::vector &data, const Ecc &ecl) { - std::vector segs; +QrCode QrCode::encodeBinary(const vector &data, const Ecc &ecl) { + vector segs; segs.push_back(QrSegment::makeBytes(data)); return encodeSegments(segs, ecl); } -QrCode QrCode::encodeSegments(const std::vector &segs, const Ecc &ecl, +QrCode QrCode::encodeSegments(const vector &segs, const Ecc &ecl, int minVersion, int maxVersion, int mask, bool boostEcl) { if (!(1 <= minVersion && minVersion <= maxVersion && maxVersion <= 40) || mask < -1 || mask > 7) throw "Invalid value"; @@ -111,7 +112,7 @@ QrCode QrCode::encodeSegments(const std::vector &segs, const Ecc &ecl } -QrCode::QrCode(int ver, const Ecc &ecl, const std::vector &dataCodewords, int mask) : +QrCode::QrCode(int ver, const Ecc &ecl, const vector &dataCodewords, int mask) : // Initialize scalar fields version(ver), size(1 <= ver && ver <= 40 ? ver * 4 + 17 : -1), // Avoid signed overflow undefined behavior @@ -121,7 +122,7 @@ QrCode::QrCode(int ver, const Ecc &ecl, const std::vector &dataCodeword if (ver < 1 || ver > 40 || mask < -1 || mask > 7) throw "Value out of range"; - std::vector row(size); + vector row(size); for (int i = 0; i < size; i++) { modules.push_back(row); isFunction.push_back(row); @@ -129,7 +130,7 @@ QrCode::QrCode(int ver, const Ecc &ecl, const std::vector &dataCodeword // Draw function patterns, draw all codewords, do masking drawFunctionPatterns(); - const std::vector allCodewords(appendErrorCorrection(dataCodewords)); + const vector allCodewords(appendErrorCorrection(dataCodewords)); drawCodewords(allCodewords); this->mask = handleConstructorMasking(mask); } @@ -209,7 +210,7 @@ void QrCode::drawFunctionPatterns() { drawFinderPattern(3, size - 4); // Draw numerous alignment patterns - const std::vector alignPatPos(getAlignmentPatternPositions(version)); + const vector alignPatPos(getAlignmentPatternPositions(version)); int numAlign = alignPatPos.size(); for (int i = 0; i < numAlign; i++) { for (int j = 0; j < numAlign; j++) { @@ -303,7 +304,7 @@ void QrCode::setFunctionModule(int x, int y, bool isBlack) { } -std::vector QrCode::appendErrorCorrection(const std::vector &data) const { +vector QrCode::appendErrorCorrection(const vector &data) const { if (data.size() != static_cast(getNumDataCodewords(version, errorCorrectionLevel))) throw "Invalid argument"; @@ -314,13 +315,13 @@ std::vector QrCode::appendErrorCorrection(const std::vector &d int shortBlockLen = getNumRawDataModules(version) / 8 / numBlocks; // Split data into blocks and append ECC to each block - std::vector > blocks; + vector > blocks; const ReedSolomonGenerator rs(blockEccLen); for (int i = 0, k = 0; i < numBlocks; i++) { - std::vector dat; + vector dat; dat.insert(dat.begin(), data.begin() + k, data.begin() + (k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1))); k += dat.size(); - const std::vector ecc(rs.getRemainder(dat)); + const vector ecc(rs.getRemainder(dat)); if (i < numShortBlocks) dat.push_back(0); dat.insert(dat.end(), ecc.begin(), ecc.end()); @@ -328,7 +329,7 @@ std::vector QrCode::appendErrorCorrection(const std::vector &d } // Interleave (not concatenate) the bytes from every block into a single sequence - std::vector result; + vector result; for (int i = 0; static_cast(i) < blocks.at(0).size(); i++) { for (int j = 0; static_cast(j) < blocks.size(); j++) { // Skip the padding byte in short blocks @@ -342,7 +343,7 @@ std::vector QrCode::appendErrorCorrection(const std::vector &d } -void QrCode::drawCodewords(const std::vector &data) { +void QrCode::drawCodewords(const vector &data) { if (data.size() != static_cast(getNumRawDataModules(version) / 8)) throw "Invalid argument"; @@ -495,11 +496,11 @@ long QrCode::getPenaltyScore() const { } -std::vector QrCode::getAlignmentPatternPositions(int ver) { +vector QrCode::getAlignmentPatternPositions(int ver) { if (ver < 1 || ver > 40) throw "Version number out of range"; else if (ver == 1) - return std::vector(); + return vector(); else { int numAlign = ver / 7 + 2; int step; @@ -508,7 +509,7 @@ std::vector QrCode::getAlignmentPatternPositions(int ver) { else // C-C-C-Combo breaker! step = 26; - std::vector result; + vector result; int size = ver * 4 + 17; for (int i = 0, pos = size - 7; i < numAlign - 1; i++, pos -= step) result.insert(result.begin(), pos); @@ -591,9 +592,9 @@ QrCode::ReedSolomonGenerator::ReedSolomonGenerator(int degree) : } -std::vector QrCode::ReedSolomonGenerator::getRemainder(const std::vector &data) const { +vector QrCode::ReedSolomonGenerator::getRemainder(const vector &data) const { // Compute the remainder by performing polynomial division - std::vector result(coefficients.size()); + vector result(coefficients.size()); for (size_t i = 0; i < data.size(); i++) { uint8_t factor = data.at(i) ^ result.at(0); result.erase(result.begin()); diff --git a/cpp/QrSegment.cpp b/cpp/QrSegment.cpp index 61c22fd..0070f48 100644 --- a/cpp/QrSegment.cpp +++ b/cpp/QrSegment.cpp @@ -27,6 +27,7 @@ #include "QrSegment.hpp" using std::uint8_t; +using std::vector; namespace qrcodegen { @@ -54,7 +55,7 @@ const QrSegment::Mode QrSegment::Mode::KANJI (0x8, 8, 10, 12); -QrSegment QrSegment::makeBytes(const std::vector &data) { +QrSegment QrSegment::makeBytes(const vector &data) { if (data.size() >= (unsigned int)INT_MAX / 8) throw "Buffer too long"; return QrSegment(Mode::BYTE, (int)data.size(), data, (int)data.size() * 8); @@ -107,16 +108,16 @@ QrSegment QrSegment::makeAlphanumeric(const char *text) { } -std::vector QrSegment::makeSegments(const char *text) { +vector QrSegment::makeSegments(const char *text) { // Select the most efficient segment encoding automatically - std::vector result; + vector result; if (*text == '\0'); // Leave the vector empty else if (QrSegment::isNumeric(text)) result.push_back(QrSegment::makeNumeric(text)); else if (QrSegment::isAlphanumeric(text)) result.push_back(QrSegment::makeAlphanumeric(text)); else { - std::vector bytes; + vector bytes; for (; *text != '\0'; text++) bytes.push_back(static_cast(*text)); result.push_back(QrSegment::makeBytes(bytes)); @@ -125,7 +126,7 @@ std::vector QrSegment::makeSegments(const char *text) { } -QrSegment::QrSegment(const Mode &md, int numCh, const std::vector &b, int bitLen) : +QrSegment::QrSegment(const Mode &md, int numCh, const vector &b, int bitLen) : mode(md), numChars(numCh), data(b), @@ -135,7 +136,7 @@ QrSegment::QrSegment(const Mode &md, int numCh, const std::vector &b, i } -int QrSegment::getTotalBits(const std::vector &segs, int version) { +int QrSegment::getTotalBits(const vector &segs, int version) { if (version < 1 || version > 40) throw "Version number out of range"; int result = 0;