![](/media/cache/profiles/debfdc81854eac26ec993b55a659c6e1.jpg.50x50_q85.jpg)
mbed client lightswitch demo
Dependencies: mbed Socket lwip-eth lwip-sys lwip
Fork of mbed-client-classic-example-lwip by
mbed-client/source/include/smartpointer.h
- Committer:
- mbedAustin
- Date:
- 2016-06-09
- Revision:
- 11:cada08fc8a70
File content as of revision 11:cada08fc8a70:
/* * Copyright (c) 2015 ARM Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * 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. */ #ifndef SMART_POINTER_H #define SMART_POINTER_H class ReferenceCount { private: int _count; // Reference count public: void add_ref() { // Increment the reference count _count++; } int release() { // Decrement the reference count and // return the reference count. return --_count; } }; template < typename T > class SmartPointer { private: T *_data; // Generic pointer to be stored ReferenceCount *_reference; // Reference count public: SmartPointer() : _data(0), _reference(0) { // Create a new reference _reference = new ReferenceCount(); // Increment the reference count _reference->add_ref(); } SmartPointer(T* value) : _data(value), _reference(0) { // Create a new reference _reference = new ReferenceCount(); // Increment the reference count _reference->add_ref(); } SmartPointer(const SmartPointer<T>& smart_pointer) : _data(smart_pointer._data), reference(smart_pointer._reference) { // Copy constructor // Copy the data and reference pointer // and increment the reference count _reference->add_ref(); } ~SmartPointer() { if(_reference->release() == 0) { delete _data; delete _reference; } } T& operator* () { return *_data; } T* operator-> () { return _data; } SmartPointer<T>& operator = (const SmartPointer<T>& smart_pointer) { // Assignment operator if (this != &SmartPointer) { // Avoid self assignment // Decrement the old reference count // if reference become zero delete the old data if(_reference->release() == 0) { delete _data; delete _reference; } // Copy the data and reference pointer // and increment the reference count _data = SmartPointer._data; _reference = SmartPointer._reference; _reference->add_ref(); } return *this; } }; #endif // SMART_POINTER_H