zxing_cpp 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (332) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.gitmodules +3 -0
  4. data/CHANGELOG.rdoc +6 -0
  5. data/Gemfile +3 -0
  6. data/Manifest.txt +331 -0
  7. data/README.rdoc +138 -0
  8. data/Rakefile +28 -0
  9. data/bin/zxd +87 -0
  10. data/bin/zxe +53 -0
  11. data/ext/zxing/extconf.rb +27 -0
  12. data/ext/zxing/zxing-cpp/.gitignore +4 -0
  13. data/ext/zxing/zxing-cpp/AUTHORS +115 -0
  14. data/ext/zxing/zxing-cpp/CMakeLists.txt +84 -0
  15. data/ext/zxing/zxing-cpp/COPYING +201 -0
  16. data/ext/zxing/zxing-cpp/NOTICE +65 -0
  17. data/ext/zxing/zxing-cpp/README.md +50 -0
  18. data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.cpp +112 -0
  19. data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.h +40 -0
  20. data/ext/zxing/zxing-cpp/cli/src/jpgd.cpp +3174 -0
  21. data/ext/zxing/zxing-cpp/cli/src/jpgd.h +319 -0
  22. data/ext/zxing/zxing-cpp/cli/src/lodepng.cpp +6261 -0
  23. data/ext/zxing/zxing-cpp/cli/src/lodepng.h +1695 -0
  24. data/ext/zxing/zxing-cpp/cli/src/main.cpp +297 -0
  25. data/ext/zxing/zxing-cpp/cmake/FindCPPUNIT.cmake +54 -0
  26. data/ext/zxing/zxing-cpp/cmake/FindIconv.cmake +57 -0
  27. data/ext/zxing/zxing-cpp/core/src/bigint/.gitignore +6 -0
  28. data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.cc +405 -0
  29. data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.hh +215 -0
  30. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.cc +70 -0
  31. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.hh +25 -0
  32. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerLibrary.hh +8 -0
  33. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.cc +50 -0
  34. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.hh +72 -0
  35. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.cc +697 -0
  36. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.hh +418 -0
  37. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.cc +125 -0
  38. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.hh +122 -0
  39. data/ext/zxing/zxing-cpp/core/src/bigint/ChangeLog +146 -0
  40. data/ext/zxing/zxing-cpp/core/src/bigint/Makefile +73 -0
  41. data/ext/zxing/zxing-cpp/core/src/bigint/NumberlikeArray.hh +177 -0
  42. data/ext/zxing/zxing-cpp/core/src/bigint/README +71 -0
  43. data/ext/zxing/zxing-cpp/core/src/win32/zxing/iconv.h +14 -0
  44. data/ext/zxing/zxing-cpp/core/src/win32/zxing/stdint.h +247 -0
  45. data/ext/zxing/zxing-cpp/core/src/win32/zxing/win_iconv.c +2035 -0
  46. data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.cpp +40 -0
  47. data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.h +60 -0
  48. data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.cpp +45 -0
  49. data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.h +50 -0
  50. data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.cpp +70 -0
  51. data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.h +56 -0
  52. data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.cpp +28 -0
  53. data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.h +34 -0
  54. data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.cpp +142 -0
  55. data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.h +85 -0
  56. data/ext/zxing/zxing-cpp/core/src/zxing/Exception.cpp +43 -0
  57. data/ext/zxing/zxing-cpp/core/src/zxing/Exception.h +51 -0
  58. data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.cpp +41 -0
  59. data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.h +37 -0
  60. data/ext/zxing/zxing-cpp/core/src/zxing/IllegalStateException.h +35 -0
  61. data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.cpp +68 -0
  62. data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.h +48 -0
  63. data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.cpp +86 -0
  64. data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.h +59 -0
  65. data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.cpp +124 -0
  66. data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.h +48 -0
  67. data/ext/zxing/zxing-cpp/core/src/zxing/NotFoundException.h +35 -0
  68. data/ext/zxing/zxing-cpp/core/src/zxing/Reader.cpp +31 -0
  69. data/ext/zxing/zxing-cpp/core/src/zxing/Reader.h +40 -0
  70. data/ext/zxing/zxing-cpp/core/src/zxing/ReaderException.h +37 -0
  71. data/ext/zxing/zxing-cpp/core/src/zxing/Result.cpp +61 -0
  72. data/ext/zxing/zxing-cpp/core/src/zxing/Result.h +55 -0
  73. data/ext/zxing/zxing-cpp/core/src/zxing/ResultIO.cpp +34 -0
  74. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.cpp +108 -0
  75. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.h +55 -0
  76. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.cpp +26 -0
  77. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.h +39 -0
  78. data/ext/zxing/zxing-cpp/core/src/zxing/ZXing.h +133 -0
  79. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.cpp +54 -0
  80. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.h +48 -0
  81. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.cpp +68 -0
  82. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.h +49 -0
  83. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.cpp +489 -0
  84. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.h +69 -0
  85. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.cpp +548 -0
  86. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.h +92 -0
  87. data/ext/zxing/zxing-cpp/core/src/zxing/common/Array.h +170 -0
  88. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.cpp +155 -0
  89. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.h +81 -0
  90. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArrayIO.cpp +31 -0
  91. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.cpp +143 -0
  92. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.h +91 -0
  93. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.cpp +76 -0
  94. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.h +74 -0
  95. data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.cpp +104 -0
  96. data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.h +53 -0
  97. data/ext/zxing/zxing-cpp/core/src/zxing/common/Counted.h +140 -0
  98. data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.cpp +46 -0
  99. data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.h +51 -0
  100. data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.cpp +39 -0
  101. data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.h +43 -0
  102. data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp +212 -0
  103. data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.h +48 -0
  104. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp +80 -0
  105. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.h +53 -0
  106. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp +81 -0
  107. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h +46 -0
  108. data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.cpp +122 -0
  109. data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.h +45 -0
  110. data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.cpp +226 -0
  111. data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.h +67 -0
  112. data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.cpp +27 -0
  113. data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.h +36 -0
  114. data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.cpp +107 -0
  115. data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.h +49 -0
  116. data/ext/zxing/zxing-cpp/core/src/zxing/common/Point.h +47 -0
  117. data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.cpp +61 -0
  118. data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.h +51 -0
  119. data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.cpp +198 -0
  120. data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.h +52 -0
  121. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/JavaMath.h +43 -0
  122. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MathUtils.h +57 -0
  123. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp +174 -0
  124. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h +62 -0
  125. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp +330 -0
  126. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h +59 -0
  127. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp +150 -0
  128. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.h +73 -0
  129. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp +218 -0
  130. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h +56 -0
  131. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp +174 -0
  132. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h +49 -0
  133. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp +30 -0
  134. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h +33 -0
  135. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp +54 -0
  136. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.h +45 -0
  137. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.cpp +199 -0
  138. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.h +87 -0
  139. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp +361 -0
  140. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h +59 -0
  141. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp +113 -0
  142. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.h +49 -0
  143. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp +416 -0
  144. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h +104 -0
  145. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp +93 -0
  146. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.h +49 -0
  147. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp +46 -0
  148. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.h +43 -0
  149. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.cpp +446 -0
  150. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.h +94 -0
  151. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp +23 -0
  152. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.h +23 -0
  153. data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.cpp +75 -0
  154. data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.h +42 -0
  155. data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp +137 -0
  156. data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h +51 -0
  157. data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp +29 -0
  158. data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.h +41 -0
  159. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp +58 -0
  160. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h +36 -0
  161. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp +47 -0
  162. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h +37 -0
  163. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp +236 -0
  164. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h +47 -0
  165. data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.cpp +340 -0
  166. data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.h +57 -0
  167. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.cpp +496 -0
  168. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.h +48 -0
  169. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.cpp +328 -0
  170. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.h +63 -0
  171. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.cpp +293 -0
  172. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.h +58 -0
  173. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.cpp +85 -0
  174. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.h +49 -0
  175. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.cpp +65 -0
  176. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.h +47 -0
  177. data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.cpp +337 -0
  178. data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.h +54 -0
  179. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp +96 -0
  180. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.h +38 -0
  181. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp +110 -0
  182. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h +41 -0
  183. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.cpp +227 -0
  184. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.h +81 -0
  185. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.cpp +28 -0
  186. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.h +35 -0
  187. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.cpp +71 -0
  188. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.h +50 -0
  189. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.cpp +309 -0
  190. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.h +88 -0
  191. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.cpp +146 -0
  192. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.h +47 -0
  193. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.cpp +170 -0
  194. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.h +49 -0
  195. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp +997 -0
  196. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h +84 -0
  197. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp +563 -0
  198. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h +84 -0
  199. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.cpp +118 -0
  200. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.h +62 -0
  201. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp +214 -0
  202. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h +71 -0
  203. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp +120 -0
  204. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h +72 -0
  205. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp +284 -0
  206. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h +68 -0
  207. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.cpp +664 -0
  208. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.h +106 -0
  209. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp +714 -0
  210. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.h +122 -0
  211. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp +65 -0
  212. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h +52 -0
  213. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.cpp +117 -0
  214. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.h +54 -0
  215. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.cpp +52 -0
  216. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.h +48 -0
  217. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.cpp +560 -0
  218. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.h +85 -0
  219. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp +183 -0
  220. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h +56 -0
  221. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp +118 -0
  222. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.h +50 -0
  223. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.cpp +159 -0
  224. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.h +50 -0
  225. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp +425 -0
  226. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h +72 -0
  227. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.cpp +107 -0
  228. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.h +46 -0
  229. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.cpp +90 -0
  230. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.h +57 -0
  231. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp +47 -0
  232. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h +45 -0
  233. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +208 -0
  234. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h +68 -0
  235. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.cpp +314 -0
  236. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.h +69 -0
  237. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp +69 -0
  238. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.h +48 -0
  239. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp +559 -0
  240. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h +76 -0
  241. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp +41 -0
  242. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h +47 -0
  243. data/ext/zxing/zxing-cpp/core/tests/src/TestRunner.cpp +30 -0
  244. data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.cpp +216 -0
  245. data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.h +61 -0
  246. data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.cpp +106 -0
  247. data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.h +55 -0
  248. data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.cpp +49 -0
  249. data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.h +42 -0
  250. data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.cpp +58 -0
  251. data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.h +46 -0
  252. data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.cpp +69 -0
  253. data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.h +47 -0
  254. data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp +129 -0
  255. data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h +62 -0
  256. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp +47 -0
  257. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h +45 -0
  258. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.cpp +88 -0
  259. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.h +47 -0
  260. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.cpp +88 -0
  261. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.h +49 -0
  262. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp +132 -0
  263. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.h +91 -0
  264. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.cpp +52 -0
  265. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.h +47 -0
  266. data/ext/zxing/zxing.cc +224 -0
  267. data/lib/zxing.rb +50 -0
  268. data/lib/zxing/.gitignore +2 -0
  269. data/lib/zxing/aztec.rb +5 -0
  270. data/lib/zxing/aztec/aztec_reader.rb +14 -0
  271. data/lib/zxing/bad_image_exception.rb +4 -0
  272. data/lib/zxing/binarizer.rb +8 -0
  273. data/lib/zxing/binary_bitmap.rb +15 -0
  274. data/lib/zxing/checksum_exception.rb +4 -0
  275. data/lib/zxing/common.rb +7 -0
  276. data/lib/zxing/common/bit_matrix.rb +9 -0
  277. data/lib/zxing/common/hybrid_binarizer.rb +17 -0
  278. data/lib/zxing/common/illegal_argument_exception.rb +4 -0
  279. data/lib/zxing/datamatrix.rb +5 -0
  280. data/lib/zxing/datamatrix/data_matrix_reader.rb +14 -0
  281. data/lib/zxing/decodable.rb +11 -0
  282. data/lib/zxing/exception.rb +4 -0
  283. data/lib/zxing/ffi.rb +20 -0
  284. data/lib/zxing/ffi/aztec.rb +6 -0
  285. data/lib/zxing/ffi/aztec/aztec_reader.rb +9 -0
  286. data/lib/zxing/ffi/binarizer.rb +25 -0
  287. data/lib/zxing/ffi/binary_bitmap.rb +15 -0
  288. data/lib/zxing/ffi/common.rb +8 -0
  289. data/lib/zxing/ffi/common/bit_matrix.rb +12 -0
  290. data/lib/zxing/ffi/common/greyscale_luminance_source.rb +30 -0
  291. data/lib/zxing/ffi/common/hybrid_binarizer.rb +10 -0
  292. data/lib/zxing/ffi/datamatrix.rb +6 -0
  293. data/lib/zxing/ffi/datamatrix/data_matrix_reader.rb +9 -0
  294. data/lib/zxing/ffi/library.rb +102 -0
  295. data/lib/zxing/ffi/luminance_source.rb +18 -0
  296. data/lib/zxing/ffi/multi_format_reader.rb +9 -0
  297. data/lib/zxing/ffi/oned.rb +6 -0
  298. data/lib/zxing/ffi/oned/code_39_reader.rb +10 -0
  299. data/lib/zxing/ffi/qrcode.rb +8 -0
  300. data/lib/zxing/ffi/qrcode/decoder.rb +10 -0
  301. data/lib/zxing/ffi/qrcode/detector.rb +10 -0
  302. data/lib/zxing/ffi/reader.rb +58 -0
  303. data/lib/zxing/ffi/result.rb +23 -0
  304. data/lib/zxing/format_exception.rb +4 -0
  305. data/lib/zxing/illegal_argument_exception.rb +4 -0
  306. data/lib/zxing/image.rb +15 -0
  307. data/lib/zxing/luminance_source.rb +18 -0
  308. data/lib/zxing/multi_format_reader.rb +11 -0
  309. data/lib/zxing/not_found_exception.rb +4 -0
  310. data/lib/zxing/oned.rb +5 -0
  311. data/lib/zxing/oned/code_39_reader.rb +15 -0
  312. data/lib/zxing/qrcode.rb +8 -0
  313. data/lib/zxing/qrcode/decoder.rb +14 -0
  314. data/lib/zxing/qrcode/detector.rb +14 -0
  315. data/lib/zxing/qrcode/encoder.rb +8 -0
  316. data/lib/zxing/qrcode/encoder/byte_matrix.rb +18 -0
  317. data/lib/zxing/qrcode/encoder/encoder.rb +9 -0
  318. data/lib/zxing/qrcode/encoder/qrcode.rb +18 -0
  319. data/lib/zxing/reader.rb +8 -0
  320. data/lib/zxing/reader_exception.rb +4 -0
  321. data/lib/zxing/reed_solomon_exception.rb +2 -0
  322. data/lib/zxing/result.rb +18 -0
  323. data/lib/zxing/rmagick.rb +5 -0
  324. data/lib/zxing/rmagick/image.rb +104 -0
  325. data/lib/zxing/version.rb +33 -0
  326. data/test/qrcode.png +0 -0
  327. data/test/test_helper.rb +5 -0
  328. data/test/test_zxing.rb +58 -0
  329. data/test/vendor.rb +360 -0
  330. data/test/zxing/test_decodable.rb +38 -0
  331. data/zxing_cpp.gemspec +48 -0
  332. metadata +473 -0
@@ -0,0 +1,418 @@
1
+ #ifndef BIGUNSIGNED_H
2
+ #define BIGUNSIGNED_H
3
+
4
+ #include "NumberlikeArray.hh"
5
+
6
+ /* A BigUnsigned object represents a nonnegative integer of size limited only by
7
+ * available memory. BigUnsigneds support most mathematical operators and can
8
+ * be converted to and from most primitive integer types.
9
+ *
10
+ * The number is stored as a NumberlikeArray of unsigned longs as if it were
11
+ * written in base 256^sizeof(unsigned long). The least significant block is
12
+ * first, and the length is such that the most significant block is nonzero. */
13
+ class BigUnsigned : protected NumberlikeArray<unsigned long> {
14
+
15
+ public:
16
+ // Enumeration for the result of a comparison.
17
+ enum CmpRes { less = -1, equal = 0, greater = 1 };
18
+
19
+ // BigUnsigneds are built with a Blk type of unsigned long.
20
+ typedef unsigned long Blk;
21
+
22
+ typedef NumberlikeArray<Blk>::Index Index;
23
+ using NumberlikeArray<Blk>::N;
24
+
25
+ protected:
26
+ // Creates a BigUnsigned with a capacity; for internal use.
27
+ BigUnsigned(int, Index c) : NumberlikeArray<Blk>(0, c) {}
28
+
29
+ // Decreases len to eliminate any leading zero blocks.
30
+ void zapLeadingZeros() {
31
+ while (len > 0 && blk[len - 1] == 0)
32
+ len--;
33
+ }
34
+
35
+ public:
36
+ // Constructs zero.
37
+ BigUnsigned() : NumberlikeArray<Blk>() {}
38
+
39
+ // Copy constructor
40
+ BigUnsigned(const BigUnsigned &x) : NumberlikeArray<Blk>(x) {}
41
+
42
+ // Assignment operator
43
+ void operator=(const BigUnsigned &x) {
44
+ NumberlikeArray<Blk>::operator =(x);
45
+ }
46
+
47
+ // Constructor that copies from a given array of blocks.
48
+ BigUnsigned(const Blk *b, Index blen) : NumberlikeArray<Blk>(b, blen) {
49
+ // Eliminate any leading zeros we may have been passed.
50
+ zapLeadingZeros();
51
+ }
52
+
53
+ // Destructor. NumberlikeArray does the delete for us.
54
+ ~BigUnsigned() {}
55
+
56
+ // Constructors from primitive integer types
57
+ BigUnsigned(unsigned long x);
58
+ BigUnsigned( long x);
59
+ BigUnsigned(unsigned int x);
60
+ BigUnsigned( int x);
61
+ BigUnsigned(unsigned short x);
62
+ BigUnsigned( short x);
63
+ protected:
64
+ // Helpers
65
+ template <class X> void initFromPrimitive (X x);
66
+ template <class X> void initFromSignedPrimitive(X x);
67
+ public:
68
+
69
+ /* Converters to primitive integer types
70
+ * The implicit conversion operators caused trouble, so these are now
71
+ * named. */
72
+ unsigned long toUnsignedLong () const;
73
+ long toLong () const;
74
+ unsigned int toUnsignedInt () const;
75
+ int toInt () const;
76
+ unsigned short toUnsignedShort() const;
77
+ short toShort () const;
78
+ protected:
79
+ // Helpers
80
+ template <class X> X convertToSignedPrimitive() const;
81
+ template <class X> X convertToPrimitive () const;
82
+ public:
83
+
84
+ // BIT/BLOCK ACCESSORS
85
+
86
+ // Expose these from NumberlikeArray directly.
87
+ using NumberlikeArray<Blk>::getCapacity;
88
+ using NumberlikeArray<Blk>::getLength;
89
+
90
+ /* Returns the requested block, or 0 if it is beyond the length (as if
91
+ * the number had 0s infinitely to the left). */
92
+ Blk getBlock(Index i) const { return i >= len ? 0 : blk[i]; }
93
+ /* Sets the requested block. The number grows or shrinks as necessary. */
94
+ void setBlock(Index i, Blk newBlock);
95
+
96
+ // The number is zero if and only if the canonical length is zero.
97
+ bool isZero() const { return NumberlikeArray<Blk>::isEmpty(); }
98
+
99
+ /* Returns the length of the number in bits, i.e., zero if the number
100
+ * is zero and otherwise one more than the largest value of bi for
101
+ * which getBit(bi) returns true. */
102
+ Index bitLength() const;
103
+ /* Get the state of bit bi, which has value 2^bi. Bits beyond the
104
+ * number's length are considered to be 0. */
105
+ bool getBit(Index bi) const {
106
+ return (getBlock(bi / N) & (Blk(1) << (bi % N))) != 0;
107
+ }
108
+ /* Sets the state of bit bi to newBit. The number grows or shrinks as
109
+ * necessary. */
110
+ void setBit(Index bi, bool newBit);
111
+
112
+ // COMPARISONS
113
+
114
+ // Compares this to x like Perl's <=>
115
+ CmpRes compareTo(const BigUnsigned &x) const;
116
+
117
+ // Ordinary comparison operators
118
+ bool operator ==(const BigUnsigned &x) const {
119
+ return NumberlikeArray<Blk>::operator ==(x);
120
+ }
121
+ bool operator !=(const BigUnsigned &x) const {
122
+ return NumberlikeArray<Blk>::operator !=(x);
123
+ }
124
+ bool operator < (const BigUnsigned &x) const { return compareTo(x) == less ; }
125
+ bool operator <=(const BigUnsigned &x) const { return compareTo(x) != greater; }
126
+ bool operator >=(const BigUnsigned &x) const { return compareTo(x) != less ; }
127
+ bool operator > (const BigUnsigned &x) const { return compareTo(x) == greater; }
128
+
129
+ /*
130
+ * BigUnsigned and BigInteger both provide three kinds of operators.
131
+ * Here ``big-integer'' refers to BigInteger or BigUnsigned.
132
+ *
133
+ * (1) Overloaded ``return-by-value'' operators:
134
+ * +, -, *, /, %, unary -, &, |, ^, <<, >>.
135
+ * Big-integer code using these operators looks identical to code using
136
+ * the primitive integer types. These operators take one or two
137
+ * big-integer inputs and return a big-integer result, which can then
138
+ * be assigned to a BigInteger variable or used in an expression.
139
+ * Example:
140
+ * BigInteger a(1), b = 1;
141
+ * BigInteger c = a + b;
142
+ *
143
+ * (2) Overloaded assignment operators:
144
+ * +=, -=, *=, /=, %=, flipSign, &=, |=, ^=, <<=, >>=, ++, --.
145
+ * Again, these are used on big integers just like on ints. They take
146
+ * one writable big integer that both provides an operand and receives a
147
+ * result. Most also take a second read-only operand.
148
+ * Example:
149
+ * BigInteger a(1), b(1);
150
+ * a += b;
151
+ *
152
+ * (3) Copy-less operations: `add', `subtract', etc.
153
+ * These named methods take operands as arguments and store the result
154
+ * in the receiver (*this), avoiding unnecessary copies and allocations.
155
+ * `divideWithRemainder' is special: it both takes the dividend from and
156
+ * stores the remainder into the receiver, and it takes a separate
157
+ * object in which to store the quotient. NOTE: If you are wondering
158
+ * why these don't return a value, you probably mean to use the
159
+ * overloaded return-by-value operators instead.
160
+ *
161
+ * Examples:
162
+ * BigInteger a(43), b(7), c, d;
163
+ *
164
+ * c = a + b; // Now c == 50.
165
+ * c.add(a, b); // Same effect but without the two copies.
166
+ *
167
+ * c.divideWithRemainder(b, d);
168
+ * // 50 / 7; now d == 7 (quotient) and c == 1 (remainder).
169
+ *
170
+ * // ``Aliased'' calls now do the right thing using a temporary
171
+ * // copy, but see note on `divideWithRemainder'.
172
+ * a.add(a, b);
173
+ */
174
+
175
+ // COPY-LESS OPERATIONS
176
+
177
+ // These 8: Arguments are read-only operands, result is saved in *this.
178
+ void add(const BigUnsigned &a, const BigUnsigned &b);
179
+ void subtract(const BigUnsigned &a, const BigUnsigned &b);
180
+ void multiply(const BigUnsigned &a, const BigUnsigned &b);
181
+ void bitAnd(const BigUnsigned &a, const BigUnsigned &b);
182
+ void bitOr(const BigUnsigned &a, const BigUnsigned &b);
183
+ void bitXor(const BigUnsigned &a, const BigUnsigned &b);
184
+ /* Negative shift amounts translate to opposite-direction shifts,
185
+ * except for -2^(8*sizeof(int)-1) which is unimplemented. */
186
+ void bitShiftLeft(const BigUnsigned &a, int b);
187
+ void bitShiftRight(const BigUnsigned &a, int b);
188
+
189
+ /* `a.divideWithRemainder(b, q)' is like `q = a / b, a %= b'.
190
+ * / and % use semantics similar to Knuth's, which differ from the
191
+ * primitive integer semantics under division by zero. See the
192
+ * implementation in BigUnsigned.cc for details.
193
+ * `a.divideWithRemainder(b, a)' throws an exception: it doesn't make
194
+ * sense to write quotient and remainder into the same variable. */
195
+ void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q);
196
+
197
+ /* `divide' and `modulo' are no longer offered. Use
198
+ * `divideWithRemainder' instead. */
199
+
200
+ // OVERLOADED RETURN-BY-VALUE OPERATORS
201
+ BigUnsigned operator +(const BigUnsigned &x) const;
202
+ BigUnsigned operator -(const BigUnsigned &x) const;
203
+ BigUnsigned operator *(const BigUnsigned &x) const;
204
+ BigUnsigned operator /(const BigUnsigned &x) const;
205
+ BigUnsigned operator %(const BigUnsigned &x) const;
206
+ /* OK, maybe unary minus could succeed in one case, but it really
207
+ * shouldn't be used, so it isn't provided. */
208
+ BigUnsigned operator &(const BigUnsigned &x) const;
209
+ BigUnsigned operator |(const BigUnsigned &x) const;
210
+ BigUnsigned operator ^(const BigUnsigned &x) const;
211
+ BigUnsigned operator <<(int b) const;
212
+ BigUnsigned operator >>(int b) const;
213
+
214
+ // OVERLOADED ASSIGNMENT OPERATORS
215
+ void operator +=(const BigUnsigned &x);
216
+ void operator -=(const BigUnsigned &x);
217
+ void operator *=(const BigUnsigned &x);
218
+ void operator /=(const BigUnsigned &x);
219
+ void operator %=(const BigUnsigned &x);
220
+ void operator &=(const BigUnsigned &x);
221
+ void operator |=(const BigUnsigned &x);
222
+ void operator ^=(const BigUnsigned &x);
223
+ void operator <<=(int b);
224
+ void operator >>=(int b);
225
+
226
+ /* INCREMENT/DECREMENT OPERATORS
227
+ * To discourage messy coding, these do not return *this, so prefix
228
+ * and postfix behave the same. */
229
+ void operator ++( );
230
+ void operator ++(int);
231
+ void operator --( );
232
+ void operator --(int);
233
+
234
+ // Helper function that needs access to BigUnsigned internals
235
+ friend Blk getShiftedBlock(const BigUnsigned &num, Index x,
236
+ unsigned int y);
237
+
238
+ // See BigInteger.cc.
239
+ template <class X>
240
+ friend X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a);
241
+ };
242
+
243
+ /* Implementing the return-by-value and assignment operators in terms of the
244
+ * copy-less operations. The copy-less operations are responsible for making
245
+ * any necessary temporary copies to work around aliasing. */
246
+
247
+ inline BigUnsigned BigUnsigned::operator +(const BigUnsigned &x) const {
248
+ BigUnsigned ans;
249
+ ans.add(*this, x);
250
+ return ans;
251
+ }
252
+ inline BigUnsigned BigUnsigned::operator -(const BigUnsigned &x) const {
253
+ BigUnsigned ans;
254
+ ans.subtract(*this, x);
255
+ return ans;
256
+ }
257
+ inline BigUnsigned BigUnsigned::operator *(const BigUnsigned &x) const {
258
+ BigUnsigned ans;
259
+ ans.multiply(*this, x);
260
+ return ans;
261
+ }
262
+ inline BigUnsigned BigUnsigned::operator /(const BigUnsigned &x) const {
263
+ if (x.isZero()) throw "BigUnsigned::operator /: division by zero";
264
+ BigUnsigned q, r;
265
+ r = *this;
266
+ r.divideWithRemainder(x, q);
267
+ return q;
268
+ }
269
+ inline BigUnsigned BigUnsigned::operator %(const BigUnsigned &x) const {
270
+ if (x.isZero()) throw "BigUnsigned::operator %: division by zero";
271
+ BigUnsigned q, r;
272
+ r = *this;
273
+ r.divideWithRemainder(x, q);
274
+ return r;
275
+ }
276
+ inline BigUnsigned BigUnsigned::operator &(const BigUnsigned &x) const {
277
+ BigUnsigned ans;
278
+ ans.bitAnd(*this, x);
279
+ return ans;
280
+ }
281
+ inline BigUnsigned BigUnsigned::operator |(const BigUnsigned &x) const {
282
+ BigUnsigned ans;
283
+ ans.bitOr(*this, x);
284
+ return ans;
285
+ }
286
+ inline BigUnsigned BigUnsigned::operator ^(const BigUnsigned &x) const {
287
+ BigUnsigned ans;
288
+ ans.bitXor(*this, x);
289
+ return ans;
290
+ }
291
+ inline BigUnsigned BigUnsigned::operator <<(int b) const {
292
+ BigUnsigned ans;
293
+ ans.bitShiftLeft(*this, b);
294
+ return ans;
295
+ }
296
+ inline BigUnsigned BigUnsigned::operator >>(int b) const {
297
+ BigUnsigned ans;
298
+ ans.bitShiftRight(*this, b);
299
+ return ans;
300
+ }
301
+
302
+ inline void BigUnsigned::operator +=(const BigUnsigned &x) {
303
+ add(*this, x);
304
+ }
305
+ inline void BigUnsigned::operator -=(const BigUnsigned &x) {
306
+ subtract(*this, x);
307
+ }
308
+ inline void BigUnsigned::operator *=(const BigUnsigned &x) {
309
+ multiply(*this, x);
310
+ }
311
+ inline void BigUnsigned::operator /=(const BigUnsigned &x) {
312
+ if (x.isZero()) throw "BigUnsigned::operator /=: division by zero";
313
+ /* The following technique is slightly faster than copying *this first
314
+ * when x is large. */
315
+ BigUnsigned q;
316
+ divideWithRemainder(x, q);
317
+ // *this contains the remainder, but we overwrite it with the quotient.
318
+ *this = q;
319
+ }
320
+ inline void BigUnsigned::operator %=(const BigUnsigned &x) {
321
+ if (x.isZero()) throw "BigUnsigned::operator %=: division by zero";
322
+ BigUnsigned q;
323
+ // Mods *this by x. Don't care about quotient left in q.
324
+ divideWithRemainder(x, q);
325
+ }
326
+ inline void BigUnsigned::operator &=(const BigUnsigned &x) {
327
+ bitAnd(*this, x);
328
+ }
329
+ inline void BigUnsigned::operator |=(const BigUnsigned &x) {
330
+ bitOr(*this, x);
331
+ }
332
+ inline void BigUnsigned::operator ^=(const BigUnsigned &x) {
333
+ bitXor(*this, x);
334
+ }
335
+ inline void BigUnsigned::operator <<=(int b) {
336
+ bitShiftLeft(*this, b);
337
+ }
338
+ inline void BigUnsigned::operator >>=(int b) {
339
+ bitShiftRight(*this, b);
340
+ }
341
+
342
+ /* Templates for conversions of BigUnsigned to and from primitive integers.
343
+ * BigInteger.cc needs to instantiate convertToPrimitive, and the uses in
344
+ * BigUnsigned.cc didn't do the trick; I think g++ inlined convertToPrimitive
345
+ * instead of generating linkable instantiations. So for consistency, I put
346
+ * all the templates here. */
347
+
348
+ // CONSTRUCTION FROM PRIMITIVE INTEGERS
349
+
350
+ /* Initialize this BigUnsigned from the given primitive integer. The same
351
+ * pattern works for all primitive integer types, so I put it into a template to
352
+ * reduce code duplication. (Don't worry: this is protected and we instantiate
353
+ * it only with primitive integer types.) Type X could be signed, but x is
354
+ * known to be nonnegative. */
355
+ template <class X>
356
+ void BigUnsigned::initFromPrimitive(X x) {
357
+ if (x == 0)
358
+ ; // NumberlikeArray already initialized us to zero.
359
+ else {
360
+ // Create a single block. blk is NULL; no need to delete it.
361
+ cap = 1;
362
+ blk = new Blk[1];
363
+ len = 1;
364
+ blk[0] = Blk(x);
365
+ }
366
+ }
367
+
368
+ /* Ditto, but first check that x is nonnegative. I could have put the check in
369
+ * initFromPrimitive and let the compiler optimize it out for unsigned-type
370
+ * instantiations, but I wanted to avoid the warning stupidly issued by g++ for
371
+ * a condition that is constant in *any* instantiation, even if not in all. */
372
+ template <class X>
373
+ void BigUnsigned::initFromSignedPrimitive(X x) {
374
+ if (x < 0)
375
+ throw "BigUnsigned constructor: "
376
+ "Cannot construct a BigUnsigned from a negative number";
377
+ else
378
+ initFromPrimitive(x);
379
+ }
380
+
381
+ // CONVERSION TO PRIMITIVE INTEGERS
382
+
383
+ /* Template with the same idea as initFromPrimitive. This might be slightly
384
+ * slower than the previous version with the masks, but it's much shorter and
385
+ * clearer, which is the library's stated goal. */
386
+ template <class X>
387
+ X BigUnsigned::convertToPrimitive() const {
388
+ if (len == 0)
389
+ // The number is zero; return zero.
390
+ return 0;
391
+ else if (len == 1) {
392
+ // The single block might fit in an X. Try the conversion.
393
+ X x = X(blk[0]);
394
+ // Make sure the result accurately represents the block.
395
+ if (Blk(x) == blk[0])
396
+ // Successful conversion.
397
+ return x;
398
+ // Otherwise fall through.
399
+ }
400
+ throw "BigUnsigned::to<Primitive>: "
401
+ "Value is too big to fit in the requested type";
402
+ }
403
+
404
+ /* Wrap the above in an x >= 0 test to make sure we got a nonnegative result,
405
+ * not a negative one that happened to convert back into the correct nonnegative
406
+ * one. (E.g., catch incorrect conversion of 2^31 to the long -2^31.) Again,
407
+ * separated to avoid a g++ warning. */
408
+ template <class X>
409
+ X BigUnsigned::convertToSignedPrimitive() const {
410
+ X x = convertToPrimitive<X>();
411
+ if (x >= 0)
412
+ return x;
413
+ else
414
+ throw "BigUnsigned::to(Primitive): "
415
+ "Value is too big to fit in the requested type";
416
+ }
417
+
418
+ #endif
@@ -0,0 +1,125 @@
1
+ #include "BigUnsignedInABase.hh"
2
+
3
+ BigUnsignedInABase::BigUnsignedInABase(const Digit *d, Index l, Base base)
4
+ : NumberlikeArray<Digit>(d, l), base(base) {
5
+ // Check the base
6
+ if (base < 2)
7
+ throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): The base must be at least 2";
8
+
9
+ // Validate the digits.
10
+ for (Index i = 0; i < l; i++)
11
+ if (blk[i] >= base)
12
+ throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): A digit is too large for the specified base";
13
+
14
+ // Eliminate any leading zeros we may have been passed.
15
+ zapLeadingZeros();
16
+ }
17
+
18
+ namespace {
19
+ unsigned int bitLen(unsigned int x) {
20
+ unsigned int len = 0;
21
+ while (x > 0) {
22
+ x >>= 1;
23
+ len++;
24
+ }
25
+ return len;
26
+ }
27
+ unsigned int ceilingDiv(unsigned int a, unsigned int b) {
28
+ return (a + b - 1) / b;
29
+ }
30
+ }
31
+
32
+ BigUnsignedInABase::BigUnsignedInABase(const BigUnsigned &x, Base base) {
33
+ // Check the base
34
+ if (base < 2)
35
+ throw "BigUnsignedInABase(BigUnsigned, Base): The base must be at least 2";
36
+ this->base = base;
37
+
38
+ // Get an upper bound on how much space we need
39
+ int maxBitLenOfX = x.getLength() * BigUnsigned::N;
40
+ int minBitsPerDigit = bitLen(base) - 1;
41
+ int maxDigitLenOfX = ceilingDiv(maxBitLenOfX, minBitsPerDigit);
42
+ len = maxDigitLenOfX; // Another change to comply with `staying in bounds'.
43
+ allocate(len); // Get the space
44
+
45
+ BigUnsigned x2(x), buBase(base);
46
+ Index digitNum = 0;
47
+
48
+ while (!x2.isZero()) {
49
+ // Get last digit. This is like `lastDigit = x2 % buBase, x2 /= buBase'.
50
+ BigUnsigned lastDigit(x2);
51
+ lastDigit.divideWithRemainder(buBase, x2);
52
+ // Save the digit.
53
+ blk[digitNum] = lastDigit.toUnsignedShort();
54
+ // Move on. We can't run out of room: we figured it out above.
55
+ digitNum++;
56
+ }
57
+
58
+ // Save the actual length.
59
+ len = digitNum;
60
+ }
61
+
62
+ BigUnsignedInABase::operator BigUnsigned() const {
63
+ BigUnsigned ans(0), buBase(base), temp;
64
+ Index digitNum = len;
65
+ while (digitNum > 0) {
66
+ digitNum--;
67
+ temp.multiply(ans, buBase);
68
+ ans.add(temp, BigUnsigned(blk[digitNum]));
69
+ }
70
+ return ans;
71
+ }
72
+
73
+ BigUnsignedInABase::BigUnsignedInABase(const std::string &s, Base base) {
74
+ // Check the base.
75
+ if (base > 36)
76
+ throw "BigUnsignedInABase(std::string, Base): The default string conversion routines use the symbol set 0-9, A-Z and therefore support only up to base 36. You tried a conversion with a base over 36; write your own string conversion routine.";
77
+ // Save the base.
78
+ // This pattern is seldom seen in C++, but the analogous ``this.'' is common in Java.
79
+ this->base = base;
80
+
81
+ // `s.length()' is a `size_t', while `len' is a `NumberlikeArray::Index',
82
+ // also known as an `unsigned int'. Some compilers warn without this cast.
83
+ len = Index(s.length());
84
+ allocate(len);
85
+
86
+ Index digitNum, symbolNumInString;
87
+ for (digitNum = 0; digitNum < len; digitNum++) {
88
+ symbolNumInString = len - 1 - digitNum;
89
+ char theSymbol = s[symbolNumInString];
90
+ if (theSymbol >= '0' && theSymbol <= '9')
91
+ blk[digitNum] = theSymbol - '0';
92
+ else if (theSymbol >= 'A' && theSymbol <= 'Z')
93
+ blk[digitNum] = theSymbol - 'A' + 10;
94
+ else if (theSymbol >= 'a' && theSymbol <= 'z')
95
+ blk[digitNum] = theSymbol - 'a' + 10;
96
+ else
97
+ throw "BigUnsignedInABase(std::string, Base): Bad symbol in input. Only 0-9, A-Z, a-z are accepted.";
98
+
99
+ if (blk[digitNum] >= base)
100
+ throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): A digit is too large for the specified base";
101
+ }
102
+ zapLeadingZeros();
103
+ }
104
+
105
+ BigUnsignedInABase::operator std::string() const {
106
+ if (base > 36)
107
+ throw "BigUnsignedInABase ==> std::string: The default string conversion routines use the symbol set 0-9, A-Z and therefore support only up to base 36. You tried a conversion with a base over 36; write your own string conversion routine.";
108
+ if (len == 0)
109
+ return std::string("0");
110
+ // Some compilers don't have push_back, so use a char * buffer instead.
111
+ char *s = new char[len + 1];
112
+ s[len] = '\0';
113
+ Index digitNum, symbolNumInString;
114
+ for (symbolNumInString = 0; symbolNumInString < len; symbolNumInString++) {
115
+ digitNum = len - 1 - symbolNumInString;
116
+ Digit theDigit = blk[digitNum];
117
+ if (theDigit < 10)
118
+ s[symbolNumInString] = char('0' + theDigit);
119
+ else
120
+ s[symbolNumInString] = char('A' + theDigit - 10);
121
+ }
122
+ std::string s2(s);
123
+ delete [] s;
124
+ return s2;
125
+ }