diff --git a/apps/openmw/mwworld/containerstore.hpp b/apps/openmw/mwworld/containerstore.hpp index 55bfc7ddb..9fcdb99c6 100644 --- a/apps/openmw/mwworld/containerstore.hpp +++ b/apps/openmw/mwworld/containerstore.hpp @@ -4,11 +4,33 @@ #include #include "refdata.hpp" +#include "ptr.hpp" namespace MWWorld { - struct ContainerStore + class ContainerStoreIterator; + + class ContainerStore { + public: + + static const int Type_Potion = 0x0001; + static const int Type_Apparatus = 0x0002; + static const int Type_Armor = 0x0004; + static const int Type_Book = 0x0008; + static const int Type_Clothing = 0x0010; + static const int Type_Ingredient = 0x0020; + static const int Type_Light = 0x0040; + static const int Type_Lockpick = 0x0080; + static const int Type_Miscellaneous = 0x0100; + static const int Type_Probe = 0x0200; + static const int Type_Repair = 0x0400; + static const int Type_Weapon = 0x0800; + + static const int Type_Last = Type_Weapon; + + static const int Type_All = 0xffff; + ESMS::CellRefList potions; ESMS::CellRefList appas; ESMS::CellRefList armors; @@ -21,7 +43,78 @@ namespace MWWorld ESMS::CellRefList probes; ESMS::CellRefList repairs; ESMS::CellRefList weapons; + + ContainerStoreIterator begin (int mask = Type_All); + + ContainerStoreIterator end(); + + friend class ContainerStoreIterator; }; + + /// \brief Iteration over a subset of objects in a ContainerStore + /// + /// \note The iterator will automatically skip over deleted objects. + class ContainerStoreIterator + { + int mType; + int mMask; + ContainerStore *mContainer; + mutable Ptr mPtr; + + ESMS::CellRefList::List::iterator mPotion; + ESMS::CellRefList::List::iterator mApparatus; + ESMS::CellRefList::List::iterator mArmor; + ESMS::CellRefList::List::iterator mBook; + ESMS::CellRefList::List::iterator mClothing; + ESMS::CellRefList::List::iterator mIngredient; + ESMS::CellRefList::List::iterator mLight; + ESMS::CellRefList::List::iterator mLockpick; + ESMS::CellRefList::List::iterator mMiscellaneous; + ESMS::CellRefList::List::iterator mProbe; + ESMS::CellRefList::List::iterator mRepair; + ESMS::CellRefList::List::iterator mWeapon; + + private: + + ContainerStoreIterator(); + ///< End-iterator + + ContainerStoreIterator (int mask, ContainerStore *container); + ///< Begin-iterator + + void incType(); + + void nextType(); + + bool resetIterator(); + ///< Reset iterator for selected type. + /// + /// \return Type not empty? + + bool incIterator(); + ///< Increment iterator for selected type. + /// + /// \return reached the end? + + public: + + Ptr *operator->() const; + + Ptr operator*() const; + + ContainerStoreIterator& operator++(); + + ContainerStoreIterator operator++ (int); + + bool isEqual (const ContainerStoreIterator& iter) const; + + int getType() const; + + friend class ContainerStore; + }; + + bool operator== (const ContainerStoreIterator& left, const ContainerStoreIterator& right); + bool operator!= (const ContainerStoreIterator& left, const ContainerStoreIterator& right); } #endif