OpenMW
apps/openmw/mwworld/ptr.hpp
Go to the documentation of this file.
00001 #ifndef GAME_MWWORLD_PTR_H
00002 #define GAME_MWWORLD_PTR_H
00003 
00004 #include "cellstore.hpp"
00005 #include "livecellref.hpp"
00006 
00007 namespace MWWorld
00008 {
00009     class ContainerStore;
00010 
00012 
00013     class Ptr
00014     {
00015         public:
00016 
00017             typedef MWWorld::CellStore CellStore;
00019 
00020             MWWorld::LiveCellRefBase *mRef;
00021             CellStore *mCell;
00022             ContainerStore *mContainerStore;
00023 
00024         public:
00025             Ptr(MWWorld::LiveCellRefBase *liveCellRef=0, CellStore *cell=0)
00026               : mRef(liveCellRef), mCell(cell), mContainerStore(0)
00027             {
00028             }
00029 
00030             bool isEmpty() const
00031             {
00032                 return mRef == 0;
00033             }
00034 
00035             const std::string& getTypeName() const;
00036 
00037             const Class& getClass() const
00038             {
00039                 if(mRef != 0)
00040                     return *(mRef->mClass);
00041                 throw std::runtime_error("Cannot get class of an empty object");
00042             }
00043 
00044             template<typename T>
00045             MWWorld::LiveCellRef<T> *get() const
00046             {
00047                 MWWorld::LiveCellRef<T> *ref = dynamic_cast<MWWorld::LiveCellRef<T>*>(mRef);
00048                 if(ref) return ref;
00049 
00050                 std::stringstream str;
00051                 str<< "Bad LiveCellRef cast to "<<typeid(T).name()<<" from ";
00052                 if(mRef != 0) str<< getTypeName();
00053                 else str<< "an empty object";
00054 
00055                 throw std::runtime_error(str.str());
00056             }
00057 
00058             ESM::CellRef& getCellRef() const;
00059 
00060             RefData& getRefData() const;
00061 
00062             Ptr::CellStore *getCell() const
00063             {
00064                 assert(mCell);
00065                 return mCell;
00066             }
00067 
00068             bool isInCell() const
00069             {
00070                 return (mContainerStore == 0) && (mCell != 0);
00071             }
00072 
00073             void setContainerStore (ContainerStore *store);
00075 
00076             ContainerStore *getContainerStore() const;
00078     };
00079 
00080     inline bool operator== (const Ptr& left, const Ptr& right)
00081     {
00082         return left.mRef==right.mRef;
00083     }
00084 
00085     inline bool operator!= (const Ptr& left, const Ptr& right)
00086     {
00087         return !(left==right);
00088     }
00089 
00090     inline bool operator< (const Ptr& left, const Ptr& right)
00091     {
00092         return left.mRef<right.mRef;
00093     }
00094 
00095     inline bool operator>= (const Ptr& left, const Ptr& right)
00096     {
00097         return !(left<right);
00098     }
00099 
00100     inline bool operator> (const Ptr& left, const Ptr& right)
00101     {
00102         return right<left;
00103     }
00104 
00105     inline bool operator<= (const Ptr& left, const Ptr& right)
00106     {
00107         return !(left>right);
00108     }
00109 }
00110 
00111 #endif