C++ port: Hints infrastructure was added in r1499. This changeset implements reader...
[zxing.git] / cpp / core / src / zxing / oned / MultiFormatUPCEANReader.cpp
index 61011f0..a11243c 100644 (file)
@@ -22,6 +22,7 @@
 #include <zxing/oned/EAN13Reader.h>
 #include <zxing/oned/EAN8Reader.h>
 #include <zxing/oned/UPCEReader.h>
+#include <zxing/oned/UPCAReader.h>
 #include <zxing/oned/OneDResultPoint.h>
 #include <zxing/common/Array.h>
 #include <zxing/ReaderException.h>
 namespace zxing {
        namespace oned {
                
-               MultiFormatUPCEANReader::MultiFormatUPCEANReader(){
-                       readers = new std::vector<OneDReader*>();
-                       readers->push_back(new EAN13Reader());
-                       // UPC-A is covered by EAN-13
-                       readers->push_back(new EAN8Reader());
-                       readers->push_back(new UPCEReader());
+               MultiFormatUPCEANReader::MultiFormatUPCEANReader(DecodeHints hints) : readers() {
+                 if (hints.containsFormat(BarcodeFormat_EAN_13)) {
+                   readers.push_back(Ref<OneDReader>(new EAN13Reader()));
+                 } else if (hints.containsFormat(BarcodeFormat_UPC_A)) {
+                   readers.push_back(Ref<OneDReader>(new UPCAReader()));
+                 }
+                 if (hints.containsFormat(BarcodeFormat_EAN_8)) {
+                   readers.push_back(Ref<OneDReader>(new EAN8Reader()));
+                 }
+                 if (hints.containsFormat(BarcodeFormat_UPC_E)) {
+                   readers.push_back(Ref<OneDReader>(new UPCEReader()));
+                 }
+                 if (readers.size() == 0) {
+             readers.push_back(Ref<OneDReader>(new EAN13Reader()));
+             // UPC-A is covered by EAN-13
+             readers.push_back(Ref<OneDReader>(new EAN8Reader()));
+             readers.push_back(Ref<OneDReader>(new UPCEReader()));
+                 }
                }
-               
+
                Ref<Result> MultiFormatUPCEANReader::decodeRow(int rowNumber, Ref<BitArray> row){                       
                        // Compute this location once and reuse it on multiple implementations
-                       int size = readers->size();
+                       int size = readers.size();
                        for (int i = 0; i < size; i++) {
-                               OneDReader* reader = (*readers)[i];
+                               Ref<OneDReader> reader = readers[i];
                                Ref<Result> result;
                                try {
                                        result = reader->decodeRow(rowNumber, row);//decodeRow(rowNumber, row, startGuardPattern);
@@ -60,7 +73,7 @@ namespace zxing {
                                // UPC-A. So we special case it here, and convert an EAN-13 result to a UPC-A
                                // result if appropriate.
                                if (result->getBarcodeFormat() == BarcodeFormat_EAN_13) {
-                                       std::string& text = (result->getText())->getText();
+                                       const std::string& text = (result->getText())->getText();
                                        if (text[0] == '0') {
                                                Ref<String> resultString(new String(text.substr(1)));
                                                Ref<Result> res(new Result(resultString, result->getRawBytes(), result->getResultPoints(), BarcodeFormat_UPC_A));
@@ -71,9 +84,5 @@ namespace zxing {
                        }
                        throw ReaderException("No EAN code detected");
                }
-               
-               MultiFormatUPCEANReader::~MultiFormatUPCEANReader(){
-                       delete readers;
-               }
        }
-}
\ No newline at end of file
+}