Tweaked comments in Rust code to convert all public members to real documentation comments.

pull/40/head
Project Nayuki 6 years ago
parent 2f77345d24
commit 4b6e151955

@ -24,23 +24,21 @@
/*---- QrCode functionality ----*/ /*---- QrCode functionality ----*/
/* /// A QR Code symbol, which is a type of two-dimension barcode.
* A QR Code symbol, which is a type of two-dimension barcode. /// Invented by Denso Wave and described in the ISO/IEC 18004 standard.
* Invented by Denso Wave and described in the ISO/IEC 18004 standard. /// Instances of this struct represent an immutable square grid of black and white cells.
* Instances of this struct represent an immutable square grid of black and white cells. /// The impl provides static factory functions to create a QR Code from text or binary data.
* The impl provides static factory functions to create a QR Code from text or binary data. /// The struct and impl cover the QR Code Model 2 specification, supporting all versions
* The struct and impl cover the QR Code Model 2 specification, supporting all versions /// (sizes) from 1 to 40, all 4 error correction levels, and 4 character encoding modes.
* (sizes) from 1 to 40, all 4 error correction levels, and 4 character encoding modes. ///
* /// Ways to create a QR Code object:
* Ways to create a QR Code object: /// - High level: Take the payload data and call QrCode::encode_text() or QrCode::encode_binary().
* - High level: Take the payload data and call QrCode::encode_text() or QrCode::encode_binary(). /// - Mid level: Custom-make the list of segments and call
* - Mid level: Custom-make the list of segments and call /// QrCode.encode_segments() or QrCode.encode_segments_advanced().
* QrCode.encode_segments() or QrCode.encode_segments_advanced(). /// - Low level: Custom-make the array of data codeword bytes (including segment
* - Low level: Custom-make the array of data codeword bytes (including segment /// headers and final padding, excluding error correction codewords), supply the
* headers and final padding, excluding error correction codewords), supply the /// appropriate version number, and call the QrCode::encode_codewords() constructor.
* appropriate version number, and call the QrCode::encode_codewords() constructor. /// (Note that all ways require supplying the desired error correction level.)
* (Note that all ways require supplying the desired error correction level.)
*/
#[derive(Clone)] #[derive(Clone)]
pub struct QrCode { pub struct QrCode {
@ -78,12 +76,12 @@ impl QrCode {
/*---- Static factory functions (high level) ----*/ /*---- Static factory functions (high level) ----*/
// Returns a QR Code representing the given Unicode text string at the given error correction level. /// Returns a QR Code representing the given Unicode text string at the given error correction level.
// As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer Unicode /// As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer Unicode
// code points (not UTF-8 code units) if the low error correction level is used. The smallest possible /// code points (not UTF-8 code units) if the low error correction level is used. The smallest possible
// QR Code version is automatically chosen for the output. The ECC level of the result may be higher than /// QR Code version is automatically chosen for the output. The ECC level of the result may be higher than
// the ecl argument if it can be done without increasing the version. Returns a wrapped QrCode if successful, /// the ecl argument if it can be done without increasing the version. Returns a wrapped QrCode if successful,
// or None if the data is too long to fit in any version at the given ECC level. /// or None if the data is too long to fit in any version at the given ECC level.
pub fn encode_text(text: &str, ecl: QrCodeEcc) -> Option<Self> { pub fn encode_text(text: &str, ecl: QrCodeEcc) -> Option<Self> {
let chrs: Vec<char> = text.chars().collect(); let chrs: Vec<char> = text.chars().collect();
let segs: Vec<QrSegment> = QrSegment::make_segments(&chrs); let segs: Vec<QrSegment> = QrSegment::make_segments(&chrs);
@ -91,11 +89,11 @@ impl QrCode {
} }
// Returns a QR Code representing the given binary data at the given error correction level. /// Returns a QR Code representing the given binary data at the given error correction level.
// This function always encodes using the binary segment mode, not any text mode. The maximum number of /// This function always encodes using the binary segment mode, not any text mode. The maximum number of
// bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output. /// bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.
// The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version. /// The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.
// Returns a wrapped QrCode if successful, or None if the data is too long to fit in any version at the given ECC level. /// Returns a wrapped QrCode if successful, or None if the data is too long to fit in any version at the given ECC level.
pub fn encode_binary(data: &[u8], ecl: QrCodeEcc) -> Option<Self> { pub fn encode_binary(data: &[u8], ecl: QrCodeEcc) -> Option<Self> {
let segs: Vec<QrSegment> = vec![QrSegment::make_bytes(data)]; let segs: Vec<QrSegment> = vec![QrSegment::make_bytes(data)];
QrCode::encode_segments(&segs, ecl) QrCode::encode_segments(&segs, ecl)
@ -104,29 +102,29 @@ impl QrCode {
/*---- Static factory functions (mid level) ----*/ /*---- Static factory functions (mid level) ----*/
// Returns a QR Code representing the given segments at the given error correction level. /// Returns a QR Code representing the given segments at the given error correction level.
// The smallest possible QR Code version is automatically chosen for the output. The ECC level /// The smallest possible QR Code version is automatically chosen for the output. The ECC level
// of the result may be higher than the ecl argument if it can be done without increasing the version. /// of the result may be higher than the ecl argument if it can be done without increasing the version.
// This function allows the user to create a custom sequence of segments that switches /// This function allows the user to create a custom sequence of segments that switches
// between modes (such as alphanumeric and byte) to encode text in less space. /// between modes (such as alphanumeric and byte) to encode text in less space.
// This is a mid-level API; the high-level API is encode_text() and encode_binary(). /// This is a mid-level API; the high-level API is encode_text() and encode_binary().
// Returns a wrapped QrCode if successful, or None if the data is too long to fit in any version at the given ECC level. /// Returns a wrapped QrCode if successful, or None if the data is too long to fit in any version at the given ECC level.
pub fn encode_segments(segs: &[QrSegment], ecl: QrCodeEcc) -> Option<Self> { pub fn encode_segments(segs: &[QrSegment], ecl: QrCodeEcc) -> Option<Self> {
QrCode::encode_segments_advanced(segs, ecl, QrCode_MIN_VERSION, QrCode_MAX_VERSION, None, true) QrCode::encode_segments_advanced(segs, ecl, QrCode_MIN_VERSION, QrCode_MAX_VERSION, None, true)
} }
// Returns a QR Code representing the given segments with the given encoding parameters. /// Returns a QR Code representing the given segments with the given encoding parameters.
// The smallest possible QR Code version within the given range is automatically /// The smallest possible QR Code version within the given range is automatically
// chosen for the output. Iff boostecl is true, then the ECC level of the result /// chosen for the output. Iff boostecl is true, then the ECC level of the result
// may be higher than the ecl argument if it can be done without increasing the /// may be higher than the ecl argument if it can be done without increasing the
// version. The mask number is either between 0 to 7 (inclusive) to force that /// version. The mask number is either between 0 to 7 (inclusive) to force that
// mask, or -1 to automatically choose an appropriate mask (which may be slow). /// mask, or -1 to automatically choose an appropriate mask (which may be slow).
// This function allows the user to create a custom sequence of segments that switches /// This function allows the user to create a custom sequence of segments that switches
// between modes (such as alphanumeric and byte) to encode text in less space. /// between modes (such as alphanumeric and byte) to encode text in less space.
// This is a mid-level API; the high-level API is encodeText() and encodeBinary(). /// This is a mid-level API; the high-level API is encodeText() and encodeBinary().
// Returns a wrapped QrCode if successful, or None if the data is too long to fit /// Returns a wrapped QrCode if successful, or None if the data is too long to fit
// in any version in the given range at the given ECC level. /// in any version in the given range at the given ECC level.
pub fn encode_segments_advanced(segs: &[QrSegment], mut ecl: QrCodeEcc, pub fn encode_segments_advanced(segs: &[QrSegment], mut ecl: QrCodeEcc,
minversion: Version, maxversion: Version, mask: Option<Mask>, boostecl: bool) -> Option<Self> { minversion: Version, maxversion: Version, mask: Option<Mask>, boostecl: bool) -> Option<Self> {
assert!(minversion.value() <= maxversion.value(), "Invalid value"); assert!(minversion.value() <= maxversion.value(), "Invalid value");
@ -195,10 +193,10 @@ impl QrCode {
/*---- Constructor (low level) ----*/ /*---- Constructor (low level) ----*/
// Creates a new QR Code with the given version number, /// Creates a new QR Code with the given version number,
// error correction level, data codeword bytes, and mask number. /// error correction level, data codeword bytes, and mask number.
// This is a low-level API that most users should not use directly. /// This is a low-level API that most users should not use directly.
// A mid-level API is the encode_segments() function. /// A mid-level API is the encode_segments() function.
pub fn encode_codewords(ver: Version, ecl: QrCodeEcc, datacodewords: &[u8], mask: Option<Mask>) -> Self { pub fn encode_codewords(ver: Version, ecl: QrCodeEcc, datacodewords: &[u8], mask: Option<Mask>) -> Self {
// Initialize fields // Initialize fields
let size: usize = (ver.value() as usize) * 4 + 17; let size: usize = (ver.value() as usize) * 4 + 17;
@ -224,33 +222,33 @@ impl QrCode {
/*---- Public methods ----*/ /*---- Public methods ----*/
// Returns this QR Code's version, in the range [1, 40]. /// Returns this QR Code's version, in the range [1, 40].
pub fn version(&self) -> Version { pub fn version(&self) -> Version {
self.version self.version
} }
// Returns this QR Code's size, in the range [21, 177]. /// Returns this QR Code's size, in the range [21, 177].
pub fn size(&self) -> i32 { pub fn size(&self) -> i32 {
self.size self.size
} }
// Returns this QR Code's error correction level. /// Returns this QR Code's error correction level.
pub fn error_correction_level(&self) -> QrCodeEcc { pub fn error_correction_level(&self) -> QrCodeEcc {
self.errorcorrectionlevel self.errorcorrectionlevel
} }
// Returns this QR Code's mask, in the range [0, 7]. /// Returns this QR Code's mask, in the range [0, 7].
pub fn mask(&self) -> Mask { pub fn mask(&self) -> Mask {
self.mask self.mask
} }
// Returns the color of the module (pixel) at the given coordinates, which is false /// Returns the color of the module (pixel) at the given coordinates, which is false
// for white or true for black. The top left corner has the coordinates (x=0, y=0). /// for white or true for black. The top left corner has the coordinates (x=0, y=0).
// If the given coordinates are out of bounds, then false (white) is returned. /// If the given coordinates are out of bounds, then false (white) is returned.
pub fn get_module(&self, x: i32, y: i32) -> bool { pub fn get_module(&self, x: i32, y: i32) -> bool {
0 <= x && x < self.size && 0 <= y && y < self.size && self.module(x, y) 0 <= x && x < self.size && 0 <= y && y < self.size && self.module(x, y)
} }
@ -268,8 +266,8 @@ impl QrCode {
} }
// Returns a string of SVG code for an image depicting this QR Code, with the given number /// Returns a string of SVG code for an image depicting this QR Code, with the given number
// of border modules. The string always uses Unix newlines (\n), regardless of the platform. /// of border modules. The string always uses Unix newlines (\n), regardless of the platform.
pub fn to_svg_string(&self, border: i32) -> String { pub fn to_svg_string(&self, border: i32) -> String {
assert!(border >= 0, "Border must be non-negative"); assert!(border >= 0, "Border must be non-negative");
let mut result = String::new(); let mut result = String::new();
@ -702,10 +700,10 @@ impl QrCode {
/*---- Cconstants and tables ----*/ /*---- Cconstants and tables ----*/
// The minimum version number supported in the QR Code Model 2 standard. /// The minimum version number supported in the QR Code Model 2 standard.
pub const QrCode_MIN_VERSION: Version = Version( 1); pub const QrCode_MIN_VERSION: Version = Version( 1);
// The maximum version number supported in the QR Code Model 2 standard. /// The maximum version number supported in the QR Code Model 2 standard.
pub const QrCode_MAX_VERSION: Version = Version(40); pub const QrCode_MAX_VERSION: Version = Version(40);
@ -738,13 +736,17 @@ static NUM_ERROR_CORRECTION_BLOCKS: [[i8; 41]; 4] = [
/*---- QrCodeEcc functionality ----*/ /*---- QrCodeEcc functionality ----*/
// The error correction level in a QR Code symbol. /// The error correction level in a QR Code symbol.
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub enum QrCodeEcc { pub enum QrCodeEcc {
Low , // The QR Code can tolerate about 7% erroneous codewords /// The QR Code can tolerate about 7% erroneous codewords
Medium , // The QR Code can tolerate about 15% erroneous codewords Low ,
Quartile, // The QR Code can tolerate about 25% erroneous codewords /// The QR Code can tolerate about 15% erroneous codewords
High , // The QR Code can tolerate about 30% erroneous codewords Medium ,
/// The QR Code can tolerate about 25% erroneous codewords
Quartile,
/// The QR Code can tolerate about 30% erroneous codewords
High ,
} }
@ -852,17 +854,15 @@ impl ReedSolomonGenerator {
/*---- QrSegment functionality ----*/ /*---- QrSegment functionality ----*/
/* /// A segment of character/binary/control data in a QR Code symbol.
* A segment of character/binary/control data in a QR Code symbol. /// Instances of this struct are immutable.
* Instances of this struct are immutable. /// The mid-level way to create a segment is to take the payload data
* The mid-level way to create a segment is to take the payload data /// and call a static factory function such as QrSegment::make_numeric().
* and call a static factory function such as QrSegment::make_numeric(). /// The low-level way to create a segment is to custom-make the bit buffer
* The low-level way to create a segment is to custom-make the bit buffer /// and call the QrSegment::new() constructor with appropriate values.
* and call the QrSegment::new() constructor with appropriate values. /// This segment struct imposes no length restrictions, but QR Codes have restrictions.
* This segment struct imposes no length restrictions, but QR Codes have restrictions. /// Even in the most favorable conditions, a QR Code can only hold 7089 characters of data.
* Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. /// Any segment longer than this is meaningless for the purpose of generating QR Codes.
* Any segment longer than this is meaningless for the purpose of generating QR Codes.
*/
#[derive(Clone)] #[derive(Clone)]
pub struct QrSegment { pub struct QrSegment {
@ -884,9 +884,9 @@ impl QrSegment {
/*---- Static factory functions (mid level) ----*/ /*---- Static factory functions (mid level) ----*/
// Returns a segment representing the given binary data encoded in /// Returns a segment representing the given binary data encoded in
// byte mode. All input byte slices are acceptable. Any text string /// byte mode. All input byte slices are acceptable. Any text string
// can be converted to UTF-8 bytes and encoded as a byte mode segment. /// can be converted to UTF-8 bytes and encoded as a byte mode segment.
pub fn make_bytes(data: &[u8]) -> Self { pub fn make_bytes(data: &[u8]) -> Self {
let mut bb = BitBuffer(Vec::with_capacity(data.len() * 8)); let mut bb = BitBuffer(Vec::with_capacity(data.len() * 8));
for b in data { for b in data {
@ -896,8 +896,8 @@ impl QrSegment {
} }
// Returns a segment representing the given string of decimal digits encoded in numeric mode. /// Returns a segment representing the given string of decimal digits encoded in numeric mode.
// Panics if the string contains non-digit characters. /// Panics if the string contains non-digit characters.
pub fn make_numeric(text: &[char]) -> Self { pub fn make_numeric(text: &[char]) -> Self {
let mut bb = BitBuffer(Vec::with_capacity(text.len() * 3 + (text.len() + 2) / 3)); let mut bb = BitBuffer(Vec::with_capacity(text.len() * 3 + (text.len() + 2) / 3));
let mut accumdata: u32 = 0; let mut accumdata: u32 = 0;
@ -919,9 +919,9 @@ impl QrSegment {
} }
// Returns a segment representing the given text string encoded in alphanumeric mode. /// Returns a segment representing the given text string encoded in alphanumeric mode.
// The characters allowed are: 0 to 9, A to Z (uppercase only), space, dollar, percent, asterisk, /// The characters allowed are: 0 to 9, A to Z (uppercase only), space, dollar, percent, asterisk,
// plus, hyphen, period, slash, colon. Panics if the string contains non-encodable characters. /// plus, hyphen, period, slash, colon. Panics if the string contains non-encodable characters.
pub fn make_alphanumeric(text: &[char]) -> Self { pub fn make_alphanumeric(text: &[char]) -> Self {
let mut bb = BitBuffer(Vec::with_capacity(text.len() * 5 + (text.len() + 1) / 2)); let mut bb = BitBuffer(Vec::with_capacity(text.len() * 5 + (text.len() + 1) / 2));
let mut accumdata: u32 = 0; let mut accumdata: u32 = 0;
@ -944,8 +944,8 @@ impl QrSegment {
} }
// Returns a list of zero or more segments to represent the given Unicode text string. The result /// Returns a list of zero or more segments to represent the given Unicode text string. The result
// may use various segment modes and switch modes to optimize the length of the bit stream. /// may use various segment modes and switch modes to optimize the length of the bit stream.
pub fn make_segments(text: &[char]) -> Vec<Self> { pub fn make_segments(text: &[char]) -> Vec<Self> {
if text.is_empty() { if text.is_empty() {
vec![] vec![]
@ -960,8 +960,8 @@ impl QrSegment {
} }
// Returns a segment representing an Extended Channel Interpretation /// Returns a segment representing an Extended Channel Interpretation
// (ECI) designator with the given assignment value. /// (ECI) designator with the given assignment value.
pub fn make_eci(assignval: u32) -> Self { pub fn make_eci(assignval: u32) -> Self {
let mut bb = BitBuffer(Vec::with_capacity(24)); let mut bb = BitBuffer(Vec::with_capacity(24));
if assignval < (1 << 7) { if assignval < (1 << 7) {
@ -981,9 +981,9 @@ impl QrSegment {
/*---- Constructor (low level) ----*/ /*---- Constructor (low level) ----*/
// Creates a new QR Code segment with the given attributes and data. /// Creates a new QR Code segment with the given attributes and data.
// The character count (numchars) must agree with the mode and /// The character count (numchars) must agree with the mode and
// the bit buffer length, but the constraint isn't checked. /// the bit buffer length, but the constraint isn't checked.
pub fn new(mode: QrSegmentMode, numchars: usize, data: Vec<bool>) -> Self { pub fn new(mode: QrSegmentMode, numchars: usize, data: Vec<bool>) -> Self {
Self { Self {
mode: mode, mode: mode,
@ -995,19 +995,19 @@ impl QrSegment {
/*---- Instance field getters ----*/ /*---- Instance field getters ----*/
// Returns the mode indicator of this segment. /// Returns the mode indicator of this segment.
pub fn mode(&self) -> QrSegmentMode { pub fn mode(&self) -> QrSegmentMode {
self.mode self.mode
} }
// Returns the character count field of this segment. /// Returns the character count field of this segment.
pub fn num_chars(&self) -> usize { pub fn num_chars(&self) -> usize {
self.numchars self.numchars
} }
// Returns the data bits of this segment. /// Returns the data bits of this segment.
pub fn data(&self) -> &Vec<bool> { pub fn data(&self) -> &Vec<bool> {
&self.data &self.data
} }
@ -1061,7 +1061,7 @@ static ALPHANUMERIC_CHARSET: [char; 45] = ['0','1','2','3','4','5','6','7','8','
/*---- QrSegmentMode functionality ----*/ /*---- QrSegmentMode functionality ----*/
// Describes how a segment's data bits are interpreted. /// Describes how a segment's data bits are interpreted.
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub enum QrSegmentMode { pub enum QrSegmentMode {
Numeric, Numeric,
@ -1107,13 +1107,13 @@ impl QrSegmentMode {
/*---- Bit buffer functionality ----*/ /*---- Bit buffer functionality ----*/
// An appendable sequence of bits (0s and 1s). Mainly used by QrSegment. /// An appendable sequence of bits (0s and 1s). Mainly used by QrSegment.
pub struct BitBuffer(pub Vec<bool>); pub struct BitBuffer(pub Vec<bool>);
impl BitBuffer { impl BitBuffer {
// Appends the given number of low-order bits of the given value /// Appends the given number of low-order bits of the given value
// to this buffer. Requires len <= 31 and val < 2^len. /// to this buffer. Requires len <= 31 and val < 2^len.
pub fn append_bits(&mut self, val: u32, len: u8) { pub fn append_bits(&mut self, val: u32, len: u8) {
assert!(len <= 31 && (val >> len) == 0, "Value out of range"); assert!(len <= 31 && (val >> len) == 0, "Value out of range");
self.0.extend((0 .. len as i32).rev().map(|i| get_bit(val, i))); // Append bit by bit self.0.extend((0 .. len as i32).rev().map(|i| get_bit(val, i))); // Append bit by bit

Loading…
Cancel
Save