leo hendrickson / Mbed OS example-Ethernet-mbed-Cloud-connect
Committer:
leothedragon
Date:
Tue May 04 08:55:12 2021 +0000
Revision:
0:8f0bb79ddd48
nmn

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leothedragon 0:8f0bb79ddd48 1 /*
leothedragon 0:8f0bb79ddd48 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
leothedragon 0:8f0bb79ddd48 3 * SPDX-License-Identifier: Apache-2.0
leothedragon 0:8f0bb79ddd48 4 * Licensed under the Apache License, Version 2.0 (the License); you may
leothedragon 0:8f0bb79ddd48 5 * not use this file except in compliance with the License.
leothedragon 0:8f0bb79ddd48 6 * You may obtain a copy of the License at
leothedragon 0:8f0bb79ddd48 7 *
leothedragon 0:8f0bb79ddd48 8 * http://www.apache.org/licenses/LICENSE-2.0
leothedragon 0:8f0bb79ddd48 9 *
leothedragon 0:8f0bb79ddd48 10 * Unless required by applicable law or agreed to in writing, software
leothedragon 0:8f0bb79ddd48 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
leothedragon 0:8f0bb79ddd48 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
leothedragon 0:8f0bb79ddd48 13 * See the License for the specific language governing permissions and
leothedragon 0:8f0bb79ddd48 14 * limitations under the License.
leothedragon 0:8f0bb79ddd48 15 */
leothedragon 0:8f0bb79ddd48 16 #ifndef SMART_POINTER_H
leothedragon 0:8f0bb79ddd48 17 #define SMART_POINTER_H
leothedragon 0:8f0bb79ddd48 18
leothedragon 0:8f0bb79ddd48 19 class ReferenceCount
leothedragon 0:8f0bb79ddd48 20 {
leothedragon 0:8f0bb79ddd48 21 private:
leothedragon 0:8f0bb79ddd48 22
leothedragon 0:8f0bb79ddd48 23 int _count; // Reference count
leothedragon 0:8f0bb79ddd48 24
leothedragon 0:8f0bb79ddd48 25 public:
leothedragon 0:8f0bb79ddd48 26
leothedragon 0:8f0bb79ddd48 27 void add_ref()
leothedragon 0:8f0bb79ddd48 28 {
leothedragon 0:8f0bb79ddd48 29 // Increment the reference count
leothedragon 0:8f0bb79ddd48 30 _count++;
leothedragon 0:8f0bb79ddd48 31 }
leothedragon 0:8f0bb79ddd48 32
leothedragon 0:8f0bb79ddd48 33 int release()
leothedragon 0:8f0bb79ddd48 34 {
leothedragon 0:8f0bb79ddd48 35 // Decrement the reference count and
leothedragon 0:8f0bb79ddd48 36 // return the reference count.
leothedragon 0:8f0bb79ddd48 37 return --_count;
leothedragon 0:8f0bb79ddd48 38 }
leothedragon 0:8f0bb79ddd48 39 };
leothedragon 0:8f0bb79ddd48 40
leothedragon 0:8f0bb79ddd48 41 template < typename T > class SmartPointer
leothedragon 0:8f0bb79ddd48 42 {
leothedragon 0:8f0bb79ddd48 43 private:
leothedragon 0:8f0bb79ddd48 44
leothedragon 0:8f0bb79ddd48 45 T *_data; // Generic pointer to be stored
leothedragon 0:8f0bb79ddd48 46 ReferenceCount *_reference; // Reference count
leothedragon 0:8f0bb79ddd48 47
leothedragon 0:8f0bb79ddd48 48
leothedragon 0:8f0bb79ddd48 49 public:
leothedragon 0:8f0bb79ddd48 50
leothedragon 0:8f0bb79ddd48 51 SmartPointer()
leothedragon 0:8f0bb79ddd48 52 : _data(0), _reference(0)
leothedragon 0:8f0bb79ddd48 53 {
leothedragon 0:8f0bb79ddd48 54 // Create a new reference
leothedragon 0:8f0bb79ddd48 55 _reference = new ReferenceCount();
leothedragon 0:8f0bb79ddd48 56 // Increment the reference count
leothedragon 0:8f0bb79ddd48 57 _reference->add_ref();
leothedragon 0:8f0bb79ddd48 58 }
leothedragon 0:8f0bb79ddd48 59
leothedragon 0:8f0bb79ddd48 60 SmartPointer(T* value)
leothedragon 0:8f0bb79ddd48 61 : _data(value), _reference(0)
leothedragon 0:8f0bb79ddd48 62 {
leothedragon 0:8f0bb79ddd48 63 // Create a new reference
leothedragon 0:8f0bb79ddd48 64 _reference = new ReferenceCount();
leothedragon 0:8f0bb79ddd48 65 // Increment the reference count
leothedragon 0:8f0bb79ddd48 66 _reference->add_ref();
leothedragon 0:8f0bb79ddd48 67 }
leothedragon 0:8f0bb79ddd48 68
leothedragon 0:8f0bb79ddd48 69 SmartPointer(const SmartPointer<T>& smart_pointer)
leothedragon 0:8f0bb79ddd48 70 : _data(smart_pointer._data), reference(smart_pointer._reference)
leothedragon 0:8f0bb79ddd48 71 {
leothedragon 0:8f0bb79ddd48 72 // Copy constructor
leothedragon 0:8f0bb79ddd48 73 // Copy the data and reference pointer
leothedragon 0:8f0bb79ddd48 74 // and increment the reference count
leothedragon 0:8f0bb79ddd48 75 _reference->add_ref();
leothedragon 0:8f0bb79ddd48 76 }
leothedragon 0:8f0bb79ddd48 77
leothedragon 0:8f0bb79ddd48 78 ~SmartPointer()
leothedragon 0:8f0bb79ddd48 79 {
leothedragon 0:8f0bb79ddd48 80 if(_reference->release() == 0) {
leothedragon 0:8f0bb79ddd48 81 delete _data;
leothedragon 0:8f0bb79ddd48 82 delete _reference;
leothedragon 0:8f0bb79ddd48 83 }
leothedragon 0:8f0bb79ddd48 84 }
leothedragon 0:8f0bb79ddd48 85
leothedragon 0:8f0bb79ddd48 86 T& operator* ()
leothedragon 0:8f0bb79ddd48 87 {
leothedragon 0:8f0bb79ddd48 88 return *_data;
leothedragon 0:8f0bb79ddd48 89 }
leothedragon 0:8f0bb79ddd48 90
leothedragon 0:8f0bb79ddd48 91 T* operator-> ()
leothedragon 0:8f0bb79ddd48 92 {
leothedragon 0:8f0bb79ddd48 93 return _data;
leothedragon 0:8f0bb79ddd48 94 }
leothedragon 0:8f0bb79ddd48 95
leothedragon 0:8f0bb79ddd48 96 SmartPointer<T>& operator = (const SmartPointer<T>& smart_pointer)
leothedragon 0:8f0bb79ddd48 97 {
leothedragon 0:8f0bb79ddd48 98 // Assignment operator
leothedragon 0:8f0bb79ddd48 99 if (this != &SmartPointer) { // Avoid self assignment
leothedragon 0:8f0bb79ddd48 100 // Decrement the old reference count
leothedragon 0:8f0bb79ddd48 101 // if reference become zero delete the old data
leothedragon 0:8f0bb79ddd48 102 if(_reference->release() == 0) {
leothedragon 0:8f0bb79ddd48 103 delete _data;
leothedragon 0:8f0bb79ddd48 104 delete _reference;
leothedragon 0:8f0bb79ddd48 105 }
leothedragon 0:8f0bb79ddd48 106
leothedragon 0:8f0bb79ddd48 107 // Copy the data and reference pointer
leothedragon 0:8f0bb79ddd48 108 // and increment the reference count
leothedragon 0:8f0bb79ddd48 109 _data = SmartPointer._data;
leothedragon 0:8f0bb79ddd48 110 _reference = SmartPointer._reference;
leothedragon 0:8f0bb79ddd48 111 _reference->add_ref();
leothedragon 0:8f0bb79ddd48 112 }
leothedragon 0:8f0bb79ddd48 113 return *this;
leothedragon 0:8f0bb79ddd48 114 }
leothedragon 0:8f0bb79ddd48 115
leothedragon 0:8f0bb79ddd48 116 };
leothedragon 0:8f0bb79ddd48 117
leothedragon 0:8f0bb79ddd48 118 #endif // SMART_POINTER_H