diff --git a/apps/openmw/mwclass/actor.cpp b/apps/openmw/mwclass/actor.cpp index ecf089b35..17af4725e 100644 --- a/apps/openmw/mwclass/actor.cpp +++ b/apps/openmw/mwclass/actor.cpp @@ -43,8 +43,8 @@ namespace MWClass void Actor::block(const MWWorld::Ptr &ptr) const { - MWWorld::InventoryStore& inv = getInventoryStore(ptr); - MWWorld::ContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); + const MWWorld::InventoryStore& inv = getInventoryStore(ptr); + MWWorld::ConstContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if (shield == inv.end()) return; diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index a1eb65154..f652cbd04 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -295,7 +295,7 @@ namespace MWClass std::pair Armor::canBeEquipped(const MWWorld::ConstPtr &ptr, const MWWorld::Ptr &npc) const { - MWWorld::InventoryStore& invStore = npc.getClass().getInventoryStore(npc); + const MWWorld::InventoryStore& invStore = npc.getClass().getInventoryStore(npc); if (ptr.getCellRef().getCharge() == 0) return std::make_pair(0, "#{sInventoryMessage1}"); @@ -332,7 +332,7 @@ namespace MWClass // If equipping a shield, check if there's a twohanded weapon conflicting with it if(*slot == MWWorld::InventoryStore::Slot_CarriedLeft) { - MWWorld::ContainerStoreIterator weapon = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + MWWorld::ConstContainerStoreIterator weapon = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); if(weapon == invStore.end()) return std::make_pair(1,""); diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index b0d3ca791..fe2899aff 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -139,7 +139,7 @@ namespace MWClass const std::string trapActivationSound = "Disarm Trap Fail"; MWWorld::Ptr player = MWBase::Environment::get().getWorld ()->getPlayerPtr(); - MWWorld::InventoryStore& invStore = player.getClass().getInventoryStore(player); + const MWWorld::InventoryStore& invStore = player.getClass().getInventoryStore(player); bool isLocked = ptr.getCellRef().getLockLevel() > 0; bool isTrapped = !ptr.getCellRef().getTrap().empty(); @@ -149,7 +149,7 @@ namespace MWClass // make key id lowercase std::string keyId = ptr.getCellRef().getKey(); Misc::StringUtils::lowerCaseInPlace(keyId); - for (MWWorld::ContainerStoreIterator it = invStore.begin(); it != invStore.end(); ++it) + for (MWWorld::ConstContainerStoreIterator it = invStore.cbegin(); it != invStore.cend(); ++it) { std::string refId = it->getCellRef().getRefId(); Misc::StringUtils::lowerCaseInPlace(refId); diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 0be61ef51..8c663474f 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -194,10 +194,10 @@ namespace MWClass // FIXME: use const version of InventoryStore functions once they are available if (ptr.getClass().hasInventoryStore(ptr)) { - MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore(ptr); + const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore(ptr); for (int slot = 0; slot < MWWorld::InventoryStore::Slots; ++slot) { - MWWorld::ContainerStoreIterator equipped = invStore.getSlot(slot); + MWWorld::ConstContainerStoreIterator equipped = invStore.getSlot(slot); if (equipped != invStore.end()) { model = equipped->getClass().getModel(*equipped); diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 21e191931..bc3455c65 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -109,7 +109,7 @@ namespace MWClass const std::string lockedSound = "LockedDoor"; const std::string trapActivationSound = "Disarm Trap Fail"; - MWWorld::ContainerStore &invStore = actor.getClass().getContainerStore(actor); + const MWWorld::ContainerStore &invStore = actor.getClass().getContainerStore(actor); bool isLocked = ptr.getCellRef().getLockLevel() > 0; bool isTrapped = !ptr.getCellRef().getTrap().empty(); @@ -133,7 +133,7 @@ namespace MWClass // make key id lowercase std::string keyId = ptr.getCellRef().getKey(); Misc::StringUtils::lowerCaseInPlace(keyId); - for (MWWorld::ContainerStoreIterator it = invStore.begin(); it != invStore.end(); ++it) + for (MWWorld::ConstContainerStoreIterator it = invStore.cbegin(); it != invStore.cend(); ++it) { std::string refId = it->getCellRef().getRefId(); Misc::StringUtils::lowerCaseInPlace(refId); diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index e74b9da88..ed69ee3ac 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -233,8 +233,8 @@ namespace MWClass if (!(ref->mBase->mData.mFlags & ESM::Light::Carry)) return std::make_pair(0,""); - MWWorld::InventoryStore& invStore = npc.getClass().getInventoryStore(npc); - MWWorld::ContainerStoreIterator weapon = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + const MWWorld::InventoryStore& invStore = npc.getClass().getInventoryStore(npc); + MWWorld::ConstContainerStoreIterator weapon = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); if(weapon == invStore.end()) return std::make_pair(1,""); diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index ba5353da2..38d288062 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -466,10 +466,10 @@ namespace MWClass // preload equipped items if (ptr.getClass().hasInventoryStore(ptr)) { - MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore(ptr); + const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore(ptr); for (int slot = 0; slot < MWWorld::InventoryStore::Slots; ++slot) { - MWWorld::ContainerStoreIterator equipped = invStore.getSlot(slot); + MWWorld::ConstContainerStoreIterator equipped = invStore.getSlot(slot); if (equipped != invStore.end()) { std::vector parts; @@ -1079,7 +1079,7 @@ namespace MWClass const MWWorld::Store &store = world->getStore().get(); MWMechanics::NpcStats &stats = getNpcStats(ptr); - MWWorld::InventoryStore &invStore = getInventoryStore(ptr); + const MWWorld::InventoryStore &invStore = getInventoryStore(ptr); float fUnarmoredBase1 = store.find("fUnarmoredBase1")->getFloat(); float fUnarmoredBase2 = store.find("fUnarmoredBase2")->getFloat(); @@ -1088,7 +1088,7 @@ namespace MWClass float ratings[MWWorld::InventoryStore::Slots]; for(int i = 0;i < MWWorld::InventoryStore::Slots;i++) { - MWWorld::ContainerStoreIterator it = invStore.getSlot(i); + MWWorld::ConstContainerStoreIterator it = invStore.getSlot(i); if (it == invStore.end() || it->getTypeName() != typeid(ESM::Armor).name()) { // unarmored @@ -1169,8 +1169,8 @@ namespace MWClass return ""; } - MWWorld::InventoryStore &inv = Npc::getInventoryStore(ptr); - MWWorld::ContainerStoreIterator boots = inv.getSlot(MWWorld::InventoryStore::Slot_Boots); + const MWWorld::InventoryStore &inv = Npc::getInventoryStore(ptr); + MWWorld::ConstContainerStoreIterator boots = inv.getSlot(MWWorld::InventoryStore::Slot_Boots); if(boots == inv.end() || boots->getTypeName() != typeid(ESM::Armor).name()) return (name == "left") ? "FootBareLeft" : "FootBareRight"; diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index d51918152..67bb53e71 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -344,13 +344,13 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con case SelectWrapper::Function_PcClothingModifier: { - MWWorld::InventoryStore& store = player.getClass().getInventoryStore (player); + const MWWorld::InventoryStore& store = player.getClass().getInventoryStore (player); int value = 0; for (int i=0; i<=15; ++i) // everything except things held in hands and ammunition { - MWWorld::ContainerStoreIterator slot = store.getSlot (i); + MWWorld::ConstContainerStoreIterator slot = store.getSlot (i); if (slot!=store.end()) value += slot->getClass().getValue (*slot); diff --git a/apps/openmw/mwgui/merchantrepair.cpp b/apps/openmw/mwgui/merchantrepair.cpp index 481e1ceb4..376fc7152 100644 --- a/apps/openmw/mwgui/merchantrepair.cpp +++ b/apps/openmw/mwgui/merchantrepair.cpp @@ -44,10 +44,10 @@ void MerchantRepair::startRepair(const MWWorld::Ptr &actor) MWWorld::Ptr player = MWMechanics::getPlayer(); int playerGold = player.getClass().getContainerStore(player).count(MWWorld::ContainerStore::sGoldId); - MWWorld::ContainerStore& store = player.getClass().getContainerStore(player); + const MWWorld::ContainerStore& store = player.getClass().getContainerStore(player); int categories = MWWorld::ContainerStore::Type_Weapon | MWWorld::ContainerStore::Type_Armor; - for (MWWorld::ContainerStoreIterator iter (store.begin(categories)); - iter!=store.end(); ++iter) + for (MWWorld::ConstContainerStoreIterator iter (store.cbegin(categories)); + iter!=store.cend(); ++iter) { if (iter->getClass().hasItemHealth(*iter)) { diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index 938574f83..061ac9eb6 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -310,7 +310,7 @@ namespace MWGui { MWWorld::Ptr item = *button->getUserData(); MWBase::Environment::get().getWindowManager()->useItem(item); - MWWorld::ContainerStoreIterator rightHand = store.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + MWWorld::ConstContainerStoreIterator rightHand = store.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); // change draw state only if the item is in player's right hand if (rightHand != store.end() && item == *rightHand) { diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 2383dde79..653f47d56 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -58,7 +58,7 @@ void adjustBoundItem (const std::string& item, bool bound, const MWWorld::Ptr& a MWWorld::Ptr newPtr = *store.MWWorld::ContainerStore::add(item, 1, actor); MWWorld::ActionEquip action(newPtr); action.execute(actor); - MWWorld::ContainerStoreIterator rightHand = store.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + MWWorld::ConstContainerStoreIterator rightHand = store.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); // change draw state only if the item is in player's right hand if (actor == MWMechanics::getPlayer() && rightHand != store.end() && newPtr == *rightHand) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 9fd37cc8e..4b54098a1 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1101,7 +1101,7 @@ bool CharacterController::updateWeaponState() if (mPtr.getClass().hasInventoryStore(mPtr)) { MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr); - MWWorld::ContainerStoreIterator weapon = getActiveWeapon(stats, inv, &weaptype); + MWWorld::ConstContainerStoreIterator weapon = getActiveWeapon(stats, inv, &weaptype); if(weapon != inv.end() && !(weaptype == WeapType_None && mWeaponType == WeapType_Spell)) { soundid = (weaptype == WeapType_None) ? @@ -1189,12 +1189,12 @@ bool CharacterController::updateWeaponState() if (mPtr.getClass().hasInventoryStore(mPtr)) { MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr); - MWWorld::ContainerStoreIterator weapon = getActiveWeapon(stats, inv, &weaptype); + MWWorld::ConstContainerStoreIterator weapon = getActiveWeapon(stats, inv, &weaptype); isWeapon = (weapon != inv.end() && weapon->getTypeName() == typeid(ESM::Weapon).name()); if(isWeapon) weapSpeed = weapon->get()->mBase->mData.mSpeed; - MWWorld::ContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); + MWWorld::ConstContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); if (mWeaponType == WeapType_Crossbow) ammunition = (ammo != inv.end() && ammo->get()->mBase->mData.mType == ESM::Weapon::Bolt); else if (mWeaponType == WeapType_BowAndArrow) @@ -1324,7 +1324,7 @@ bool CharacterController::updateWeaponState() { if (Settings::Manager::getBool("best attack", "Game")) { - MWWorld::ContainerStoreIterator weapon = mPtr.getClass().getInventoryStore(mPtr).getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + MWWorld::ConstContainerStoreIterator weapon = mPtr.getClass().getInventoryStore(mPtr).getSlot(MWWorld::InventoryStore::Slot_CarriedRight); mAttackType = getBestAttack(weapon->get()->mBase); } else @@ -1523,8 +1523,8 @@ bool CharacterController::updateWeaponState() if (mPtr.getClass().hasInventoryStore(mPtr)) { - MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); - MWWorld::ContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); + const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); + MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name() && updateCarriedLeftVisible(mWeaponType)) diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index f393f0619..9db127084 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -6,12 +6,12 @@ #include #include "../mwworld/ptr.hpp" +#include "../mwworld/containerstore.hpp" #include "../mwrender/animation.hpp" namespace MWWorld { - class ContainerStoreIterator; class InventoryStore; } diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index ab75ef128..ca5d40b4a 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1310,8 +1310,8 @@ namespace MWMechanics float bootWeight = 0; if (ptr.getClass().isNpc()) { - MWWorld::InventoryStore& inv = ptr.getClass().getInventoryStore(ptr); - MWWorld::ContainerStoreIterator it = inv.getSlot(MWWorld::InventoryStore::Slot_Boots); + const MWWorld::InventoryStore& inv = ptr.getClass().getInventoryStore(ptr); + MWWorld::ConstContainerStoreIterator it = inv.getSlot(MWWorld::InventoryStore::Slot_Boots); if (it != inv.end()) bootWeight = it->getClass().getWeight(*it); } diff --git a/apps/openmw/mwrender/actoranimation.cpp b/apps/openmw/mwrender/actoranimation.cpp index 75e56e9e7..d92b95a71 100644 --- a/apps/openmw/mwrender/actoranimation.cpp +++ b/apps/openmw/mwrender/actoranimation.cpp @@ -31,7 +31,8 @@ ActorAnimation::ActorAnimation(const MWWorld::Ptr& ptr, osg::ref_ptr { MWWorld::ContainerStore& store = mPtr.getClass().getContainerStore(mPtr); - for (MWWorld::ContainerStoreIterator iter = store.begin(MWWorld::ContainerStore::Type_Light); iter != store.end(); ++iter) + for (MWWorld::ConstContainerStoreIterator iter = store.cbegin(MWWorld::ContainerStore::Type_Light); + iter != store.cend(); ++iter) { const ESM::Light* light = iter->get()->mBase; if (!(light->mData.mFlags & ESM::Light::Carry)) diff --git a/apps/openmw/mwrender/characterpreview.cpp b/apps/openmw/mwrender/characterpreview.cpp index f412c1fac..84d7932d4 100644 --- a/apps/openmw/mwrender/characterpreview.cpp +++ b/apps/openmw/mwrender/characterpreview.cpp @@ -305,7 +305,7 @@ namespace MWRender mCurrentAnimGroup = groupname; mAnimation->play(mCurrentAnimGroup, 1, Animation::BlendMask_All, false, 1.0f, "start", "stop", 0.0f, 0); - MWWorld::ContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); + MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name() && showCarriedLeft) { if(!mAnimation->getInfo("torch")) diff --git a/apps/openmw/mwrender/creatureanimation.cpp b/apps/openmw/mwrender/creatureanimation.cpp index 24732f866..b105746c6 100644 --- a/apps/openmw/mwrender/creatureanimation.cpp +++ b/apps/openmw/mwrender/creatureanimation.cpp @@ -97,15 +97,15 @@ void CreatureWeaponAnimation::updatePart(PartHolderPtr& scene, int slot) if (!mObjectRoot) return; - MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); - MWWorld::ContainerStoreIterator it = inv.getSlot(slot); + const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); + MWWorld::ConstContainerStoreIterator it = inv.getSlot(slot); if (it == inv.end()) { scene.reset(); return; } - MWWorld::Ptr item = *it; + MWWorld::ConstPtr item = *it; std::string bonename; if (slot == MWWorld::InventoryStore::Slot_CarriedRight) @@ -134,7 +134,7 @@ void CreatureWeaponAnimation::updatePart(PartHolderPtr& scene, int slot) item.getTypeName() == typeid(ESM::Weapon).name() && item.get()->mBase->mData.mType == ESM::Weapon::MarksmanCrossbow) { - MWWorld::ContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); + MWWorld::ConstContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); if (ammo != inv.end() && ammo->get()->mBase->mData.mType == ESM::Weapon::Bolt) attachArrow(); else diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index 6ead1611e..1219f8920 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -558,10 +558,10 @@ void NpcAnimation::updateParts() bool wasArrowAttached = (mAmmunition.get() != NULL); mAmmunition.reset(); - MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); + const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); for(size_t i = 0;i < slotlistsize && mViewMode != VM_HeadOnly;i++) { - MWWorld::ContainerStoreIterator store = inv.getSlot(slotlist[i].mSlot); + MWWorld::ConstContainerStoreIterator store = inv.getSlot(slotlist[i].mSlot); removePartGroup(slotlist[i].mSlot); @@ -618,8 +618,8 @@ void NpcAnimation::updateParts() if(mPartPriorities[ESM::PRT_Shield] < 1) { - MWWorld::ContainerStoreIterator store = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); - MWWorld::Ptr part; + MWWorld::ConstContainerStoreIterator store = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); + MWWorld::ConstPtr part; if(store != inv.end() && (part=*store).getTypeName() == typeid(ESM::Light).name()) { const ESM::Light *light = part.get()->mBase; @@ -748,8 +748,8 @@ bool NpcAnimation::addOrReplaceIndividualPart(ESM::PartReferenceType type, int g if (!mSoundsDisabled) { - MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); - MWWorld::ContainerStoreIterator csi = inv.getSlot(group < 0 ? MWWorld::InventoryStore::Slot_Helmet : group); + const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); + MWWorld::ConstContainerStoreIterator csi = inv.getSlot(group < 0 ? MWWorld::InventoryStore::Slot_Helmet : group); if (csi != inv.end()) { mSoundIds[type] = csi->getClass().getSound(*csi); @@ -883,8 +883,8 @@ void NpcAnimation::showWeapons(bool showWeapon) mAmmunition.reset(); if(showWeapon) { - MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); - MWWorld::ContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); + MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); if(weapon != inv.end()) { osg::Vec4f glowColor = getEnchantmentColor(*weapon); @@ -896,7 +896,7 @@ void NpcAnimation::showWeapons(bool showWeapon) if (weapon->getTypeName() == typeid(ESM::Weapon).name() && weapon->get()->mBase->mData.mType == ESM::Weapon::MarksmanCrossbow) { - MWWorld::ContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); + MWWorld::ConstContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); if (ammo != inv.end() && ammo->get()->mBase->mData.mType == ESM::Weapon::Bolt) attachArrow(); } @@ -911,8 +911,8 @@ void NpcAnimation::showWeapons(bool showWeapon) void NpcAnimation::showCarriedLeft(bool show) { mShowCarriedLeft = show; - MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); - MWWorld::ContainerStoreIterator iter = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); + const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); + MWWorld::ConstContainerStoreIterator iter = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if(show && iter != inv.end()) { osg::Vec4f glowColor = getEnchantmentColor(*iter); diff --git a/apps/openmw/mwrender/weaponanimation.cpp b/apps/openmw/mwrender/weaponanimation.cpp index d5fb70d16..0b3d000f3 100644 --- a/apps/openmw/mwrender/weaponanimation.cpp +++ b/apps/openmw/mwrender/weaponanimation.cpp @@ -56,8 +56,8 @@ WeaponAnimation::~WeaponAnimation() void WeaponAnimation::attachArrow(MWWorld::Ptr actor) { - MWWorld::InventoryStore& inv = actor.getClass().getInventoryStore(actor); - MWWorld::ContainerStoreIterator weaponSlot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + const MWWorld::InventoryStore& inv = actor.getClass().getInventoryStore(actor); + MWWorld::ConstContainerStoreIterator weaponSlot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); if (weaponSlot == inv.end()) return; if (weaponSlot->getTypeName() != typeid(ESM::Weapon).name()) @@ -79,7 +79,7 @@ void WeaponAnimation::attachArrow(MWWorld::Ptr actor) if (!parent) return; - MWWorld::ContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); + MWWorld::ConstContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); if (ammo == inv.end()) return; std::string model = ammo->getClass().getModel(*ammo); diff --git a/apps/openmw/mwscript/containerextensions.cpp b/apps/openmw/mwscript/containerextensions.cpp index 0b4c9a0fc..8009345f2 100644 --- a/apps/openmw/mwscript/containerextensions.cpp +++ b/apps/openmw/mwscript/containerextensions.cpp @@ -140,7 +140,7 @@ namespace MWScript MWWorld::ContainerStore& store = ptr.getClass().getContainerStore (ptr); std::string itemName; - for (MWWorld::ContainerStoreIterator iter(store.begin()); iter != store.end(); ++iter) + for (MWWorld::ConstContainerStoreIterator iter(store.cbegin()); iter != store.cend(); ++iter) if (::Misc::StringUtils::ciEqual(iter->getCellRef().getRefId(), item)) itemName = iter->getClass().getName(*iter); @@ -256,9 +256,9 @@ namespace MWScript throw std::runtime_error ("armor index out of range"); } - MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); - - MWWorld::ContainerStoreIterator it = invStore.getSlot (slot); + const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); + MWWorld::ConstContainerStoreIterator it = invStore.getSlot (slot); + if (it == invStore.end() || it->getTypeName () != typeid(ESM::Armor).name()) { runtime.push(-1); @@ -289,10 +289,10 @@ namespace MWScript std::string item = runtime.getStringLiteral (runtime[0].mInteger); runtime.pop(); - MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); + const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); for (int slot = 0; slot < MWWorld::InventoryStore::Slots; ++slot) { - MWWorld::ContainerStoreIterator it = invStore.getSlot (slot); + MWWorld::ConstContainerStoreIterator it = invStore.getSlot (slot); if (it != invStore.end() && ::Misc::StringUtils::ciEqual(it->getCellRef().getRefId(), item)) { runtime.push(1); @@ -316,9 +316,9 @@ namespace MWScript runtime.pop(); int count = 0; - MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); - for (MWWorld::ContainerStoreIterator it = invStore.begin(MWWorld::ContainerStore::Type_Miscellaneous); - it != invStore.end(); ++it) + const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); + for (MWWorld::ConstContainerStoreIterator it = invStore.cbegin(MWWorld::ContainerStore::Type_Miscellaneous); + it != invStore.cend(); ++it) { if (::Misc::StringUtils::ciEqual(it->getCellRef().getSoul(), name)) count += it->getRefData().getCount(); @@ -336,8 +336,8 @@ namespace MWScript { MWWorld::Ptr ptr = R()(runtime); - MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); - MWWorld::ContainerStoreIterator it = invStore.getSlot (MWWorld::InventoryStore::Slot_CarriedRight); + const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); + MWWorld::ConstContainerStoreIterator it = invStore.getSlot (MWWorld::InventoryStore::Slot_CarriedRight); if (it == invStore.end() || it->getTypeName () != typeid(ESM::Weapon).name()) { runtime.push(-1); diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 88b7e5262..98b1a6b47 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -519,7 +519,7 @@ namespace MWScript int numNotEquipped = invStorePtr->count(item); for (int slot = 0; slot < MWWorld::InventoryStore::Slots; ++slot) { - MWWorld::ContainerStoreIterator it = invStorePtr->getSlot (slot); + MWWorld::ConstContainerStoreIterator it = invStorePtr->getSlot (slot); if (it != invStorePtr->end() && ::Misc::StringUtils::ciEqual(it->getCellRef().getRefId(), item)) { numNotEquipped -= it->getRefData().getCount(); diff --git a/apps/openmw/mwworld/containerstore.cpp b/apps/openmw/mwworld/containerstore.cpp index 10388a3b0..a5090a66a 100644 --- a/apps/openmw/mwworld/containerstore.cpp +++ b/apps/openmw/mwworld/containerstore.cpp @@ -117,6 +117,26 @@ MWWorld::ContainerStore::ContainerStore() : mListener(NULL), mCachedWeight (0), MWWorld::ContainerStore::~ContainerStore() {} +MWWorld::ConstContainerStoreIterator MWWorld::ContainerStore::cbegin (int mask) const +{ + return ConstContainerStoreIterator (mask, this); +} + +MWWorld::ConstContainerStoreIterator MWWorld::ContainerStore::cend() const +{ + return ConstContainerStoreIterator (this); +} + +MWWorld::ConstContainerStoreIterator MWWorld::ContainerStore::begin (int mask) const +{ + return cbegin(mask); +} + +MWWorld::ConstContainerStoreIterator MWWorld::ContainerStore::end() const +{ + return cend(); +} + MWWorld::ContainerStoreIterator MWWorld::ContainerStore::begin (int mask) { return ContainerStoreIterator (mask, this); @@ -189,7 +209,7 @@ MWWorld::ContainerStoreIterator MWWorld::ContainerStore::restack(const MWWorld:: return retval; } -bool MWWorld::ContainerStore::stacks(const ConstPtr& ptr1, const ConstPtr& ptr2) +bool MWWorld::ContainerStore::stacks(const ConstPtr& ptr1, const ConstPtr& ptr2) const { const MWWorld::Class& cls1 = ptr1.getClass(); const MWWorld::Class& cls2 = ptr2.getClass(); @@ -788,53 +808,36 @@ void MWWorld::ContainerStore::readState (const ESM::InventoryState& inventory) mLevelledItemMap = inventory.mLevelledItemMap; } - -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container) -: mType (-1), mMask (0), mContainer (container) -{} - -MWWorld::ContainerStoreIterator::ContainerStoreIterator (int mask, ContainerStore *container) -: mType (0), mMask (mask), mContainer (container) +template +template +void MWWorld::ContainerStoreIteratorBase::copy (const ContainerStoreIteratorBase& src) { - nextType(); - - if (mType==-1 || (**this).getRefData().getCount()) - return; - - ++*this; -} - -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Potion), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mPotion(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Apparatus), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mApparatus(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Armor), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mArmor(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Book), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mBook(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Clothing), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mClothing(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Ingredient), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mIngredient(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Light), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mLight(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Lockpick), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mLockpick(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Miscellaneous), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mMiscellaneous(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Probe), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mProbe(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Repair), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mRepair(iterator){} -MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator iterator) - : mType(MWWorld::ContainerStore::Type_Weapon), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mWeapon(iterator){} + mType = src.mType; + mMask = src.mMask; + mContainer = src.mContainer; + mPtr = src.mPtr; -MWWorld::ContainerStoreIterator::ContainerStoreIterator( const ContainerStoreIterator& src ) -{ - copy(src); + switch (src.mType) + { + case MWWorld::ContainerStore::Type_Potion: mPotion = src.mPotion; break; + case MWWorld::ContainerStore::Type_Apparatus: mApparatus = src.mApparatus; break; + case MWWorld::ContainerStore::Type_Armor: mArmor = src.mArmor; break; + case MWWorld::ContainerStore::Type_Book: mBook = src.mBook; break; + case MWWorld::ContainerStore::Type_Clothing: mClothing = src.mClothing; break; + case MWWorld::ContainerStore::Type_Ingredient: mIngredient = src.mIngredient; break; + case MWWorld::ContainerStore::Type_Light: mLight = src.mLight; break; + case MWWorld::ContainerStore::Type_Lockpick: mLockpick = src.mLockpick; break; + case MWWorld::ContainerStore::Type_Miscellaneous: mMiscellaneous = src.mMiscellaneous; break; + case MWWorld::ContainerStore::Type_Probe: mProbe = src.mProbe; break; + case MWWorld::ContainerStore::Type_Repair: mRepair = src.mRepair; break; + case MWWorld::ContainerStore::Type_Weapon: mWeapon = src.mWeapon; break; + case -1: break; + default: assert(0); + } } -void MWWorld::ContainerStoreIterator::incType() +template +void MWWorld::ContainerStoreIteratorBase::incType() { if (mType==0) mType = 1; @@ -847,7 +850,8 @@ void MWWorld::ContainerStoreIterator::incType() } } -void MWWorld::ContainerStoreIterator::nextType() +template +void MWWorld::ContainerStoreIteratorBase::nextType() { while (mType!=-1) { @@ -859,7 +863,8 @@ void MWWorld::ContainerStoreIterator::nextType() } } -bool MWWorld::ContainerStoreIterator::resetIterator() +template +bool MWWorld::ContainerStoreIteratorBase::resetIterator() { switch (mType) { @@ -927,7 +932,8 @@ bool MWWorld::ContainerStoreIterator::resetIterator() return false; } -bool MWWorld::ContainerStoreIterator::incIterator() +template +bool MWWorld::ContainerStoreIteratorBase::incIterator() { switch (mType) { @@ -995,30 +1001,63 @@ bool MWWorld::ContainerStoreIterator::incIterator() return true; } -MWWorld::Ptr *MWWorld::ContainerStoreIterator::operator->() const + +template +template +bool MWWorld::ContainerStoreIteratorBase::isEqual (const ContainerStoreIteratorBase& other) const +{ + if (mContainer!=other.mContainer) + return false; + + if (mType!=other.mType) + return false; + + switch (mType) + { + case ContainerStore::Type_Potion: return mPotion==other.mPotion; + case ContainerStore::Type_Apparatus: return mApparatus==other.mApparatus; + case ContainerStore::Type_Armor: return mArmor==other.mArmor; + case ContainerStore::Type_Book: return mBook==other.mBook; + case ContainerStore::Type_Clothing: return mClothing==other.mClothing; + case ContainerStore::Type_Ingredient: return mIngredient==other.mIngredient; + case ContainerStore::Type_Light: return mLight==other.mLight; + case ContainerStore::Type_Lockpick: return mLockpick==other.mLockpick; + case ContainerStore::Type_Miscellaneous: return mMiscellaneous==other.mMiscellaneous; + case ContainerStore::Type_Probe: return mProbe==other.mProbe; + case ContainerStore::Type_Repair: return mRepair==other.mRepair; + case ContainerStore::Type_Weapon: return mWeapon==other.mWeapon; + case -1: return true; + } + + return false; +} + +template +PtrType *MWWorld::ContainerStoreIteratorBase::operator->() const { mPtr = **this; return &mPtr; } -MWWorld::Ptr MWWorld::ContainerStoreIterator::operator*() const +template +PtrType MWWorld::ContainerStoreIteratorBase::operator*() const { - Ptr ptr; + PtrType ptr; switch (mType) { - case ContainerStore::Type_Potion: ptr = MWWorld::Ptr (&*mPotion, 0); break; - case ContainerStore::Type_Apparatus: ptr = MWWorld::Ptr (&*mApparatus, 0); break; - case ContainerStore::Type_Armor: ptr = MWWorld::Ptr (&*mArmor, 0); break; - case ContainerStore::Type_Book: ptr = MWWorld::Ptr (&*mBook, 0); break; - case ContainerStore::Type_Clothing: ptr = MWWorld::Ptr (&*mClothing, 0); break; - case ContainerStore::Type_Ingredient: ptr = MWWorld::Ptr (&*mIngredient, 0); break; - case ContainerStore::Type_Light: ptr = MWWorld::Ptr (&*mLight, 0); break; - case ContainerStore::Type_Lockpick: ptr = MWWorld::Ptr (&*mLockpick, 0); break; - case ContainerStore::Type_Miscellaneous: ptr = MWWorld::Ptr (&*mMiscellaneous, 0); break; - case ContainerStore::Type_Probe: ptr = MWWorld::Ptr (&*mProbe, 0); break; - case ContainerStore::Type_Repair: ptr = MWWorld::Ptr (&*mRepair, 0); break; - case ContainerStore::Type_Weapon: ptr = MWWorld::Ptr (&*mWeapon, 0); break; + case ContainerStore::Type_Potion: ptr = PtrType (&*mPotion, 0); break; + case ContainerStore::Type_Apparatus: ptr = PtrType (&*mApparatus, 0); break; + case ContainerStore::Type_Armor: ptr = PtrType (&*mArmor, 0); break; + case ContainerStore::Type_Book: ptr = PtrType (&*mBook, 0); break; + case ContainerStore::Type_Clothing: ptr = PtrType (&*mClothing, 0); break; + case ContainerStore::Type_Ingredient: ptr = PtrType (&*mIngredient, 0); break; + case ContainerStore::Type_Light: ptr = PtrType (&*mLight, 0); break; + case ContainerStore::Type_Lockpick: ptr = PtrType (&*mLockpick, 0); break; + case ContainerStore::Type_Miscellaneous: ptr = PtrType (&*mMiscellaneous, 0); break; + case ContainerStore::Type_Probe: ptr = PtrType (&*mProbe, 0); break; + case ContainerStore::Type_Repair: ptr = PtrType (&*mRepair, 0); break; + case ContainerStore::Type_Weapon: ptr = PtrType (&*mWeapon, 0); break; } if (ptr.isEmpty()) @@ -1029,7 +1068,8 @@ MWWorld::Ptr MWWorld::ContainerStoreIterator::operator*() const return ptr; } -MWWorld::ContainerStoreIterator& MWWorld::ContainerStoreIterator::operator++() +template +MWWorld::ContainerStoreIteratorBase& MWWorld::ContainerStoreIteratorBase::operator++() { do { @@ -1041,92 +1081,126 @@ MWWorld::ContainerStoreIterator& MWWorld::ContainerStoreIterator::operator++() return *this; } -MWWorld::ContainerStoreIterator MWWorld::ContainerStoreIterator::operator++ (int) +template +MWWorld::ContainerStoreIteratorBase MWWorld::ContainerStoreIteratorBase::operator++ (int) { - ContainerStoreIterator iter (*this); + ContainerStoreIteratorBase iter (*this); ++*this; return iter; } -bool MWWorld::ContainerStoreIterator::isEqual (const ContainerStoreIterator& iter) const +template +MWWorld::ContainerStoreIteratorBase& MWWorld::ContainerStoreIteratorBase::operator= (const ContainerStoreIteratorBase& rhs) { - if (mContainer!=iter.mContainer) - return false; - - if (mType!=iter.mType) - return false; - - switch (mType) + if (this!=&rhs) { - case ContainerStore::Type_Potion: return mPotion==iter.mPotion; - case ContainerStore::Type_Apparatus: return mApparatus==iter.mApparatus; - case ContainerStore::Type_Armor: return mArmor==iter.mArmor; - case ContainerStore::Type_Book: return mBook==iter.mBook; - case ContainerStore::Type_Clothing: return mClothing==iter.mClothing; - case ContainerStore::Type_Ingredient: return mIngredient==iter.mIngredient; - case ContainerStore::Type_Light: return mLight==iter.mLight; - case ContainerStore::Type_Lockpick: return mLockpick==iter.mLockpick; - case ContainerStore::Type_Miscellaneous: return mMiscellaneous==iter.mMiscellaneous; - case ContainerStore::Type_Probe: return mProbe==iter.mProbe; - case ContainerStore::Type_Repair: return mRepair==iter.mRepair; - case ContainerStore::Type_Weapon: return mWeapon==iter.mWeapon; - case -1: return true; + copy(rhs); } - - return false; + return *this; } -int MWWorld::ContainerStoreIterator::getType() const +template +int MWWorld::ContainerStoreIteratorBase::getType() const { return mType; } -const MWWorld::ContainerStore *MWWorld::ContainerStoreIterator::getContainerStore() const +template +const MWWorld::ContainerStore *MWWorld::ContainerStoreIteratorBase::getContainerStore() const { return mContainer; } -void MWWorld::ContainerStoreIterator::copy(const ContainerStoreIterator& src) +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container) +: mType (-1), mMask (0), mContainer (container) +{} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (int mask, ContainerStoreType container) +: mType (0), mMask (mask), mContainer (container) { - mType = src.mType; - mMask = src.mMask; - mContainer = src.mContainer; - mPtr = src.mPtr; + nextType(); - switch (mType) - { - case MWWorld::ContainerStore::Type_Potion: mPotion = src.mPotion; break; - case MWWorld::ContainerStore::Type_Apparatus: mApparatus = src.mApparatus; break; - case MWWorld::ContainerStore::Type_Armor: mArmor = src.mArmor; break; - case MWWorld::ContainerStore::Type_Book: mBook = src.mBook; break; - case MWWorld::ContainerStore::Type_Clothing: mClothing = src.mClothing; break; - case MWWorld::ContainerStore::Type_Ingredient: mIngredient = src.mIngredient; break; - case MWWorld::ContainerStore::Type_Light: mLight = src.mLight; break; - case MWWorld::ContainerStore::Type_Lockpick: mLockpick = src.mLockpick; break; - case MWWorld::ContainerStore::Type_Miscellaneous: mMiscellaneous = src.mMiscellaneous; break; - case MWWorld::ContainerStore::Type_Probe: mProbe = src.mProbe; break; - case MWWorld::ContainerStore::Type_Repair: mRepair = src.mRepair; break; - case MWWorld::ContainerStore::Type_Weapon: mWeapon = src.mWeapon; break; - case -1: break; - default: assert(0); - } -} + if (mType==-1 || (**this).getRefData().getCount()) + return; -MWWorld::ContainerStoreIterator& MWWorld::ContainerStoreIterator::operator=( const ContainerStoreIterator& rhs ) -{ - if (this!=&rhs) - { - copy(rhs); - } - return *this; + ++*this; } -bool MWWorld::operator== (const ContainerStoreIterator& left, const ContainerStoreIterator& right) +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Potion), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mPotion(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Apparatus), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mApparatus(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Armor), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mArmor(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Book), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mBook(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Clothing), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mClothing(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Ingredient), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mIngredient(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Light), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mLight(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Lockpick), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mLockpick(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Miscellaneous), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mMiscellaneous(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Probe), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mProbe(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Repair), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mRepair(iterator){} + +template +MWWorld::ContainerStoreIteratorBase::ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type iterator) + : mType(MWWorld::ContainerStore::Type_Weapon), mMask(MWWorld::ContainerStore::Type_All), mContainer(container), mWeapon(iterator){} + + +template +bool MWWorld::operator== (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right) { return left.isEqual (right); } -bool MWWorld::operator!= (const ContainerStoreIterator& left, const ContainerStoreIterator& right) +template +bool MWWorld::operator!= (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right) { return !(left==right); } + +template class MWWorld::ContainerStoreIteratorBase; +template class MWWorld::ContainerStoreIteratorBase; + +template bool MWWorld::operator== (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); +template bool MWWorld::operator!= (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); +template bool MWWorld::operator== (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); +template bool MWWorld::operator!= (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); +template bool MWWorld::operator== (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); +template bool MWWorld::operator!= (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); +template bool MWWorld::operator== (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); +template bool MWWorld::operator!= (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); + +template void MWWorld::ContainerStoreIteratorBase::copy(const ContainerStoreIteratorBase& src); +template void MWWorld::ContainerStoreIteratorBase::copy(const ContainerStoreIteratorBase& src); +template void MWWorld::ContainerStoreIteratorBase::copy(const ContainerStoreIteratorBase& src); diff --git a/apps/openmw/mwworld/containerstore.hpp b/apps/openmw/mwworld/containerstore.hpp index 0c95d2dba..9849dbf26 100644 --- a/apps/openmw/mwworld/containerstore.hpp +++ b/apps/openmw/mwworld/containerstore.hpp @@ -29,8 +29,15 @@ namespace ESM namespace MWWorld { - class ContainerStoreIterator; + class ContainerStore; + template + class ContainerStoreIteratorBase; + + typedef ContainerStoreIteratorBase ContainerStoreIterator; + typedef ContainerStoreIteratorBase ConstContainerStoreIterator; + + class ContainerStoreListener { public: @@ -70,7 +77,7 @@ namespace MWWorld MWWorld::CellRefList clothes; MWWorld::CellRefList ingreds; MWWorld::CellRefList lights; - MWWorld::CellRefList lockpicks; + MWWorld::CellRefList lockpicks; MWWorld::CellRefList miscItems; MWWorld::CellRefList probes; MWWorld::CellRefList repairs; @@ -99,9 +106,11 @@ namespace MWWorld ESM::InventoryState& inventory, int& index, bool equipable = false) const; + virtual void storeEquipmentState (const MWWorld::LiveCellRefBase& ref, int index, ESM::InventoryState& inventory) const; virtual void readEquipmentState (const MWWorld::ContainerStoreIterator& iter, int index, const ESM::InventoryState& inventory); + public: ContainerStore(); @@ -110,8 +119,12 @@ namespace MWWorld virtual ContainerStore* clone() { return new ContainerStore(*this); } + ConstContainerStoreIterator cbegin (int mask = Type_All) const; + ConstContainerStoreIterator cend() const; + ConstContainerStoreIterator begin (int mask = Type_All) const; + ConstContainerStoreIterator end() const; + ContainerStoreIterator begin (int mask = Type_All); - ContainerStoreIterator end(); virtual ContainerStoreIterator add (const Ptr& itemPtr, int count, const Ptr& actorPtr, bool setOwner=false); @@ -163,7 +176,7 @@ namespace MWWorld public: - virtual bool stacks (const ConstPtr& ptr1, const ConstPtr& ptr2); + virtual bool stacks (const ConstPtr& ptr1, const ConstPtr& ptr2) const; ///< @return true if the two specified objects can stack with each other void fill (const ESM::InventoryList& items, const std::string& owner); @@ -187,96 +200,143 @@ namespace MWWorld virtual void readState (const ESM::InventoryState& state); - friend class ContainerStoreIterator; + friend class ContainerStoreIteratorBase; + friend class ContainerStoreIteratorBase; }; - /// \brief Iteration over a subset of objects in a ContainerStore - /// - /// \note The iterator will automatically skip over deleted objects. - class ContainerStoreIterator - : public std::iterator + + template + class ContainerStoreIteratorBase + : public std::iterator { - int mType; - int mMask; - ContainerStore *mContainer; - mutable Ptr mPtr; - - MWWorld::CellRefList::List::iterator mPotion; - MWWorld::CellRefList::List::iterator mApparatus; - MWWorld::CellRefList::List::iterator mArmor; - MWWorld::CellRefList::List::iterator mBook; - MWWorld::CellRefList::List::iterator mClothing; - MWWorld::CellRefList::List::iterator mIngredient; - MWWorld::CellRefList::List::iterator mLight; - MWWorld::CellRefList::List::iterator mLockpick; - MWWorld::CellRefList::List::iterator mMiscellaneous; - MWWorld::CellRefList::List::iterator mProbe; - MWWorld::CellRefList::List::iterator mRepair; - MWWorld::CellRefList::List::iterator mWeapon; - - private: - - ContainerStoreIterator (ContainerStore *container); - ///< End-iterator - - ContainerStoreIterator (int mask, ContainerStore *container); - ///< Begin-iterator - - // construct iterator using a CellRefList iterator - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList::List::iterator); - - void copy (const ContainerStoreIterator& src); - - 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? + template + struct IsConvertible + { + static const bool value = true; + }; + + template + struct IsConvertible + { + static const bool value = false; + }; + + template + struct IteratorTrait + { + typedef typename MWWorld::CellRefList::List::iterator type; + }; + + template + struct IteratorTrait + { + typedef typename MWWorld::CellRefList::List::const_iterator type; + }; + + template + struct Iterator : IteratorTrait + { + }; + + template + struct ContainerStoreTrait + { + typedef ContainerStore* type; + }; + + template + struct ContainerStoreTrait + { + typedef const ContainerStore* type; + }; + + typedef typename ContainerStoreTrait::type ContainerStoreType; + + int mType; + int mMask; + ContainerStoreType mContainer; + mutable PtrType mPtr; + + typename Iterator::type mPotion; + typename Iterator::type mApparatus; + typename Iterator::type mArmor; + typename Iterator::type mBook; + typename Iterator::type mClothing; + typename Iterator::type mIngredient; + typename Iterator::type mLight; + typename Iterator::type mLockpick; + typename Iterator::type mMiscellaneous; + typename Iterator::type mProbe; + typename Iterator::type mRepair; + typename Iterator::type mWeapon; + + ContainerStoreIteratorBase (ContainerStoreType container); + ///< End-iterator + + ContainerStoreIteratorBase (int mask, ContainerStoreType container); + ///< Begin-iterator + + // construct iterator using a CellRefList iterator + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + ContainerStoreIteratorBase (ContainerStoreType container, typename Iterator::type); + + template + void copy (const ContainerStoreIteratorBase& src); + + 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: + template + ContainerStoreIteratorBase (const ContainerStoreIteratorBase& other) + { + char CANNOT_CONVERT_CONST_ITERATOR_TO_ITERATOR[IsConvertible::value ? 1 : -1]; + ((void)CANNOT_CONVERT_CONST_ITERATOR_TO_ITERATOR); + copy (other); + } - ContainerStoreIterator(const ContainerStoreIterator& src); - - Ptr *operator->() const; + template + bool isEqual(const ContainerStoreIteratorBase& other) const; - Ptr operator*() const; + PtrType *operator->() const; + PtrType operator*() const; - ContainerStoreIterator& operator++(); - - ContainerStoreIterator operator++ (int); - - ContainerStoreIterator& operator= (const ContainerStoreIterator& rhs); - - bool isEqual (const ContainerStoreIterator& iter) const; + ContainerStoreIteratorBase& operator++ (); + ContainerStoreIteratorBase operator++ (int); + ContainerStoreIteratorBase& operator= (const ContainerStoreIteratorBase& rhs); int getType() const; - const ContainerStore *getContainerStore() const; - friend class ContainerStore; + friend class ContainerStore; + friend class ContainerStoreIteratorBase; + friend class ContainerStoreIteratorBase; }; - bool operator== (const ContainerStoreIterator& left, const ContainerStoreIterator& right); - bool operator!= (const ContainerStoreIterator& left, const ContainerStoreIterator& right); + template + bool operator== (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); + template + bool operator!= (const ContainerStoreIteratorBase& left, const ContainerStoreIteratorBase& right); } - #endif diff --git a/apps/openmw/mwworld/inventorystore.cpp b/apps/openmw/mwworld/inventorystore.cpp index f33ddc94f..05d874ecd 100644 --- a/apps/openmw/mwworld/inventorystore.cpp +++ b/apps/openmw/mwworld/inventorystore.cpp @@ -199,20 +199,12 @@ void MWWorld::InventoryStore::unequipAll(const MWWorld::Ptr& actor) MWWorld::ContainerStoreIterator MWWorld::InventoryStore::getSlot (int slot) { - if (slot<0 || slot>=static_cast (mSlots.size())) - throw std::runtime_error ("slot number out of range"); - - if (mSlots[slot]==end()) - return end(); - - if (mSlots[slot]->getRefData().getCount()<1) - { - // Object has been deleted - // This should no longer happen, since the new remove function will unequip first - throw std::runtime_error("Invalid slot, make sure you are not calling RefData::setCount for a container object"); - } + return findSlot (slot); +} - return mSlots[slot]; +MWWorld::ConstContainerStoreIterator MWWorld::InventoryStore::getSlot (int slot) const +{ + return findSlot (slot); } bool MWWorld::InventoryStore::canActorAutoEquip(const MWWorld::Ptr& actor, const MWWorld::Ptr& item) @@ -235,6 +227,24 @@ bool MWWorld::InventoryStore::canActorAutoEquip(const MWWorld::Ptr& actor, const return true; } +MWWorld::ContainerStoreIterator MWWorld::InventoryStore::findSlot (int slot) const +{ + if (slot<0 || slot>=static_cast (mSlots.size())) + throw std::runtime_error ("slot number out of range"); + + if (mSlots[slot]==end()) + return mSlots[slot]; + + if (mSlots[slot]->getRefData().getCount()<1) + { + // Object has been deleted + // This should no longer happen, since the new remove function will unequip first + throw std::runtime_error("Invalid slot, make sure you are not calling RefData::setCount for a container object"); + } + + return mSlots[slot]; +} + void MWWorld::InventoryStore::autoEquip (const MWWorld::Ptr& actor) { const MWBase::World *world = MWBase::Environment::get().getWorld(); diff --git a/apps/openmw/mwworld/inventorystore.hpp b/apps/openmw/mwworld/inventorystore.hpp index f625e4cd1..eff4092d1 100644 --- a/apps/openmw/mwworld/inventorystore.hpp +++ b/apps/openmw/mwworld/inventorystore.hpp @@ -116,6 +116,7 @@ namespace MWWorld virtual void readEquipmentState (const MWWorld::ContainerStoreIterator& iter, int index, const ESM::InventoryState& inventory); bool canActorAutoEquip(const MWWorld::Ptr& actor, const MWWorld::Ptr& item); + ContainerStoreIterator findSlot (int slot) const; public: @@ -155,6 +156,7 @@ namespace MWWorld /// \note if no item selected, return end() iterator ContainerStoreIterator getSlot (int slot); + ConstContainerStoreIterator getSlot(int slot) const; void unequipAll(const MWWorld::Ptr& actor); ///< Unequip all currently equipped items. diff --git a/apps/openmw/mwworld/ptr.cpp b/apps/openmw/mwworld/ptr.cpp index 01e7be1d1..12c44b0b3 100644 --- a/apps/openmw/mwworld/ptr.cpp +++ b/apps/openmw/mwworld/ptr.cpp @@ -70,6 +70,14 @@ const MWWorld::LiveCellRefBase *MWWorld::ConstPtr::getBase() const return mRef; } +void MWWorld::ConstPtr::setContainerStore (const ContainerStore *store) +{ + assert (store); + assert (!mCell); + + mContainerStore = store; +} + const MWWorld::ContainerStore *MWWorld::ConstPtr::getContainerStore() const { return mContainerStore; diff --git a/apps/openmw/mwworld/ptr.hpp b/apps/openmw/mwworld/ptr.hpp index d34f516a7..d7c170e45 100644 --- a/apps/openmw/mwworld/ptr.hpp +++ b/apps/openmw/mwworld/ptr.hpp @@ -158,7 +158,10 @@ namespace MWWorld { return (mContainerStore == 0) && (mCell != 0); } - + + void setContainerStore (const ContainerStore *store); + ///< Must not be called on references that are in a cell. + const ContainerStore *getContainerStore() const; ///< May return a 0-pointer, if reference is not in a container.