OpenMW
|
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