This is a fork due to permission issues

Dependencies:   mbed Socket lwip-eth lwip-sys lwip

Fork of 6_songs-from-the-cloud by MakingMusicWorkshop

Committer:
maclobdell
Date:
Wed May 18 19:06:32 2016 +0000
Revision:
0:f7c60d3e7b8a
clean version

Who changed what in which revision?

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