C++ Port:
[zxing.git] / cpp / core / src / zxing / common / Array.h
index 150819d..39b1786 100644 (file)
-#ifndef __ARRAY_H__
-#define __ARRAY_H__
-
-/*
- *  Array.h
- *  zxing
- *
- *  Created by Christian Brunschen on 07/05/2008.
- *  Copyright 2008 Google UK. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <valarray>
-#include <cstdarg>
-
-#ifdef DEBUG_COUNTING
-#include <iostream>
-#include <typeinfo>
-#endif
-
-#include "Counted.h"
-
-
-namespace zxing {
-
-template<typename T> class Array : public Counted {
-protected:
-public:
-  std::valarray<T> values_;
-  Array(size_t n) :
-      Counted(), values_(T(), n) {
-  }
-  Array(T *ts, size_t n) :
-      Counted(), values_(ts, n) {
-  }
-  Array(T v, size_t n) :
-      Counted(), values_(v, n) {
-  }
-  Array(std::valarray<T> &v) :
-      Counted(), values_(v) {
-  }
-  Array(Array<T> &other) :
-      Counted(), values_(other.values_) {
-  }
-  Array(Array<T> *other) :
-      Counted(), values_(other->values_) {
-  }
-  virtual ~Array() {
-  }
-  Array<T>& operator=(const Array<T> &other) {
-#ifdef DEBUG_COUNTING
-    cout << "assigning values from Array " << &other << " to this Array " << this << ", ";
-#endif
-    values_ = other.values_;
-#ifdef DEBUG_COUNTING
-    cout << "new size = " << values_.size() << "\n";
-#endif
-    return *this;
-  }
-  Array<T>& operator=(const std::valarray<T> &array) {
-#ifdef DEBUG_COUNTING
-    cout << "assigning values from Array " << &array << " to this Array " << this << ", ";
-#endif
-    values_ = array;
-#ifdef DEBUG_COUNTING
-    cout << "new size = " << values_.size() << "\n";
-#endif
-    return *this;
-  }
-  T operator[](size_t i) const {
-    return values_[i];
-  }
-  T& operator[](size_t i) {
-    return values_[i];
-  }
-  size_t size() const {
-    return values_.size();
-  }
-  std::valarray<T> values() const {
-    return values_;
-  }
-  std::valarray<T>& values() {
-    return values_;
-  }
-};
-
-template<typename T> class ArrayRef {
-private:
-public:
-  Array<T> *array_;
-  ArrayRef() :
-      array_(0) {
-#ifdef DEBUG_COUNTING
-    cout << "instantiating empty ArrayRef " << this << "\n";
-#endif
-  }
-  ArrayRef(size_t n) :
-      array_(0) {
-#ifdef DEBUG_COUNTING
-    cout << "instantiating ArrayRef " << this << "with size " << n << "\n";
-#endif
-    reset(new Array<T> (n));
-  }
-  ArrayRef(T *ts, size_t n) :
-      array_(0) {
-#ifdef DEBUG_COUNTING
-    cout << "instantiating ArrayRef " << this << "with " << n << " elements at " << (void *)ts << "\n";
-#endif
-    reset(new Array<T> (ts, n));
-  }
-  ArrayRef(Array<T> *a) :
-      array_(0) {
-#ifdef DEBUG_COUNTING
-    cout << "instantiating ArrayRef " << this << " from pointer:\n";
-#endif
-    reset(a);
-  }
-  ArrayRef(const Array<T> &a) :
-      array_(0) {
-#ifdef DEBUG_COUNTING
-    cout << "instantiating ArrayRef " << this << " from reference to Array " << (void *)&a << ":\n";
-#endif
-    reset(const_cast<Array<T> *>(&a));
-  }
-  ArrayRef(const ArrayRef &other) :
-      array_(0) {
-#ifdef DEBUG_COUNTING
-    cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n";
-#endif
-    reset(other.array_);
-  }
-
-  template<class Y>
-  ArrayRef(const ArrayRef<Y> &other) :
-      array_(0) {
-#ifdef DEBUG_COUNTING
-    cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n";
-#endif
-    reset(static_cast<const Array<T> *>(other.array_));
-  }
-
-  ~ArrayRef() {
-#ifdef DEBUG_COUNTING
-    cout << "destroying ArrayRef " << this << " with " << (array_ ? typeid(*array_).name() : "NULL") << " "
-         << array_ << "\n";
-#endif
-    if (array_) {
-      array_->release();
-    }
-    array_ = 0;
-  }
-
-  T operator[](size_t i) const {
-    return (*array_)[i];
-  }
-  T& operator[](size_t i) {
-    return (*array_)[i];
-  }
-  size_t size() const {
-    return array_->size();
-  }
-
-  void reset(Array<T> *a) {
-#ifdef DEBUG_COUNTING
-    cout << "resetting ArrayRef " << this << " from " << (array_ ? typeid(*array_).name() : "NULL") << " "
-         << array_ << " to " << (a ? typeid(*a).name() : "NULL") << " " << a << "\n";
-#endif
-    if (a) {
-      a->retain();
-    }
-    if (array_) {
-      array_->release();
-    }
-    array_ = a;
-  }
-  void reset(const ArrayRef<T> &other) {
-    reset(other.array_);
-  }
-  ArrayRef<T>& operator=(const ArrayRef<T> &other) {
-    reset(other);
-    return *this;
-  }
-  ArrayRef<T>& operator=(Array<T> *a) {
-    reset(a);
-    return *this;
-  }
-
-  Array<T>& operator*() {
-    return *array_;
-  }
-  Array<T>* operator->() {
-    return array_;
-  }
-};
-
-} // namespace zxing
-
-#endif // __ARRAY_H__
+#ifndef __ARRAY_H__\r
+#define __ARRAY_H__\r
+\r
+/*\r
+ *  Array.h\r
+ *  zxing\r
+ *\r
+ *  Created by Christian Brunschen on 07/05/2008.\r
+ *  Copyright 2008 Google UK. All rights reserved.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <valarray>\r
+#include <cstdarg>\r
+\r
+#ifdef DEBUG_COUNTING\r
+#include <iostream>\r
+#include <typeinfo>\r
+#endif\r
+\r
+#include <zxing/common/Counted.h>\r
+\r
+\r
+namespace zxing {\r
+\r
+template<typename T> class Array : public Counted {\r
+protected:\r
+public:\r
+  std::valarray<T> values_;\r
+  Array(size_t n) :\r
+      Counted(), values_(T(), n) {\r
+  }\r
+  Array(T *ts, size_t n) :\r
+      Counted(), values_(ts, n) {\r
+  }\r
+  Array(T v, size_t n) :\r
+      Counted(), values_(v, n) {\r
+  }\r
+  Array(std::valarray<T> &v) :\r
+      Counted(), values_(v) {\r
+  }\r
+  Array(Array<T> &other) :\r
+      Counted(), values_(other.values_) {\r
+  }\r
+  Array(Array<T> *other) :\r
+      Counted(), values_(other->values_) {\r
+  }\r
+  virtual ~Array() {\r
+  }\r
+  Array<T>& operator=(const Array<T> &other) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "assigning values from Array " << &other << " to this Array " << this << ", ";\r
+#endif\r
+    values_ = other.values_;\r
+#ifdef DEBUG_COUNTING\r
+    cout << "new size = " << values_.size() << "\n";\r
+#endif\r
+    return *this;\r
+  }\r
+  Array<T>& operator=(const std::valarray<T> &array) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "assigning values from Array " << &array << " to this Array " << this << ", ";\r
+#endif\r
+    values_ = array;\r
+#ifdef DEBUG_COUNTING\r
+    cout << "new size = " << values_.size() << "\n";\r
+#endif\r
+    return *this;\r
+  }\r
+  T operator[](size_t i) const {\r
+    return values_[i];\r
+  }\r
+  T& operator[](size_t i) {\r
+    return values_[i];\r
+  }\r
+  size_t size() const {\r
+    return values_.size();\r
+  }\r
+  std::valarray<T> values() const {\r
+    return values_;\r
+  }\r
+  std::valarray<T>& values() {\r
+    return values_;\r
+  }\r
+};\r
+\r
+template<typename T> class ArrayRef {\r
+private:\r
+public:\r
+  Array<T> *array_;\r
+  ArrayRef() :\r
+      array_(0) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "instantiating empty ArrayRef " << this << "\n";\r
+#endif\r
+  }\r
+  ArrayRef(size_t n) :\r
+      array_(0) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "instantiating ArrayRef " << this << "with size " << n << "\n";\r
+#endif\r
+    reset(new Array<T> (n));\r
+  }\r
+  ArrayRef(T *ts, size_t n) :\r
+      array_(0) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "instantiating ArrayRef " << this << "with " << n << " elements at " << (void *)ts << "\n";\r
+#endif\r
+    reset(new Array<T> (ts, n));\r
+  }\r
+  ArrayRef(Array<T> *a) :\r
+      array_(0) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "instantiating ArrayRef " << this << " from pointer:\n";\r
+#endif\r
+    reset(a);\r
+  }\r
+  ArrayRef(const Array<T> &a) :\r
+      array_(0) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "instantiating ArrayRef " << this << " from reference to Array " << (void *)&a << ":\n";\r
+#endif\r
+    reset(const_cast<Array<T> *>(&a));\r
+  }\r
+  ArrayRef(const ArrayRef &other) :\r
+      array_(0) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n";\r
+#endif\r
+    reset(other.array_);\r
+  }\r
+\r
+  template<class Y>\r
+  ArrayRef(const ArrayRef<Y> &other) :\r
+      array_(0) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n";\r
+#endif\r
+    reset(static_cast<const Array<T> *>(other.array_));\r
+  }\r
+\r
+  ~ArrayRef() {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "destroying ArrayRef " << this << " with " << (array_ ? typeid(*array_).name() : "NULL") << " "\r
+         << array_ << "\n";\r
+#endif\r
+    if (array_) {\r
+      array_->release();\r
+    }\r
+    array_ = 0;\r
+  }\r
+\r
+  T operator[](size_t i) const {\r
+    return (*array_)[i];\r
+  }\r
+  T& operator[](size_t i) {\r
+    return (*array_)[i];\r
+  }\r
+  size_t size() const {\r
+    return array_->size();\r
+  }\r
+\r
+  void reset(Array<T> *a) {\r
+#ifdef DEBUG_COUNTING\r
+    cout << "resetting ArrayRef " << this << " from " << (array_ ? typeid(*array_).name() : "NULL") << " "\r
+         << array_ << " to " << (a ? typeid(*a).name() : "NULL") << " " << a << "\n";\r
+#endif\r
+    if (a) {\r
+      a->retain();\r
+    }\r
+    if (array_) {\r
+      array_->release();\r
+    }\r
+    array_ = a;\r
+  }\r
+  void reset(const ArrayRef<T> &other) {\r
+    reset(other.array_);\r
+  }\r
+  ArrayRef<T>& operator=(const ArrayRef<T> &other) {\r
+    reset(other);\r
+    return *this;\r
+  }\r
+  ArrayRef<T>& operator=(Array<T> *a) {\r
+    reset(a);\r
+    return *this;\r
+  }\r
+\r
+  Array<T>& operator*() {\r
+    return *array_;\r
+  }\r
+  Array<T>* operator->() {\r
+    return array_;\r
+  }\r
+};\r
+\r
+} // namespace zxing\r
+\r
+#endif // __ARRAY_H__\r