Fork of https://developer.mbed.org/teams/Renesas/code/GR-PEACH_mbed-os-client-ZXingSample/

Committer:
Osamu Nakamura
Date:
Fri Jan 12 15:41:00 2018 +0900
Revision:
0:2f8d4a574b4e
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:2f8d4a574b4e 1 // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
Osamu Nakamura 0:2f8d4a574b4e 2 #ifndef __COUNTED_H__
Osamu Nakamura 0:2f8d4a574b4e 3 #define __COUNTED_H__
Osamu Nakamura 0:2f8d4a574b4e 4
Osamu Nakamura 0:2f8d4a574b4e 5 /*
Osamu Nakamura 0:2f8d4a574b4e 6 * Copyright 2010 ZXing authors All rights reserved.
Osamu Nakamura 0:2f8d4a574b4e 7 *
Osamu Nakamura 0:2f8d4a574b4e 8 * Licensed under the Apache License, Version 2.0 (the "License");
Osamu Nakamura 0:2f8d4a574b4e 9 * you may not use this file except in compliance with the License.
Osamu Nakamura 0:2f8d4a574b4e 10 * You may obtain a copy of the License at
Osamu Nakamura 0:2f8d4a574b4e 11 *
Osamu Nakamura 0:2f8d4a574b4e 12 * http://www.apache.org/licenses/LICENSE-2.0
Osamu Nakamura 0:2f8d4a574b4e 13 *
Osamu Nakamura 0:2f8d4a574b4e 14 * Unless required by applicable law or agreed to in writing, software
Osamu Nakamura 0:2f8d4a574b4e 15 * distributed under the License is distributed on an "AS IS" BASIS,
Osamu Nakamura 0:2f8d4a574b4e 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Osamu Nakamura 0:2f8d4a574b4e 17 * See the License for the specific language governing permissions and
Osamu Nakamura 0:2f8d4a574b4e 18 * limitations under the License.
Osamu Nakamura 0:2f8d4a574b4e 19 */
Osamu Nakamura 0:2f8d4a574b4e 20
Osamu Nakamura 0:2f8d4a574b4e 21 #include <iostream>
Osamu Nakamura 0:2f8d4a574b4e 22
Osamu Nakamura 0:2f8d4a574b4e 23 namespace zxing {
Osamu Nakamura 0:2f8d4a574b4e 24
Osamu Nakamura 0:2f8d4a574b4e 25 /* base class for reference-counted objects */
Osamu Nakamura 0:2f8d4a574b4e 26 class Counted {
Osamu Nakamura 0:2f8d4a574b4e 27 private:
Osamu Nakamura 0:2f8d4a574b4e 28 unsigned int count_;
Osamu Nakamura 0:2f8d4a574b4e 29 public:
Osamu Nakamura 0:2f8d4a574b4e 30 Counted() :
Osamu Nakamura 0:2f8d4a574b4e 31 count_(0) {
Osamu Nakamura 0:2f8d4a574b4e 32 }
Osamu Nakamura 0:2f8d4a574b4e 33 virtual ~Counted() {
Osamu Nakamura 0:2f8d4a574b4e 34 }
Osamu Nakamura 0:2f8d4a574b4e 35 Counted *retain() {
Osamu Nakamura 0:2f8d4a574b4e 36 count_++;
Osamu Nakamura 0:2f8d4a574b4e 37 return this;
Osamu Nakamura 0:2f8d4a574b4e 38 }
Osamu Nakamura 0:2f8d4a574b4e 39 void release() {
Osamu Nakamura 0:2f8d4a574b4e 40 count_--;
Osamu Nakamura 0:2f8d4a574b4e 41 if (count_ == 0) {
Osamu Nakamura 0:2f8d4a574b4e 42 count_ = 0xDEADF001;
Osamu Nakamura 0:2f8d4a574b4e 43 delete this;
Osamu Nakamura 0:2f8d4a574b4e 44 }
Osamu Nakamura 0:2f8d4a574b4e 45 }
Osamu Nakamura 0:2f8d4a574b4e 46
Osamu Nakamura 0:2f8d4a574b4e 47
Osamu Nakamura 0:2f8d4a574b4e 48 /* return the current count for denugging purposes or similar */
Osamu Nakamura 0:2f8d4a574b4e 49 int count() const {
Osamu Nakamura 0:2f8d4a574b4e 50 return count_;
Osamu Nakamura 0:2f8d4a574b4e 51 }
Osamu Nakamura 0:2f8d4a574b4e 52 };
Osamu Nakamura 0:2f8d4a574b4e 53
Osamu Nakamura 0:2f8d4a574b4e 54 /* counting reference to reference-counted objects */
Osamu Nakamura 0:2f8d4a574b4e 55 template<typename T> class Ref {
Osamu Nakamura 0:2f8d4a574b4e 56 private:
Osamu Nakamura 0:2f8d4a574b4e 57 public:
Osamu Nakamura 0:2f8d4a574b4e 58 T *object_;
Osamu Nakamura 0:2f8d4a574b4e 59 explicit Ref(T *o = 0) :
Osamu Nakamura 0:2f8d4a574b4e 60 object_(0) {
Osamu Nakamura 0:2f8d4a574b4e 61 reset(o);
Osamu Nakamura 0:2f8d4a574b4e 62 }
Osamu Nakamura 0:2f8d4a574b4e 63 Ref(const Ref &other) :
Osamu Nakamura 0:2f8d4a574b4e 64 object_(0) {
Osamu Nakamura 0:2f8d4a574b4e 65 reset(other.object_);
Osamu Nakamura 0:2f8d4a574b4e 66 }
Osamu Nakamura 0:2f8d4a574b4e 67
Osamu Nakamura 0:2f8d4a574b4e 68 template<class Y>
Osamu Nakamura 0:2f8d4a574b4e 69 Ref(const Ref<Y> &other) :
Osamu Nakamura 0:2f8d4a574b4e 70 object_(0) {
Osamu Nakamura 0:2f8d4a574b4e 71 reset(other.object_);
Osamu Nakamura 0:2f8d4a574b4e 72 }
Osamu Nakamura 0:2f8d4a574b4e 73
Osamu Nakamura 0:2f8d4a574b4e 74 ~Ref() {
Osamu Nakamura 0:2f8d4a574b4e 75 if (object_) {
Osamu Nakamura 0:2f8d4a574b4e 76 object_->release();
Osamu Nakamura 0:2f8d4a574b4e 77 }
Osamu Nakamura 0:2f8d4a574b4e 78 }
Osamu Nakamura 0:2f8d4a574b4e 79
Osamu Nakamura 0:2f8d4a574b4e 80 void reset(T *o) {
Osamu Nakamura 0:2f8d4a574b4e 81 if (o) {
Osamu Nakamura 0:2f8d4a574b4e 82 o->retain();
Osamu Nakamura 0:2f8d4a574b4e 83 }
Osamu Nakamura 0:2f8d4a574b4e 84 if (object_ != 0) {
Osamu Nakamura 0:2f8d4a574b4e 85 object_->release();
Osamu Nakamura 0:2f8d4a574b4e 86 }
Osamu Nakamura 0:2f8d4a574b4e 87 object_ = o;
Osamu Nakamura 0:2f8d4a574b4e 88 }
Osamu Nakamura 0:2f8d4a574b4e 89 Ref& operator=(const Ref &other) {
Osamu Nakamura 0:2f8d4a574b4e 90 reset(other.object_);
Osamu Nakamura 0:2f8d4a574b4e 91 return *this;
Osamu Nakamura 0:2f8d4a574b4e 92 }
Osamu Nakamura 0:2f8d4a574b4e 93 template<class Y>
Osamu Nakamura 0:2f8d4a574b4e 94 Ref& operator=(const Ref<Y> &other) {
Osamu Nakamura 0:2f8d4a574b4e 95 reset(other.object_);
Osamu Nakamura 0:2f8d4a574b4e 96 return *this;
Osamu Nakamura 0:2f8d4a574b4e 97 }
Osamu Nakamura 0:2f8d4a574b4e 98 Ref& operator=(T* o) {
Osamu Nakamura 0:2f8d4a574b4e 99 reset(o);
Osamu Nakamura 0:2f8d4a574b4e 100 return *this;
Osamu Nakamura 0:2f8d4a574b4e 101 }
Osamu Nakamura 0:2f8d4a574b4e 102 template<class Y>
Osamu Nakamura 0:2f8d4a574b4e 103 Ref& operator=(Y* o) {
Osamu Nakamura 0:2f8d4a574b4e 104 reset(o);
Osamu Nakamura 0:2f8d4a574b4e 105 return *this;
Osamu Nakamura 0:2f8d4a574b4e 106 }
Osamu Nakamura 0:2f8d4a574b4e 107
Osamu Nakamura 0:2f8d4a574b4e 108 T& operator*() {
Osamu Nakamura 0:2f8d4a574b4e 109 return *object_;
Osamu Nakamura 0:2f8d4a574b4e 110 }
Osamu Nakamura 0:2f8d4a574b4e 111 T* operator->() const {
Osamu Nakamura 0:2f8d4a574b4e 112 return object_;
Osamu Nakamura 0:2f8d4a574b4e 113 }
Osamu Nakamura 0:2f8d4a574b4e 114 operator T*() const {
Osamu Nakamura 0:2f8d4a574b4e 115 return object_;
Osamu Nakamura 0:2f8d4a574b4e 116 }
Osamu Nakamura 0:2f8d4a574b4e 117
Osamu Nakamura 0:2f8d4a574b4e 118 bool operator==(const T* that) {
Osamu Nakamura 0:2f8d4a574b4e 119 return object_ == that;
Osamu Nakamura 0:2f8d4a574b4e 120 }
Osamu Nakamura 0:2f8d4a574b4e 121 bool operator==(const Ref &other) const {
Osamu Nakamura 0:2f8d4a574b4e 122 return object_ == other.object_ || *object_ == *(other.object_);
Osamu Nakamura 0:2f8d4a574b4e 123 }
Osamu Nakamura 0:2f8d4a574b4e 124 template<class Y>
Osamu Nakamura 0:2f8d4a574b4e 125 bool operator==(const Ref<Y> &other) const {
Osamu Nakamura 0:2f8d4a574b4e 126 return object_ == other.object_ || *object_ == *(other.object_);
Osamu Nakamura 0:2f8d4a574b4e 127 }
Osamu Nakamura 0:2f8d4a574b4e 128
Osamu Nakamura 0:2f8d4a574b4e 129 bool operator!=(const T* that) {
Osamu Nakamura 0:2f8d4a574b4e 130 return !(*this == that);
Osamu Nakamura 0:2f8d4a574b4e 131 }
Osamu Nakamura 0:2f8d4a574b4e 132
Osamu Nakamura 0:2f8d4a574b4e 133 bool empty() const {
Osamu Nakamura 0:2f8d4a574b4e 134 return object_ == 0;
Osamu Nakamura 0:2f8d4a574b4e 135 }
Osamu Nakamura 0:2f8d4a574b4e 136 };
Osamu Nakamura 0:2f8d4a574b4e 137
Osamu Nakamura 0:2f8d4a574b4e 138 }
Osamu Nakamura 0:2f8d4a574b4e 139
Osamu Nakamura 0:2f8d4a574b4e 140 #endif // __COUNTED_H__