00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CAELUM__OWNED_PTR_H
00022 #define CAELUM__OWNED_PTR_H
00023
00024 #include "CaelumPrerequisites.h"
00025
00026 namespace Caelum
00027 {
00036 template<class PointedT>
00037 struct DefaultOwnedPtrTraits
00038 {
00040 typedef PointedT* InnerPointerType;
00041
00043 static inline const InnerPointerType getNullValue() {
00044 return 0;
00045 }
00046
00048 static inline PointedT* getPointer (const InnerPointerType& inner) {
00049 return inner;
00050 }
00051
00053 static void destroy (InnerPointerType& inner)
00054 {
00055 delete inner;
00056 inner = 0;
00057 }
00058 };
00059
00080 template<class PointedT, typename TraitsT = DefaultOwnedPtrTraits<PointedT> >
00081 class OwnedPtr
00082 {
00083 private:
00085 typedef typename TraitsT::InnerPointerType InnerPointerType;
00086
00088 InnerPointerType mInner;
00089
00090 public:
00094 void reset (const InnerPointerType& newInner = TraitsT::getNullValue()) {
00095 if (mInner == newInner) {
00096 return;
00097 }
00098 TraitsT::destroy (mInner);
00099 mInner = newInner;
00100 }
00101
00104 OwnedPtr() { mInner = TraitsT::getNullValue (); }
00105
00108 ~OwnedPtr() { setNull(); }
00109
00112 OwnedPtr(OwnedPtr& rhs)
00113 {
00114 if (&rhs != this) {
00115 this->reset (rhs.mInner);
00116 rhs.mInner = TraitsT::getNullValue ();
00117 }
00118 }
00119
00122 const OwnedPtr& operator=(OwnedPtr& rhs)
00123 {
00124 if (&rhs != this) {
00125 this->reset (rhs.mInner);
00126 rhs.mInner = TraitsT::getNullValue ();
00127 }
00128 return *this;
00129 }
00130
00132 bool isNull () const { return mInner != TraitsT::getNullValue (); }
00133
00135 void setNull () { TraitsT::destroy (mInner); }
00136
00137 PointedT* getPointer () const { return TraitsT::getPointer (mInner); }
00138 PointedT* get () const { return getPointer (); }
00139 PointedT* operator-> () const { return getPointer (); }
00140 PointedT& operator* () const{ return *getPointer (); }
00141 };
00142
00146 template<class MovableT>
00147 struct MovableObjectOwnedPtrTraits: public DefaultOwnedPtrTraits<MovableT>
00148 {
00149 typedef MovableT* InnerPointerType;
00150
00151 static void destroy (InnerPointerType& inner)
00152 {
00153 if (inner != 0) {
00154
00155
00156 inner->_getManager ()->destroyMovableObject (inner);
00157 inner = 0;
00158 }
00159 }
00160 };
00161
00162 typedef OwnedPtr<Ogre::MovableObject, MovableObjectOwnedPtrTraits<Ogre::MovableObject> > MovableObjectPtr;
00163 typedef OwnedPtr<Ogre::BillboardChain, MovableObjectOwnedPtrTraits<Ogre::BillboardChain> > BillboardChainPtr;
00164 typedef OwnedPtr<Ogre::BillboardSet, MovableObjectOwnedPtrTraits<Ogre::BillboardSet> > BillboardSetPtr;
00165 typedef OwnedPtr<Ogre::Entity, MovableObjectOwnedPtrTraits<Ogre::Entity> > EntityPtr;
00166 typedef OwnedPtr<Ogre::Light, MovableObjectOwnedPtrTraits<Ogre::Light> > LightPtr;
00167 typedef OwnedPtr<Ogre::ManualObject, MovableObjectOwnedPtrTraits<Ogre::ManualObject> > ManualObjectPtr;
00168 typedef OwnedPtr<Ogre::ParticleSystem, MovableObjectOwnedPtrTraits<Ogre::ParticleSystem> > ParticleSystemPtr;
00169
00174 struct SceneNodeOwnedPtrTraits: public DefaultOwnedPtrTraits<Ogre::SceneNode>
00175 {
00176 static void destroy (InnerPointerType& inner)
00177 {
00178 if (inner) {
00179
00180
00181 inner->getCreator ()->destroySceneNode (inner->getName ());
00182 inner = 0;
00183 }
00184 }
00185 };
00186
00187 typedef OwnedPtr<Ogre::SceneNode, SceneNodeOwnedPtrTraits> SceneNodePtr;
00188
00206 template<class PointedT, class InnerT, class ManagerT>
00207 struct OwnedResourcePtrTraits
00208 {
00209 typedef InnerT InnerPointerType;
00210
00211 static const InnerT getNullValue () {
00212 return InnerT();
00213 }
00214
00215 static PointedT* getPointer (const InnerPointerType& inner) {
00216 return inner.getPointer ();
00217 }
00218
00219 static void destroy (InnerPointerType& inner) {
00220 if (!inner.isNull ()) {
00221
00222
00223 ManagerT::getSingletonPtr ()->remove (inner->getHandle ());
00224 assert (inner.unique () && "Resource pointer not unique after destruction");
00225 }
00226 }
00227 };
00228
00229 typedef OwnedPtr <
00230 Ogre::Material,
00231 OwnedResourcePtrTraits <
00232 Ogre::Material,
00233 Ogre::MaterialPtr,
00234 Ogre::MaterialManager
00235 >
00236 > OwnedMaterialPtr;
00237
00238 typedef OwnedPtr <
00239 Ogre::Mesh,
00240 OwnedResourcePtrTraits <
00241 Ogre::Mesh,
00242 Ogre::MeshPtr,
00243 Ogre::MeshManager
00244 >
00245 > OwnedMeshPtr;
00246 }
00247
00248 #endif // CAELUM__OWNED_PTR_H