diff --git a/java-fast/io/nayuki/fastqrcodegen/BitBuffer.java b/java-fast/io/nayuki/fastqrcodegen/BitBuffer.java
index fafafd5..73107e4 100644
--- a/java-fast/io/nayuki/fastqrcodegen/BitBuffer.java
+++ b/java-fast/io/nayuki/fastqrcodegen/BitBuffer.java
@@ -40,7 +40,9 @@ final class BitBuffer {
/*---- Constructor ----*/
- // Creates an empty bit buffer.
+ /**
+ * Creates an empty bit buffer.
+ */
public BitBuffer() {
data = new int[64];
bitLength = 0;
@@ -50,7 +52,9 @@ final class BitBuffer {
/*---- Methods ----*/
- // Returns the bit at the given index, yielding 0 or 1.
+ /**
+ * Returns the bit at the given index, yielding 0 or 1.
+ */
public int getBit(int index) {
if (index < 0 || index >= bitLength)
throw new IndexOutOfBoundsException();
@@ -58,8 +62,10 @@ final class BitBuffer {
}
- // Returns a new array representing this buffer's bits packed into
- // bytes in big endian. The current bit length must be a multiple of 8.
+ /**
+ * Returns a new array representing this buffer's bits packed into
+ * bytes in big endian. The current bit length must be a multiple of 8.
+ */
public byte[] getBytes() {
if (bitLength % 8 != 0)
throw new IllegalStateException("Data is not a whole number of bytes");
@@ -70,8 +76,10 @@ final class BitBuffer {
}
- // Appends the given number of low-order bits of the given value
- // to this buffer. Requires 0 <= len <= 31 and 0 <= val < 2^len.
+ /**
+ * Appends the given number of low-order bits of the given value
+ * to this buffer. Requires 0 <= len <= 31 and 0 <= val < 2^len.
+ */
public void appendBits(int val, int len) {
if (len < 0 || len > 31 || val >>> len != 0)
throw new IllegalArgumentException("Value out of range");
@@ -97,8 +105,10 @@ final class BitBuffer {
}
- // Appends to this buffer the sequence of bits represented by the given
- // word array and given bit length. Requires 0 <= len <= 32 * vals.length.
+ /**
+ * Appends to this buffer the sequence of bits represented by the given
+ * word array and given bit length. Requires 0 <= len <= 32 * vals.length.
+ */
public void appendBits(int[] vals, int len) {
Objects.requireNonNull(vals);
if (len == 0)
diff --git a/java-fast/io/nayuki/fastqrcodegen/Memoizer.java b/java-fast/io/nayuki/fastqrcodegen/Memoizer.java
index 34a50b7..e248105 100644
--- a/java-fast/io/nayuki/fastqrcodegen/Memoizer.java
+++ b/java-fast/io/nayuki/fastqrcodegen/Memoizer.java
@@ -31,7 +31,9 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
-// A thread-safe cache based on soft references.
+/**
+ * A thread-safe cache based on soft references.
+ */
final class Memoizer {
private final Function function;
@@ -39,13 +41,17 @@ final class Memoizer {
private Set pending = new HashSet<>();
- // Creates a memoizer based on the given function that takes one input to compute an output.
+ /**
+ * Creates a memoizer based on the given function that takes one input to compute an output.
+ */
public Memoizer(Function func) {
function = func;
}
- // Computes function.apply(arg) or returns a cached copy of a previous call.
+ /**
+ * Computes function.apply(arg) or returns a cached copy of a previous call.
+ */
public R get(T arg) {
// Non-blocking fast path
{
diff --git a/java-fast/io/nayuki/fastqrcodegen/QrCode.java b/java-fast/io/nayuki/fastqrcodegen/QrCode.java
index 75e5e0f..5ab8eb9 100644
--- a/java-fast/io/nayuki/fastqrcodegen/QrCode.java
+++ b/java-fast/io/nayuki/fastqrcodegen/QrCode.java
@@ -280,8 +280,10 @@ public final class QrCode {
/*---- Private helper methods for constructor: Drawing function modules ----*/
- // Draws two copies of the format bits (with its own error correction code)
- // based on the given mask and this object's error correction level field.
+ /**
+ * Draws two copies of the format bits (with its own error correction code)
+ * based on the given mask and this object's error correction level field.
+ */
private void drawFormatBits(int msk) {
// Calculate error correction code and pack bits
int data = errorCorrectionLevel.formatBits << 3 | msk; // errCorrLvl is uint2, mask is uint3
@@ -309,8 +311,10 @@ public final class QrCode {
}
- // Sets the module at the given coordinates to the given color.
- // Only used by the constructor. Coordinates must be in bounds.
+ /**
+ * Sets the module at the given coordinates to the given color.
+ * Only used by the constructor. Coordinates must be in bounds.
+ */
private void setModule(int x, int y, int dark) {
assert 0 <= x && x < size;
assert 0 <= y && y < size;
@@ -323,8 +327,10 @@ public final class QrCode {
/*---- Private helper methods for constructor: Codewords and masking ----*/
- // Returns a new byte string representing the given data with the appropriate error correction
- // codewords appended to it, based on this object's version and error correction level.
+ /**
+ * Returns a new byte string representing the given data with the appropriate error correction
+ * codewords appended to it, based on this object's version and error correction level.
+ */
private byte[] addEccAndInterleave(byte[] data) {
Objects.requireNonNull(data);
if (data.length != getNumDataCodewords(version, errorCorrectionLevel))
@@ -357,8 +363,10 @@ public final class QrCode {
}
- // Draws the given sequence of 8-bit codewords (data and error correction)
- // onto the entire data area of this QR Code, based on the given bit indexes.
+ /**
+ * Draws the given sequence of 8-bit codewords (data and error correction)
+ * onto the entire data area of this QR Code, based on the given bit indexes.
+ */
private void drawCodewords(int[] dataOutputBitIndexes, byte[] allCodewords) {
Objects.requireNonNull(dataOutputBitIndexes);
Objects.requireNonNull(allCodewords);
@@ -372,11 +380,13 @@ public final class QrCode {
}
- // XORs the codeword modules in this QR Code with the given mask pattern.
- // The function modules must be marked and the codeword bits must be drawn
- // before masking. Due to the arithmetic of XOR, calling applyMask() with
- // the same mask value a second time will undo the mask. A final well-formed
- // QR Code needs exactly one (not zero, two, etc.) mask applied.
+ /**
+ * XORs the codeword modules in this QR Code with the given mask pattern.
+ * The function modules must be marked and the codeword bits must be drawn
+ * before masking. Due to the arithmetic of XOR, calling applyMask() with
+ * the same mask value a second time will undo the mask. A final well-formed
+ * QR Code needs exactly one (not zero, two, etc.) mask applied.
+ */
private void applyMask(int[] msk) {
if (msk.length != modules.length)
throw new IllegalArgumentException();
@@ -385,9 +395,11 @@ public final class QrCode {
}
- // A messy helper function for the constructor. This QR Code must be in an unmasked state when this
- // method is called. The 'mask' argument is the requested mask, which is -1 for auto or 0 to 7 for fixed.
- // This method applies and returns the actual mask chosen, from 0 to 7.
+ /**
+ * A messy helper function for the constructor. This QR Code must be in an unmasked state when this
+ * method is called. The 'mask' argument is the requested mask, which is -1 for auto or 0 to 7 for fixed.
+ * This method applies and returns the actual mask chosen, from 0 to 7.
+ */
private int handleConstructorMasking(int[][] masks, int msk) {
if (msk == -1) { // Automatically choose best mask
int minPenalty = Integer.MAX_VALUE;
@@ -409,8 +421,10 @@ public final class QrCode {
}
- // Calculates and returns the penalty score based on state of this QR Code's current modules.
- // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.
+ /**
+ * Calculates and returns the penalty score based on state of this QR Code's current modules.
+ * This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.
+ */
private int getPenaltyScore() {
int result = 0;
int dark = 0;
@@ -486,9 +500,11 @@ public final class QrCode {
/*---- Private helper functions ----*/
- // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any
- // QR Code of the given version number and error correction level, with remainder bits discarded.
- // This stateless pure function could be implemented as a (40*4)-cell lookup table.
+ /**
+ * Returns the number of 8-bit data (i.e. not error correction) codewords contained in any
+ * QR Code of the given version number and error correction level, with remainder bits discarded.
+ * This stateless pure function could be implemented as a (40*4)-cell lookup table.
+ */
static int getNumDataCodewords(int ver, Ecc ecl) {
return QrTemplate.getNumRawDataModules(ver) / 8
- ECC_CODEWORDS_PER_BLOCK [ecl.ordinal()][ver]
@@ -496,8 +512,10 @@ public final class QrCode {
}
- // Can only be called immediately after a light run is added, and
- // returns either 0, 1, or 2. A helper function for getPenaltyScore().
+ /**
+ * Can only be called immediately after a light run is added, and
+ * returns either 0, 1, or 2. A helper function for getPenaltyScore().
+ */
private int finderPenaltyCountPatterns(int[] runHistory) {
int n = runHistory[1];
assert n <= size * 3;
@@ -507,7 +525,9 @@ public final class QrCode {
}
- // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().
+ /**
+ * Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().
+ */
private int finderPenaltyTerminateAndCount(int currentRunColor, int currentRunLength, int[] runHistory) {
if (currentRunColor == 1) { // Terminate dark run
finderPenaltyAddHistory(currentRunLength, runHistory);
@@ -519,7 +539,9 @@ public final class QrCode {
}
- // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().
+ /**
+ * Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().
+ */
private void finderPenaltyAddHistory(int currentRunLength, int[] runHistory) {
if (runHistory[0] == 0)
currentRunLength += size; // Add light border to initial run
@@ -528,7 +550,9 @@ public final class QrCode {
}
- // Returns 0 or 1 based on the (i mod 32)'th bit of x.
+ /**
+ * Returns 0 or 1 based on the (i mod 32)'th bit of x.
+ */
static int getBit(int x, int i) {
return (x >>> i) & 1;
}
diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCode.java b/java/src/main/java/io/nayuki/qrcodegen/QrCode.java
index f0bafbb..02730b0 100644
--- a/java/src/main/java/io/nayuki/qrcodegen/QrCode.java
+++ b/java/src/main/java/io/nayuki/qrcodegen/QrCode.java
@@ -221,11 +221,13 @@ public final class QrCode {
// Private grids of modules/pixels, with dimensions of size*size:
- // The modules of this QR Code (false = light, true = dark).
- // Immutable after constructor finishes. Accessed through getModule().
+ /**
+ * The modules of this QR Code (false = light, true = dark).
+ * Immutable after constructor finishes. Accessed through getModule(). */
private boolean[][] modules;
- // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.
+ /**
+ * Indicates function modules that are not subjected to masking. Discarded when constructor finishes. */
private boolean[][] isFunction;
@@ -306,7 +308,9 @@ public final class QrCode {
/*---- Private helper methods for constructor: Drawing function modules ----*/
- // Reads this object's version field, and draws and marks all function modules.
+ /**
+ * Reads this object's version field, and draws and marks all function modules.
+ */
private void drawFunctionPatterns() {
// Draw horizontal and vertical timing patterns
for (int i = 0; i < size; i++) {
@@ -336,8 +340,10 @@ public final class QrCode {
}
- // Draws two copies of the format bits (with its own error correction code)
- // based on the given mask and this object's error correction level field.
+ /**
+ * Draws two copies of the format bits (with its own error correction code)
+ * based on the given mask and this object's error correction level field.
+ */
private void drawFormatBits(int msk) {
// Calculate error correction code and pack bits
int data = errorCorrectionLevel.formatBits << 3 | msk; // errCorrLvl is uint2, mask is uint3
@@ -365,8 +371,10 @@ public final class QrCode {
}
- // Draws two copies of the version bits (with its own error correction code),
- // based on this object's version field, iff 7 <= version <= 40.
+ /**
+ * Draws two copies of the version bits (with its own error correction code),
+ * based on this object's version field, iff 7 <= version <= 40.
+ */
private void drawVersion() {
if (version < 7)
return;
@@ -389,8 +397,10 @@ public final class QrCode {
}
- // Draws a 9*9 finder pattern including the border separator,
- // with the center module at (x, y). Modules can be out of bounds.
+ /**
+ * Draws a 9*9 finder pattern including the border separator,
+ * with the center module at (x, y). Modules can be out of bounds.
+ */
private void drawFinderPattern(int x, int y) {
for (int dy = -4; dy <= 4; dy++) {
for (int dx = -4; dx <= 4; dx++) {
@@ -403,8 +413,10 @@ public final class QrCode {
}
- // Draws a 5*5 alignment pattern, with the center module
- // at (x, y). All modules must be in bounds.
+ /**
+ * Draws a 5*5 alignment pattern, with the center module
+ * at (x, y). All modules must be in bounds.
+ */
private void drawAlignmentPattern(int x, int y) {
for (int dy = -2; dy <= 2; dy++) {
for (int dx = -2; dx <= 2; dx++)
@@ -413,8 +425,10 @@ public final class QrCode {
}
- // Sets the color of a module and marks it as a function module.
- // Only used by the constructor. Coordinates must be in bounds.
+ /**
+ * Sets the color of a module and marks it as a function module.
+ * Only used by the constructor. Coordinates must be in bounds.
+ */
private void setFunctionModule(int x, int y, boolean isDark) {
modules[y][x] = isDark;
isFunction[y][x] = true;
@@ -423,8 +437,10 @@ public final class QrCode {
/*---- Private helper methods for constructor: Codewords and masking ----*/
- // Returns a new byte string representing the given data with the appropriate error correction
- // codewords appended to it, based on this object's version and error correction level.
+ /**
+ * Returns a new byte string representing the given data with the appropriate error correction
+ * codewords appended to it, based on this object's version and error correction level.
+ */
private byte[] addEccAndInterleave(byte[] data) {
Objects.requireNonNull(data);
if (data.length != getNumDataCodewords(version, errorCorrectionLevel))
@@ -464,8 +480,10 @@ public final class QrCode {
}
- // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire
- // data area of this QR Code. Function modules need to be marked off before this is called.
+ /**
+ * Draws the given sequence of 8-bit codewords (data and error correction) onto the entire
+ * data area of this QR Code. Function modules need to be marked off before this is called.
+ */
private void drawCodewords(byte[] data) {
Objects.requireNonNull(data);
if (data.length != getNumRawDataModules(version) / 8)
@@ -494,11 +512,13 @@ public final class QrCode {
}
- // XORs the codeword modules in this QR Code with the given mask pattern.
- // The function modules must be marked and the codeword bits must be drawn
- // before masking. Due to the arithmetic of XOR, calling applyMask() with
- // the same mask value a second time will undo the mask. A final well-formed
- // QR Code needs exactly one (not zero, two, etc.) mask applied.
+ /**
+ * XORs the codeword modules in this QR Code with the given mask pattern.
+ * The function modules must be marked and the codeword bits must be drawn
+ * before masking. Due to the arithmetic of XOR, calling applyMask() with
+ * the same mask value a second time will undo the mask. A final well-formed
+ * QR Code needs exactly one (not zero, two, etc.) mask applied.
+ */
private void applyMask(int msk) {
if (msk < 0 || msk > 7)
throw new IllegalArgumentException("Mask value out of range");
@@ -522,8 +542,10 @@ public final class QrCode {
}
- // Calculates and returns the penalty score based on state of this QR Code's current modules.
- // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.
+ /**
+ * Calculates and returns the penalty score based on state of this QR Code's current modules.
+ * This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.
+ */
private int getPenaltyScore() {
int result = 0;
@@ -604,9 +626,11 @@ public final class QrCode {
/*---- Private helper functions ----*/
- // Returns an ascending list of positions of alignment patterns for this version number.
- // Each position is in the range [0,177), and are used on both the x and y axes.
- // This could be implemented as lookup table of 40 variable-length lists of unsigned bytes.
+ /**
+ * Returns an ascending list of positions of alignment patterns for this version number.
+ * Each position is in the range [0,177), and are used on both the x and y axes.
+ * This could be implemented as lookup table of 40 variable-length lists of unsigned bytes.
+ */
private int[] getAlignmentPatternPositions() {
if (version == 1)
return new int[]{};
@@ -622,9 +646,11 @@ public final class QrCode {
}
- // Returns the number of data bits that can be stored in a QR Code of the given version number, after
- // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.
- // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.
+ /**
+ * Returns the number of data bits that can be stored in a QR Code of the given version number, after
+ * all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.
+ * The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.
+ */
private static int getNumRawDataModules(int ver) {
if (ver < MIN_VERSION || ver > MAX_VERSION)
throw new IllegalArgumentException("Version number out of range");
@@ -648,8 +674,10 @@ public final class QrCode {
}
- // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be
- // implemented as a lookup table over all possible parameter values, instead of as an algorithm.
+ /**
+ * Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be
+ * implemented as a lookup table over all possible parameter values, instead of as an algorithm.
+ */
private static byte[] reedSolomonComputeDivisor(int degree) {
if (degree < 1 || degree > 255)
throw new IllegalArgumentException("Degree out of range");
@@ -675,7 +703,9 @@ public final class QrCode {
}
- // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.
+ /**
+ * Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.
+ */
private static byte[] reedSolomonComputeRemainder(byte[] data, byte[] divisor) {
Objects.requireNonNull(data);
Objects.requireNonNull(divisor);
@@ -691,8 +721,10 @@ public final class QrCode {
}
- // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result
- // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.
+ /**
+ * Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result
+ * are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.
+ */
private static int reedSolomonMultiply(int x, int y) {
assert x >> 8 == 0 && y >> 8 == 0;
// Russian peasant multiplication
@@ -706,9 +738,11 @@ public final class QrCode {
}
- // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any
- // QR Code of the given version number and error correction level, with remainder bits discarded.
- // This stateless pure function could be implemented as a (40*4)-cell lookup table.
+ /**
+ * Returns the number of 8-bit data (i.e. not error correction) codewords contained in any
+ * QR Code of the given version number and error correction level, with remainder bits discarded.
+ * This stateless pure function could be implemented as a (40*4)-cell lookup table.
+ */
static int getNumDataCodewords(int ver, Ecc ecl) {
return getNumRawDataModules(ver) / 8
- ECC_CODEWORDS_PER_BLOCK [ecl.ordinal()][ver]
@@ -716,8 +750,10 @@ public final class QrCode {
}
- // Can only be called immediately after a light run is added, and
- // returns either 0, 1, or 2. A helper function for getPenaltyScore().
+ /**
+ * Can only be called immediately after a light run is added, and
+ * returns either 0, 1, or 2. A helper function for getPenaltyScore().
+ */
private int finderPenaltyCountPatterns(int[] runHistory) {
int n = runHistory[1];
assert n <= size * 3;
@@ -727,7 +763,9 @@ public final class QrCode {
}
- // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().
+ /**
+ * Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().
+ */
private int finderPenaltyTerminateAndCount(boolean currentRunColor, int currentRunLength, int[] runHistory) {
if (currentRunColor) { // Terminate dark run
finderPenaltyAddHistory(currentRunLength, runHistory);
@@ -739,7 +777,9 @@ public final class QrCode {
}
- // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().
+ /**
+ * Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().
+ */
private void finderPenaltyAddHistory(int currentRunLength, int[] runHistory) {
if (runHistory[0] == 0)
currentRunLength += size; // Add light border to initial run
diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegmentAdvanced.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegmentAdvanced.java
index f054f16..20de5b4 100644
--- a/java/src/main/java/io/nayuki/qrcodegen/QrSegmentAdvanced.java
+++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegmentAdvanced.java
@@ -90,7 +90,9 @@ public final class QrSegmentAdvanced {
}
- // Returns a new list of segments that is optimal for the given text at the given version number.
+ /**
+ * Returns a new list of segments that is optimal for the given text at the given version number.
+ */
private static List makeSegmentsOptimally(int[] codePoints, int version) {
if (codePoints.length == 0)
return new ArrayList<>();
@@ -99,7 +101,9 @@ public final class QrSegmentAdvanced {
}
- // Returns a new array representing the optimal mode per code point based on the given text and version.
+ /**
+ * Returns a new array representing the optimal mode per code point based on the given text and version.
+ */
private static Mode[] computeCharacterModes(int[] codePoints, int version) {
if (codePoints.length == 0)
throw new IllegalArgumentException();
@@ -189,8 +193,10 @@ public final class QrSegmentAdvanced {
}
- // Returns a new list of segments based on the given text and modes, such that
- // consecutive code points in the same mode are put into the same segment.
+ /**
+ * Returns a new list of segments based on the given text and modes, such that
+ * consecutive code points in the same mode are put into the same segment.
+ */
private static List splitIntoSegments(int[] codePoints, Mode[] charModes) {
if (codePoints.length == 0)
throw new IllegalArgumentException();
@@ -221,8 +227,10 @@ public final class QrSegmentAdvanced {
}
- // Returns a new array of Unicode code points (effectively
- // UTF-32 / UCS-4) representing the given UTF-16 string.
+ /**
+ * Returns a new array of Unicode code points (effectively
+ * UTF-32 / UCS-4) representing the given UTF-16 string.
+ */
private static int[] toCodePoints(CharSequence s) {
int[] result = s.codePoints().toArray();
for (int c : result) {
@@ -233,7 +241,9 @@ public final class QrSegmentAdvanced {
}
- // Returns the number of UTF-8 bytes needed to encode the given Unicode code point.
+ /**
+ * Returns the number of UTF-8 bytes needed to encode the given Unicode code point.
+ */
private static int countUtf8Bytes(int cp) {
if (cp < 0) throw new IllegalArgumentException("Invalid code point");
else if (cp < 0x80) return 1;