00001 /*MT* 00002 00003 MediaTomb - http://www.mediatomb.cc/ 00004 00005 ref.h - this file is part of MediaTomb. 00006 00007 Copyright (C) 2005 Gena Batyan <bgeradz@mediatomb.cc>, 00008 Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc> 00009 00010 Copyright (C) 2006-2010 Gena Batyan <bgeradz@mediatomb.cc>, 00011 Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc>, 00012 Leonhard Wimmer <leo@mediatomb.cc> 00013 00014 MediaTomb is free software; you can redistribute it and/or modify 00015 it under the terms of the GNU General Public License version 2 00016 as published by the Free Software Foundation. 00017 00018 MediaTomb is distributed in the hope that it will be useful, 00019 but WITHOUT ANY WARRANTY; without even the implied warranty of 00020 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00021 GNU General Public License for more details. 00022 00023 You should have received a copy of the GNU General Public License 00024 version 2 along with MediaTomb; if not, write to the Free Software 00025 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. 00026 00027 $Id: ref.h 2081 2010-03-23 20:18:00Z lww $ 00028 */ 00029 00031 00032 #ifndef __ZMM_REF_H__ 00033 #define __ZMM_REF_H__ 00034 00035 #include "nil.h" 00036 00037 namespace zmm 00038 { 00039 00040 template <class T> 00041 class Ref 00042 { 00043 public: 00044 Ref(const Ref& other) 00045 { 00046 _ptr = other._ptr; 00047 if(_ptr) 00048 _ptr->retain(); 00049 } 00050 explicit Ref(T* ptr = NULL) : _ptr(ptr) 00051 { 00052 if(ptr) 00053 ptr->retain(); 00054 } 00055 Ref(NIL_VAR) 00056 { 00057 _ptr = NULL; 00058 } 00059 ~Ref() 00060 { 00061 if(_ptr) 00062 _ptr->release(); 00063 } 00064 00065 Ref& operator=(const Ref& other) 00066 { 00067 if (this == &other) 00068 return *this; 00069 if(_ptr) 00070 _ptr->release(); 00071 _ptr = other._ptr; 00072 if(_ptr) 00073 _ptr->retain(); 00074 return *this; 00075 } 00076 inline Ref& operator=(NIL_VAR) 00077 { 00078 if(_ptr) 00079 _ptr->release(); 00080 _ptr = NULL; 00081 return *this; 00082 } 00083 00084 inline T& operator*() const 00085 { 00086 return *_ptr; 00087 } 00088 inline T* operator->() const 00089 { 00090 return _ptr; 00091 } 00092 inline T* getPtr() 00093 { 00094 return _ptr; 00095 } 00096 inline int operator==(NIL_VAR) 00097 { 00098 return (_ptr == NULL); 00099 } 00100 inline int operator!=(NIL_VAR) 00101 { 00102 return (_ptr != NULL); 00103 } 00104 inline int operator==(const Ref& other) 00105 { 00106 return (_ptr == other._ptr); 00107 } 00108 inline int operator!=(const Ref& other) 00109 { 00110 return (_ptr != other._ptr); 00111 } 00112 protected: 00113 T* _ptr; 00114 }; 00115 00116 } // namespace 00117 00118 #define RefCast(ref, klass) zmm::Ref<klass>((klass *)ref.getPtr()) 00119 00120 #endif // __ZMM_REF_H__
1.6.1