00001 /* ***** BEGIN LICENSE BLOCK ***** 00002 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 00003 * 00004 * The contents of this file are subject to the Mozilla Public License Version 00005 * 1.1 (the "License"); you may not use this file except in compliance with 00006 * the License. You may obtain a copy of the License at 00007 * http://www.mozilla.org/MPL/ 00008 * 00009 * Software distributed under the License is distributed on an "AS IS" basis, 00010 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 00011 * for the specific language governing rights and limitations under the 00012 * License. 00013 * 00014 * The Original Code is OffscreenGecko code. 00015 * 00016 * The Initial Developer of the Original Code is 00017 * Frank Richter <frank.richter@gmail.com>. 00018 * Portions created by the Initial Developer are Copyright (C) 2007 00019 * the Initial Developer. All Rights Reserved. 00020 * 00021 * Contributor(s): 00022 * 00023 * Alternatively, the contents of this file may be used under the terms of 00024 * either the GNU General Public License Version 2 or later (the "GPL"), or 00025 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 00026 * in which case the provisions of the GPL or the LGPL are applicable instead 00027 * of those above. If you wish to allow use of your version of this file only 00028 * under the terms of either the GPL or the LGPL, and not to allow others to 00029 * use your version of this file under the terms of the MPL, indicate your 00030 * decision by deleting the provisions above and replace them with the notice 00031 * and other provisions required by the GPL or the LGPL. If you do not delete 00032 * the provisions above, a recipient may use your version of this file under 00033 * the terms of any one of the MPL, the GPL or the LGPL. 00034 * 00035 * ***** END LICENSE BLOCK ***** */ 00036 00037 #ifndef __OFFSCREENGECKO_BASEOBJ_H__ 00038 #define __OFFSCREENGECKO_BASEOBJ_H__ 00039 00044 #include "defs.h" 00045 00119 typedef struct OSGK_BaseObject_s 00120 { 00121 #ifdef OSGK_BUILD 00123 int refCount; 00124 #else 00125 # ifndef __cplusplus 00126 int reserved; 00127 # endif 00128 #endif 00129 } 00130 OSGK_BaseObject; 00133 #define OSGK_DERIVEDTYPE(T) \ 00134 typedef struct T ## _s { \ 00135 OSGK_BaseObject baseobj; \ 00136 } T 00137 00142 OSGK_EXTERN_C OSGK_API int osgk_addref (OSGK_BaseObject* obj); 00143 00145 OSGK_EXTERN_C OSGK_API int osgk_release (OSGK_BaseObject* obj); 00146 00147 #ifndef OSGK___DOXYRUN__ 00148 static OSGK_INLINE int osgk_addref_real (OSGK_BaseObject* obj) 00149 { 00150 return osgk_addref (obj); 00151 } 00152 00153 static OSGK_INLINE int osgk_release_real (OSGK_BaseObject* obj) 00154 { 00155 return osgk_release (obj); 00156 } 00157 00158 #define osgk_addref(obj) osgk_addref_real (&((obj)->baseobj)) 00159 #define osgk_release(obj) osgk_release_real (&((obj)->baseobj)) 00160 #endif // OSGK___DOXYRUN__ 00161 00162 #ifdef __cplusplus 00163 namespace OSGK 00164 { 00165 namespace CXXAPI 00166 { 00170 template<typename T> 00171 class Wrap 00172 { 00173 public: 00174 typedef T WrappedType; 00175 typedef Wrap WrapperType; 00176 protected: 00178 T* obj; 00179 public: 00184 static WrappedType* Null() { return 0; } 00185 00187 explicit Wrap (T* obj) : obj (obj) {} 00189 Wrap (const Wrap& other) : obj (other.obj) 00190 { 00191 if (obj != 0) osgk_addref (obj); 00192 } 00194 ~Wrap() 00195 { 00196 if (obj != 0) osgk_release (obj); 00197 } 00199 Wrap& operator=(const Wrap& other) 00200 { 00201 if (other.obj != 0) osgk_addref (other.obj); 00202 if (obj != 0) osgk_release (obj); 00203 obj = other.obj; 00204 return *this; 00205 } 00206 00208 bool IsValid() const { return obj != 0; } 00210 void Invalidate() { *this = Wrap (Null()); } 00211 00218 void SetObject (T* obj) { this->obj = obj; } 00220 T* GetObject() const { return obj; } 00229 T* Detach() 00230 { 00231 T* ret = obj; 00232 obj = 0; 00233 return ret; 00234 } 00235 }; 00236 } // namespace CXXAPI 00237 } // namespace OSGK 00238 #endif 00239 00240 00241 #endif // __OFFSCREENGECKO_BASEOBJ_H__