Allow string_view lookups in MWWorld::Store and get some use out of that

post_malone
Evil Eye 3 years ago
parent bb9884c024
commit de51525c76

@ -137,7 +137,7 @@ namespace MWBase
virtual MWWorld::CellStore *getExterior (int x, int y) = 0;
virtual MWWorld::CellStore *getInterior (const std::string& name) = 0;
virtual MWWorld::CellStore* getInterior(std::string_view name) = 0;
virtual MWWorld::CellStore *getCell (const ESM::CellId& id) = 0;
@ -236,7 +236,7 @@ namespace MWBase
virtual bool toggleSky() = 0;
///< \return Resulting mode
virtual void changeWeather(const std::string& region, const unsigned int id) = 0;
virtual void changeWeather(std::string_view region, const unsigned int id) = 0;
virtual int getCurrentWeather() const = 0;
@ -252,7 +252,7 @@ namespace MWBase
virtual void setMoonColour (bool red) = 0;
virtual void modRegion(const std::string &regionid, const std::vector<char> &chances) = 0;
virtual void modRegion(std::string_view regionid, const std::vector<char> &chances) = 0;
virtual float getTimeScaleFactor() const = 0;
@ -271,7 +271,7 @@ namespace MWBase
virtual void changeToCell (const ESM::CellId& cellId, const ESM::Position& position, bool adjustPlayerPos, bool changeEvent=true) = 0;
///< @param changeEvent If false, do not trigger cell change flag or detect worldspace changes
virtual const ESM::Cell *getExterior (const std::string& cellName) const = 0;
virtual const ESM::Cell* getExterior(std::string_view cellName) const = 0;
///< Return a cell matching the given name or a 0-pointer, if there is no such cell.
virtual void markCellAsUnchanged() = 0;
@ -518,7 +518,7 @@ namespace MWBase
/// Find default position inside interior cell specified by name
/// \return false if interior with given name not exists, true otherwise
virtual bool findInteriorPosition(const std::string &name, ESM::Position &pos) = 0;
virtual bool findInteriorPosition(std::string_view name, ESM::Position &pos) = 0;
/// Enables or disables use of teleport spell effects (recall, intervention, etc).
virtual void enableTeleporting(bool enable) = 0;
@ -591,7 +591,7 @@ namespace MWBase
virtual void goToJail () = 0;
/// Spawn a random creature from a levelled list next to the player
virtual void spawnRandomCreature(const std::string& creatureList) = 0;
virtual void spawnRandomCreature(std::string_view creatureList) = 0;
/// Spawn a blood effect for \a ptr at \a worldPosition
virtual void spawnBloodEffect (const MWWorld::Ptr& ptr, const osg::Vec3f& worldPosition) = 0;

@ -1433,7 +1433,7 @@ namespace MWClass
return true;
}
std::string Npc::getPrimaryFaction (const MWWorld::ConstPtr& ptr) const
std::string_view Npc::getPrimaryFaction(const MWWorld::ConstPtr& ptr) const
{
const MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>();
return ref->mBase->mFaction;
@ -1441,7 +1441,7 @@ namespace MWClass
int Npc::getPrimaryFactionRank (const MWWorld::ConstPtr& ptr) const
{
std::string factionID = ptr.getClass().getPrimaryFaction(ptr);
std::string_view factionID = ptr.getClass().getPrimaryFaction(ptr);
if(factionID.empty())
return -1;

@ -159,7 +159,7 @@ namespace MWClass
int getBaseFightRating (const MWWorld::ConstPtr& ptr) const override;
std::string getPrimaryFaction(const MWWorld::ConstPtr &ptr) const override;
std::string_view getPrimaryFaction(const MWWorld::ConstPtr &ptr) const override;
int getPrimaryFactionRank(const MWWorld::ConstPtr &ptr) const override;
void setBaseAISetting(const std::string& id, MWMechanics::AiSetting setting, int value) const override;

@ -359,7 +359,7 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
case SelectWrapper::Function_RankRequirement:
{
std::string faction = mActor.getClass().getPrimaryFaction(mActor);
std::string_view faction = mActor.getClass().getPrimaryFaction(mActor);
if (faction.empty())
return 0;
@ -397,7 +397,7 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
case SelectWrapper::Function_FactionRankDiff:
{
std::string faction = mActor.getClass().getPrimaryFaction(mActor);
std::string_view faction = mActor.getClass().getPrimaryFaction(mActor);
if (faction.empty())
return 0;
@ -416,7 +416,7 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
{
bool low = select.getFunction()==SelectWrapper::Function_RankLow;
std::string factionId = mActor.getClass().getPrimaryFaction(mActor);
std::string_view factionId = mActor.getClass().getPrimaryFaction(mActor);
if (factionId.empty())
return 0;
@ -517,7 +517,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
case SelectWrapper::Function_PcExpelled:
{
std::string faction = mActor.getClass().getPrimaryFaction(mActor);
std::string_view faction = mActor.getClass().getPrimaryFaction(mActor);
if (faction.empty())
return false;
@ -561,20 +561,13 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
}
}
int MWDialogue::Filter::getFactionRank (const MWWorld::Ptr& actor, const std::string& factionId) const
int MWDialogue::Filter::getFactionRank (const MWWorld::Ptr& actor, std::string_view factionId) const
{
MWMechanics::NpcStats& stats = actor.getClass().getNpcStats (actor);
std::map<std::string, int>::const_iterator iter = stats.getFactionRanks().find (Misc::StringUtils::lowerCase(factionId));
if (iter==stats.getFactionRanks().end())
return -1;
return iter->second;
return stats.getFactionRank(factionId);
}
bool MWDialogue::Filter::hasFactionRankSkillRequirements (const MWWorld::Ptr& actor,
const std::string& factionId, int rank) const
bool MWDialogue::Filter::hasFactionRankSkillRequirements(const MWWorld::Ptr& actor, std::string_view factionId, int rank) const
{
if (rank<0 || rank>=10)
throw std::runtime_error ("rank index out of range");
@ -591,8 +584,7 @@ bool MWDialogue::Filter::hasFactionRankSkillRequirements (const MWWorld::Ptr& ac
stats.getAttribute (faction.mData.mAttribute[1]).getBase()>=faction.mData.mRankData[rank].mAttribute2;
}
bool MWDialogue::Filter::hasFactionRankReputationRequirements (const MWWorld::Ptr& actor,
const std::string& factionId, int rank) const
bool MWDialogue::Filter::hasFactionRankReputationRequirements(const MWWorld::Ptr& actor, std::string_view factionId, int rank) const
{
if (rank<0 || rank>=10)
throw std::runtime_error ("rank index out of range");

@ -43,13 +43,11 @@ namespace MWDialogue
bool getSelectStructBoolean (const SelectWrapper& select) const;
int getFactionRank (const MWWorld::Ptr& actor, const std::string& factionId) const;
int getFactionRank(const MWWorld::Ptr& actor, std::string_view factionId) const;
bool hasFactionRankSkillRequirements (const MWWorld::Ptr& actor, const std::string& factionId,
int rank) const;
bool hasFactionRankSkillRequirements(const MWWorld::Ptr& actor, std::string_view factionId, int rank) const;
bool hasFactionRankReputationRequirements (const MWWorld::Ptr& actor, const std::string& factionId,
int rank) const;
bool hasFactionRankReputationRequirements(const MWWorld::Ptr& actor, std::string_view factionId, int rank) const;
public:

@ -16,7 +16,7 @@
namespace MWDialogue
{
Entry::Entry (const std::string& topic, const std::string& infoId, const MWWorld::Ptr& actor)
Entry::Entry(std::string_view topic, std::string_view infoId, const MWWorld::Ptr& actor)
: mInfoId (infoId)
{
const ESM::Dialogue *dialogue =
@ -40,7 +40,7 @@ namespace MWDialogue
return;
}
throw std::runtime_error ("unknown info ID " + mInfoId + " for topic " + topic);
throw std::runtime_error ("unknown info ID " + mInfoId + " for topic " + std::string(topic));
}
Entry::Entry (const ESM::JournalEntry& record) : mInfoId (record.mInfo), mText (record.mText), mActorName(record.mActorName) {}
@ -58,7 +58,7 @@ namespace MWDialogue
}
JournalEntry::JournalEntry (const std::string& topic, const std::string& infoId, const MWWorld::Ptr& actor)
JournalEntry::JournalEntry(std::string_view topic, std::string_view infoId, const MWWorld::Ptr& actor)
: Entry (topic, infoId, actor), mTopic (topic)
{}
@ -72,12 +72,12 @@ namespace MWDialogue
entry.mTopic = mTopic;
}
JournalEntry JournalEntry::makeFromQuest (const std::string& topic, int index)
JournalEntry JournalEntry::makeFromQuest(std::string_view topic, int index)
{
return JournalEntry (topic, idFromIndex (topic, index), MWWorld::Ptr());
}
std::string JournalEntry::idFromIndex (const std::string& topic, int index)
std::string_view JournalEntry::idFromIndex (std::string_view topic, int index)
{
const ESM::Dialogue *dialogue =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>().find (topic);
@ -89,7 +89,7 @@ namespace MWDialogue
return iter->mId;
}
throw std::runtime_error ("unknown journal index for topic " + topic);
throw std::runtime_error ("unknown journal index for topic " + std::string(topic));
}
@ -97,7 +97,7 @@ namespace MWDialogue
: mDay (0), mMonth (0), mDayOfMonth (0)
{}
StampedJournalEntry::StampedJournalEntry (const std::string& topic, const std::string& infoId,
StampedJournalEntry::StampedJournalEntry(std::string_view topic, std::string_view infoId,
int day, int month, int dayOfMonth, const MWWorld::Ptr& actor)
: JournalEntry (topic, infoId, actor), mDay (day), mMonth (month), mDayOfMonth (dayOfMonth)
{}
@ -115,7 +115,7 @@ namespace MWDialogue
entry.mDayOfMonth = mDayOfMonth;
}
StampedJournalEntry StampedJournalEntry::makeFromQuest (const std::string& topic, int index, const MWWorld::Ptr& actor)
StampedJournalEntry StampedJournalEntry::makeFromQuest(std::string_view topic, int index, const MWWorld::Ptr& actor)
{
int day = MWBase::Environment::get().getWorld()->getGlobalInt ("dayspassed");
int month = MWBase::Environment::get().getWorld()->getGlobalInt ("month");

@ -2,6 +2,7 @@
#define GAME_MWDIALOGUE_JOURNALENTRY_H
#include <string>
#include <string_view>
namespace ESM
{
@ -25,7 +26,7 @@ namespace MWDialogue
Entry() = default;
/// actor is optional
Entry (const std::string& topic, const std::string& infoId, const MWWorld::Ptr& actor);
Entry(std::string_view topic, std::string_view infoId, const MWWorld::Ptr& actor);
Entry (const ESM::JournalEntry& record);
@ -43,15 +44,15 @@ namespace MWDialogue
JournalEntry() = default;
JournalEntry (const std::string& topic, const std::string& infoId, const MWWorld::Ptr& actor);
JournalEntry(std::string_view topic, std::string_view infoId, const MWWorld::Ptr& actor);
JournalEntry (const ESM::JournalEntry& record);
void write (ESM::JournalEntry& entry) const;
static JournalEntry makeFromQuest (const std::string& topic, int index);
static JournalEntry makeFromQuest(std::string_view topic, int index);
static std::string idFromIndex (const std::string& topic, int index);
static std::string_view idFromIndex(std::string_view topic, int index);
};
/// \brief A quest entry with a timestamp.
@ -63,14 +64,14 @@ namespace MWDialogue
StampedJournalEntry();
StampedJournalEntry (const std::string& topic, const std::string& infoId,
StampedJournalEntry(std::string_view topic, std::string_view infoId,
int day, int month, int dayOfMonth, const MWWorld::Ptr& actor);
StampedJournalEntry (const ESM::JournalEntry& record);
void write (ESM::JournalEntry& entry) const;
static StampedJournalEntry makeFromQuest (const std::string& topic, int index, const MWWorld::Ptr& actor);
static StampedJournalEntry makeFromQuest(std::string_view topic, int index, const MWWorld::Ptr& actor);
};
}

@ -80,7 +80,7 @@ namespace MWDialogue
void Journal::addEntry (const std::string& id, int index, const MWWorld::Ptr& actor)
{
// bail out if we already have heard this...
std::string infoId = JournalEntry::idFromIndex (id, index);
std::string_view infoId = JournalEntry::idFromIndex(id, index);
for (TEntryIter i = mJournal.begin (); i != mJournal.end (); ++i)
if (i->mTopic == id && i->mInfoId == infoId)
{

@ -518,9 +518,7 @@ namespace MWMechanics
float reaction = 0;
int rank = 0;
std::string npcFaction = ptr.getClass().getPrimaryFaction(ptr);
Misc::StringUtils::lowerCaseInPlace(npcFaction);
std::string npcFaction = Misc::StringUtils::lowerCase(ptr.getClass().getPrimaryFaction(ptr));
if (playerStats.getFactionRanks().find(npcFaction) != playerStats.getFactionRanks().end())
{
@ -985,7 +983,7 @@ namespace MWMechanics
if (ownerFound != owners.end())
return true;
const std::string factionid = ptr.getClass().getPrimaryFaction(ptr);
const std::string_view factionid = ptr.getClass().getPrimaryFaction(ptr);
if (!factionid.empty())
{
OwnerMap::const_iterator factionOwnerFound = owners.find(std::make_pair(Misc::StringUtils::lowerCase(factionid), true));
@ -1010,7 +1008,7 @@ namespace MWMechanics
owner.first = victim.getCellRef().getRefId();
owner.second = false;
const std::string victimFaction = victim.getClass().getPrimaryFaction(victim);
const std::string_view victimFaction = victim.getClass().getPrimaryFaction(victim);
if (!victimFaction.empty() && Misc::StringUtils::ciEqual(item.getCellRef().getFaction(), victimFaction)) // Is the item faction-owned?
{
owner.first = victimFaction;
@ -1375,7 +1373,7 @@ namespace MWMechanics
// If committing a crime against a faction member, expell from the faction
if (!victim.isEmpty() && victim.getClass().isNpc())
{
std::string factionID = victim.getClass().getPrimaryFaction(victim);
std::string_view factionID = victim.getClass().getPrimaryFaction(victim);
const std::map<std::string, int>& playerRanks = player.getClass().getNpcStats(player).getFactionRanks();
if (playerRanks.find(Misc::StringUtils::lowerCase(factionID)) != playerRanks.end())

@ -69,7 +69,7 @@ const std::map<std::string, int>& MWMechanics::NpcStats::getFactionRanks() const
return mFactionRank;
}
int MWMechanics::NpcStats::getFactionRank(const std::string &faction) const
int MWMechanics::NpcStats::getFactionRank(std::string_view faction) const
{
const std::string lower = Misc::StringUtils::lowerCase(faction);
std::map<std::string, int>::const_iterator it = mFactionRank.find(lower);
@ -79,7 +79,7 @@ int MWMechanics::NpcStats::getFactionRank(const std::string &faction) const
return -1;
}
void MWMechanics::NpcStats::raiseRank(const std::string &faction)
void MWMechanics::NpcStats::raiseRank(std::string_view faction)
{
const std::string lower = Misc::StringUtils::lowerCase(faction);
std::map<std::string, int>::iterator it = mFactionRank.find(lower);
@ -92,7 +92,7 @@ void MWMechanics::NpcStats::raiseRank(const std::string &faction)
}
}
void MWMechanics::NpcStats::lowerRank(const std::string &faction)
void MWMechanics::NpcStats::lowerRank(std::string_view faction)
{
const std::string lower = Misc::StringUtils::lowerCase(faction);
std::map<std::string, int>::iterator it = mFactionRank.find(lower);
@ -107,7 +107,7 @@ void MWMechanics::NpcStats::lowerRank(const std::string &faction)
}
}
void MWMechanics::NpcStats::joinFaction(const std::string& faction)
void MWMechanics::NpcStats::joinFaction(std::string_view faction)
{
const std::string lower = Misc::StringUtils::lowerCase(faction);
std::map<std::string, int>::iterator it = mFactionRank.find(lower);
@ -115,12 +115,12 @@ void MWMechanics::NpcStats::joinFaction(const std::string& faction)
mFactionRank[lower] = 0;
}
bool MWMechanics::NpcStats::getExpelled(const std::string& factionID) const
bool MWMechanics::NpcStats::getExpelled(std::string_view factionID) const
{
return mExpelled.find(Misc::StringUtils::lowerCase(factionID)) != mExpelled.end();
}
void MWMechanics::NpcStats::expell(const std::string& factionID)
void MWMechanics::NpcStats::expell(std::string_view factionID)
{
std::string lower = Misc::StringUtils::lowerCase(factionID);
if (mExpelled.find(lower) == mExpelled.end())
@ -132,17 +132,17 @@ void MWMechanics::NpcStats::expell(const std::string& factionID)
}
}
void MWMechanics::NpcStats::clearExpelled(const std::string& factionID)
void MWMechanics::NpcStats::clearExpelled(std::string_view factionID)
{
mExpelled.erase(Misc::StringUtils::lowerCase(factionID));
}
bool MWMechanics::NpcStats::isInFaction (const std::string& faction) const
bool MWMechanics::NpcStats::isInFaction(std::string_view faction) const
{
return (mFactionRank.find(Misc::StringUtils::lowerCase(faction)) != mFactionRank.end());
}
int MWMechanics::NpcStats::getFactionReputation (const std::string& faction) const
int MWMechanics::NpcStats::getFactionReputation(std::string_view faction) const
{
std::map<std::string, int>::const_iterator iter = mFactionReputation.find (Misc::StringUtils::lowerCase(faction));
@ -152,7 +152,7 @@ int MWMechanics::NpcStats::getFactionReputation (const std::string& faction) con
return iter->second;
}
void MWMechanics::NpcStats::setFactionReputation (const std::string& faction, int value)
void MWMechanics::NpcStats::setFactionReputation(std::string_view faction, int value)
{
mFactionReputation[Misc::StringUtils::lowerCase(faction)] = value;
}
@ -387,7 +387,7 @@ void MWMechanics::NpcStats::setCrimeId(int id)
mCrimeId = id;
}
bool MWMechanics::NpcStats::hasSkillsForRank (const std::string& factionId, int rank) const
bool MWMechanics::NpcStats::hasSkillsForRank(std::string_view factionId, int rank) const
{
if (rank<0 || rank>=10)
throw std::runtime_error ("rank index out of range");

@ -61,22 +61,22 @@ namespace MWMechanics
SkillValue& getSkill (int index);
void setSkill(int index, const SkillValue& value);
int getFactionRank(const std::string &faction) const;
int getFactionRank(std::string_view faction) const;
const std::map<std::string, int>& getFactionRanks() const;
/// Increase the rank in this faction by 1, if such a rank exists.
void raiseRank(const std::string& faction);
void raiseRank(std::string_view faction);
/// Lower the rank in this faction by 1, if such a rank exists.
void lowerRank(const std::string& faction);
void lowerRank(std::string_view faction);
/// Join this faction, setting the initial rank to 0.
void joinFaction(const std::string& faction);
void joinFaction(std::string_view faction);
const std::set<std::string>& getExpelled() const { return mExpelled; }
bool getExpelled(const std::string& factionID) const;
void expell(const std::string& factionID);
void clearExpelled(const std::string& factionID);
bool getExpelled(std::string_view factionID) const;
void expell(std::string_view factionID);
void clearExpelled(std::string_view factionID);
bool isInFaction (const std::string& faction) const;
bool isInFaction(std::string_view faction) const;
float getSkillProgressRequirement (int skillIndex, const ESM::Class& class_) const;
@ -107,11 +107,11 @@ namespace MWMechanics
void setBounty (int bounty);
int getFactionReputation (const std::string& faction) const;
int getFactionReputation(std::string_view faction) const;
void setFactionReputation (const std::string& faction, int value);
void setFactionReputation(std::string_view faction, int value);
bool hasSkillsForRank (const std::string& factionId, int rank) const;
bool hasSkillsForRank(std::string_view factionId, int rank) const;
bool isWerewolf() const;

@ -14,13 +14,13 @@
namespace
{
template<class T>
const std::vector<std::string> getSpellList(const std::string& id)
const std::vector<std::string> getSpellList(std::string_view id)
{
return MWBase::Environment::get().getWorld()->getStore().get<T>().find(id)->mSpells.mList;
}
template<class T>
bool withBaseRecord(const std::string& id, const std::function<bool(std::vector<std::string>&)>& function)
bool withBaseRecord(std::string_view id, const std::function<bool(std::vector<std::string>&)>& function)
{
T copy = *MWBase::Environment::get().getWorld()->getStore().get<T>().find(id);
bool changed = function(copy.mSpells.mList);
@ -60,7 +60,7 @@ namespace MWMechanics
}
}
const ESM::Spell* SpellList::getSpell(const std::string& id)
const ESM::Spell* SpellList::getSpell(std::string_view id)
{
return MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(id);
}

@ -37,7 +37,7 @@ namespace MWMechanics
SpellList(const std::string& id, int type);
/// Get spell from ID, throws exception if not found
static const ESM::Spell* getSpell(const std::string& id);
static const ESM::Spell* getSpell(std::string_view id);
void add (const ESM::Spell* spell);
///< Adding a spell that is already listed in *this is a no-op.

@ -46,7 +46,7 @@ namespace MWMechanics
return mSpells.end();
}
bool Spells::hasSpell(const std::string &spell) const
bool Spells::hasSpell(std::string_view spell) const
{
return hasSpell(SpellList::getSpell(spell));
}
@ -61,7 +61,7 @@ namespace MWMechanics
mSpellList->add(spell);
}
void Spells::add (const std::string& spellId)
void Spells::add(std::string_view spellId)
{
add(SpellList::getSpell(spellId));
}
@ -72,7 +72,7 @@ namespace MWMechanics
mSpells.emplace_back(spell);
}
void Spells::remove (const std::string& spellId)
void Spells::remove(std::string_view spellId)
{
const auto spell = SpellList::getSpell(spellId);
removeSpell(spell);

@ -69,16 +69,16 @@ namespace MWMechanics
std::vector<const ESM::Spell*>::const_iterator end() const;
bool hasSpell(const std::string& spell) const;
bool hasSpell(std::string_view spell) const;
bool hasSpell(const ESM::Spell* spell) const;
void add (const std::string& spell);
void add(std::string_view spell);
///< Adding a spell that is already listed in *this is a no-op.
void add (const ESM::Spell* spell);
///< Adding a spell that is already listed in *this is a no-op.
void remove (const std::string& spell);
void remove(std::string_view spell);
///< If the spell to be removed is the selected spell, the selected spell will be changed to
/// no spell (empty string).

@ -168,7 +168,7 @@ namespace MWScript
if (cellID.empty())
return;
if (!MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>().search(std::string{cellID}))
if (!MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>().search(cellID))
return;
MWMechanics::AiEscort escortPackage(actorID, cellID, static_cast<int>(duration), x, y, z, repeat);

@ -310,7 +310,7 @@ namespace MWScript
std::string InterpreterContext::getNPCRank() const
{
const MWWorld::Ptr& ptr = getReferenceImp();
std::string faction = ptr.getClass().getPrimaryFaction(ptr);
std::string_view faction = ptr.getClass().getPrimaryFaction(ptr);
if (faction.empty())
throw std::runtime_error("getNPCRank(): NPC is not in a faction");
@ -350,7 +350,7 @@ namespace MWScript
MWBase::World *world = MWBase::Environment::get().getWorld();
MWWorld::Ptr player = world->getPlayerPtr();
std::string factionId = getReferenceImp().getClass().getPrimaryFaction(getReferenceImp());
std::string_view factionId = getReferenceImp().getClass().getPrimaryFaction(getReferenceImp());
if (factionId.empty())
throw std::runtime_error("getPCRank(): NPC is not in a faction");
@ -379,7 +379,7 @@ namespace MWScript
MWBase::World *world = MWBase::Environment::get().getWorld();
MWWorld::Ptr player = world->getPlayerPtr();
std::string factionId = getReferenceImp().getClass().getPrimaryFaction(getReferenceImp());
std::string_view factionId = getReferenceImp().getClass().getPrimaryFaction(getReferenceImp());
if (factionId.empty())
throw std::runtime_error("getPCNextRank(): NPC is not in a faction");

@ -1215,7 +1215,7 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
std::string spellId{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view spellId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
std::string targetId = ::Misc::StringUtils::lowerCase(runtime.getStringLiteral(runtime[0].mInteger));
@ -1224,7 +1224,7 @@ namespace MWScript
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().search(spellId);
if (!spell)
{
runtime.getContext().report("spellcasting failed: cannot find spell \""+spellId+"\"");
runtime.getContext().report("spellcasting failed: cannot find spell \""+std::string(spellId)+"\"");
return;
}
@ -1264,13 +1264,13 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
std::string spellId{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view spellId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().search(spellId);
if (!spell)
{
runtime.getContext().report("spellcasting failed: cannot find spell \""+spellId+"\"");
runtime.getContext().report("spellcasting failed: cannot find spell \""+std::string(spellId)+"\"");
return;
}
@ -1427,7 +1427,7 @@ namespace MWScript
public:
void execute(Interpreter::Runtime &runtime) override
{
std::string levId{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view levId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
std::string_view creatureId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
@ -1445,7 +1445,7 @@ namespace MWScript
public:
void execute(Interpreter::Runtime &runtime) override
{
std::string levId{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view levId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
std::string_view creatureId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
@ -1463,7 +1463,7 @@ namespace MWScript
public:
void execute(Interpreter::Runtime &runtime) override
{
std::string levId{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view levId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
std::string_view itemId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
@ -1481,7 +1481,7 @@ namespace MWScript
public:
void execute(Interpreter::Runtime &runtime) override
{
std::string levId{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view levId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
std::string_view itemId = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();

@ -87,7 +87,7 @@ namespace MWScript
void execute (Interpreter::Runtime& runtime) override
{
std::string region{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view region{runtime.getStringLiteral(runtime[0].mInteger)};
runtime.pop();
Interpreter::Type_Integer id = runtime[0].mInteger;
@ -97,7 +97,7 @@ namespace MWScript
if (reg)
MWBase::Environment::get().getWorld()->changeWeather(region, id);
else
runtime.getContext().report("Warning: Region \"" + region + "\" was not found");
runtime.getContext().report("Warning: Region \"" + std::string(region) + "\" was not found");
}
};
@ -107,7 +107,7 @@ namespace MWScript
void execute (Interpreter::Runtime& runtime, unsigned int arg0) override
{
std::string region{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view region{runtime.getStringLiteral(runtime[0].mInteger)};
runtime.pop();
std::vector<char> chances;

@ -31,9 +31,9 @@
namespace
{
std::string getDialogueActorFaction(const MWWorld::ConstPtr& actor)
std::string_view getDialogueActorFaction(const MWWorld::ConstPtr& actor)
{
std::string factionId = actor.getClass().getPrimaryFaction(actor);
std::string_view factionId = actor.getClass().getPrimaryFaction(actor);
if (factionId.empty())
throw std::runtime_error (
"failed to determine dialogue actors faction (because actor is factionless)");
@ -453,7 +453,7 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
std::string id{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view id = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find (id);
@ -480,7 +480,7 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
std::string id{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view id = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
MWMechanics::CreatureStats& creatureStats = ptr.getClass().getCreatureStats(ptr);
@ -538,7 +538,7 @@ namespace MWScript
MWWorld::Ptr ptr = R()(runtime);
std::string id{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view id = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
Interpreter::Type_Integer value = 0;
@ -559,7 +559,7 @@ namespace MWScript
{
MWWorld::ConstPtr actor = R()(runtime, false);
std::string factionID;
std::string_view factionID;
if(arg0==0)
{
@ -570,11 +570,10 @@ namespace MWScript
factionID = runtime.getStringLiteral (runtime[0].mInteger);
runtime.pop();
}
::Misc::StringUtils::lowerCaseInPlace(factionID);
// Make sure this faction exists
MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(factionID);
if(factionID != "")
if(!factionID.empty())
{
MWWorld::Ptr player = MWMechanics::getPlayer();
player.getClass().getNpcStats(player).joinFaction(factionID);
@ -591,7 +590,7 @@ namespace MWScript
{
MWWorld::ConstPtr actor = R()(runtime, false);
std::string factionID;
std::string_view factionID;
if(arg0==0)
{
@ -602,14 +601,13 @@ namespace MWScript
factionID = runtime.getStringLiteral (runtime[0].mInteger);
runtime.pop();
}
::Misc::StringUtils::lowerCaseInPlace(factionID);
// Make sure this faction exists
MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(factionID);
if(factionID != "")
if(!factionID.empty())
{
MWWorld::Ptr player = MWMechanics::getPlayer();
if(player.getClass().getNpcStats(player).getFactionRanks().find(factionID) == player.getClass().getNpcStats(player).getFactionRanks().end())
if(!player.getClass().getNpcStats(player).isInFaction(factionID))
{
player.getClass().getNpcStats(player).joinFaction(factionID);
}
@ -630,7 +628,7 @@ namespace MWScript
{
MWWorld::ConstPtr actor = R()(runtime, false);
std::string factionID;
std::string_view factionID;
if(arg0==0)
{
@ -641,11 +639,10 @@ namespace MWScript
factionID = runtime.getStringLiteral (runtime[0].mInteger);
runtime.pop();
}
::Misc::StringUtils::lowerCaseInPlace(factionID);
// Make sure this faction exists
MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(factionID);
if(factionID != "")
if(!factionID.empty())
{
MWWorld::Ptr player = MWMechanics::getPlayer();
player.getClass().getNpcStats(player).lowerRank(factionID);
@ -662,7 +659,7 @@ namespace MWScript
{
MWWorld::ConstPtr ptr = R()(runtime, false);
std::string factionID;
std::string_view factionID;
if(arg0 >0)
{
factionID = runtime.getStringLiteral (runtime[0].mInteger);
@ -672,21 +669,13 @@ namespace MWScript
{
factionID = ptr.getClass().getPrimaryFaction(ptr);
}
::Misc::StringUtils::lowerCaseInPlace(factionID);
// Make sure this faction exists
MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(factionID);
MWWorld::Ptr player = MWMechanics::getPlayer();
if(factionID!="")
if(!factionID.empty())
{
if(player.getClass().getNpcStats(player).getFactionRanks().find(factionID) != player.getClass().getNpcStats(player).getFactionRanks().end())
{
runtime.push(player.getClass().getNpcStats(player).getFactionRanks().at(factionID));
}
else
{
runtime.push(-1);
}
MWWorld::Ptr player = MWMechanics::getPlayer();
runtime.push(player.getClass().getNpcStats(player).getFactionRank(factionID));
}
else
{
@ -783,8 +772,6 @@ namespace MWScript
if (factionId.empty())
throw std::runtime_error ("failed to determine faction");
::Misc::StringUtils::lowerCaseInPlace (factionId);
MWWorld::Ptr player = MWMechanics::getPlayer();
runtime.push (
player.getClass().getNpcStats (player).getFactionReputation (factionId));
@ -818,8 +805,6 @@ namespace MWScript
if (factionId.empty())
throw std::runtime_error ("failed to determine faction");
::Misc::StringUtils::lowerCaseInPlace (factionId);
MWWorld::Ptr player = MWMechanics::getPlayer();
player.getClass().getNpcStats (player).setFactionReputation (factionId, value);
}
@ -852,8 +837,6 @@ namespace MWScript
if (factionId.empty())
throw std::runtime_error ("failed to determine faction");
::Misc::StringUtils::lowerCaseInPlace (factionId);
MWWorld::Ptr player = MWMechanics::getPlayer();
player.getClass().getNpcStats (player).setFactionReputation (factionId,
player.getClass().getNpcStats (player).getFactionReputation (factionId)+
@ -926,7 +909,7 @@ namespace MWScript
{
MWWorld::ConstPtr ptr = R()(runtime, false);
std::string factionID;
std::string_view factionID;
if(arg0 >0 )
{
factionID = runtime.getStringLiteral (runtime[0].mInteger);
@ -936,9 +919,8 @@ namespace MWScript
{
factionID = ptr.getClass().getPrimaryFaction(ptr);
}
::Misc::StringUtils::lowerCaseInPlace(factionID);
MWWorld::Ptr player = MWMechanics::getPlayer();
if(factionID!="")
if(!factionID.empty())
{
runtime.push(player.getClass().getNpcStats(player).getExpelled(factionID));
}
@ -958,7 +940,7 @@ namespace MWScript
{
MWWorld::ConstPtr ptr = R()(runtime, false);
std::string factionID;
std::string_view factionID;
if(arg0 >0 )
{
factionID = runtime.getStringLiteral (runtime[0].mInteger);
@ -969,7 +951,7 @@ namespace MWScript
factionID = ptr.getClass().getPrimaryFaction(ptr);
}
MWWorld::Ptr player = MWMechanics::getPlayer();
if(factionID!="")
if(!factionID.empty())
{
player.getClass().getNpcStats(player).expell(factionID);
}
@ -985,7 +967,7 @@ namespace MWScript
{
MWWorld::ConstPtr ptr = R()(runtime, false);
std::string factionID;
std::string_view factionID;
if(arg0 >0 )
{
factionID = runtime.getStringLiteral (runtime[0].mInteger);
@ -996,7 +978,7 @@ namespace MWScript
factionID = ptr.getClass().getPrimaryFaction(ptr);
}
MWWorld::Ptr player = MWMechanics::getPlayer();
if(factionID!="")
if(!factionID.empty())
player.getClass().getNpcStats(player).clearExpelled(factionID);
}
};
@ -1010,7 +992,7 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
std::string factionID = ptr.getClass().getPrimaryFaction(ptr);
std::string_view factionID = ptr.getClass().getPrimaryFaction(ptr);
if(factionID.empty())
return;
@ -1045,7 +1027,7 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
std::string factionID = ptr.getClass().getPrimaryFaction(ptr);
std::string_view factionID = ptr.getClass().getPrimaryFaction(ptr);
if(factionID.empty())
return;

@ -381,7 +381,7 @@ namespace MWScript
runtime.pop();
Interpreter::Type_Float zRot = runtime[0].mFloat;
runtime.pop();
std::string cellID{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view cellID = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
if (ptr.getContainerStore())
@ -404,7 +404,7 @@ namespace MWScript
const ESM::Cell* cell = MWBase::Environment::get().getWorld()->getExterior(cellID);
if(!cell)
{
std::string error = "Warning: PositionCell: unknown interior cell (" + cellID + ")";
std::string error = "Warning: PositionCell: unknown interior cell (" + std::string(cellID) + ")";
if(isPlayer)
error += ", moving to exterior instead";
runtime.getContext().report (error);
@ -496,7 +496,7 @@ namespace MWScript
{
std::string_view itemID = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
std::string cellID{runtime.getStringLiteral(runtime[0].mInteger)};
std::string_view cellID = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
Interpreter::Type_Float x = runtime[0].mFloat;
@ -520,7 +520,7 @@ namespace MWScript
store = MWBase::Environment::get().getWorld()->getExterior(cellIndex.x(), cellIndex.y());
if(!cell)
{
runtime.getContext().report ("unknown cell (" + cellID + ")");
runtime.getContext().report("unknown cell (" + std::string(cellID) + ")");
Log(Debug::Error) << "Error: unknown cell (" << cellID << ")";
}
}

@ -197,7 +197,7 @@ void MWState::StateManager::saveGame (const std::string& description, const Slot
if (!character)
{
MWWorld::ConstPtr player = MWMechanics::getPlayer();
std::string name = player.get<ESM::NPC>()->mBase->mName;
const std::string& name = player.get<ESM::NPC>()->mBase->mName;
character = mCharacterManager.createCharacter(name);
mCharacterManager.setCurrentCharacter(character);
@ -214,7 +214,7 @@ void MWState::StateManager::saveGame (const std::string& description, const Slot
profile.mPlayerName = player.get<ESM::NPC>()->mBase->mName;
profile.mPlayerLevel = player.getClass().getNpcStats (player).getLevel();
std::string classId = player.get<ESM::NPC>()->mBase->mClass;
const std::string& classId = player.get<ESM::NPC>()->mBase->mClass;
if (world.getStore().get<ESM::Class>().isDynamic(classId))
profile.mPlayerClassName = world.getStore().get<ESM::Class>().find(classId)->mName;
else

@ -172,7 +172,7 @@ MWWorld::CellStore *MWWorld::Cells::getExterior (int x, int y)
return &result->second;
}
MWWorld::CellStore *MWWorld::Cells::getInterior (const std::string& name)
MWWorld::CellStore* MWWorld::Cells::getInterior(std::string_view name)
{
std::string lowerName = Misc::StringUtils::lowerCase(name);
std::map<std::string, CellStore>::iterator result = mInteriors.find (lowerName);

@ -56,7 +56,7 @@ namespace MWWorld
CellStore *getExterior (int x, int y);
CellStore *getInterior (const std::string& name);
CellStore* getInterior(std::string_view name);
CellStore *getCell (const ESM::CellId& id);

@ -483,9 +483,9 @@ namespace MWWorld
throw std::runtime_error("class does not support fight rating");
}
std::string Class::getPrimaryFaction (const MWWorld::ConstPtr& ptr) const
std::string_view Class::getPrimaryFaction(const MWWorld::ConstPtr& ptr) const
{
return std::string();
return {};
}
int Class::getPrimaryFactionRank (const MWWorld::ConstPtr& ptr) const
{

@ -355,7 +355,7 @@ namespace MWWorld
virtual int getBaseFightRating (const MWWorld::ConstPtr& ptr) const;
virtual std::string getPrimaryFaction (const MWWorld::ConstPtr& ptr) const;
virtual std::string_view getPrimaryFaction(const MWWorld::ConstPtr& ptr) const;
virtual int getPrimaryFactionRank (const MWWorld::ConstPtr& ptr) const;
/// Get the effective armor rating, factoring in the actor's skills, for the given armor.

@ -306,7 +306,7 @@ void ESMStore::countAllCellRefs(ESM::ReadersCache& readers)
Misc::forEachUnique(refs.rbegin(), refs.rend(), equalByRefNum, incrementRefCount);
}
int ESMStore::getRefCount(const std::string& id) const
int ESMStore::getRefCount(std::string_view id) const
{
const std::string lowerId = Misc::StringUtils::lowerCase(id);
auto it = mRefCount.find(lowerId);

@ -120,7 +120,7 @@ namespace MWWorld
}
/// Look up the given ID in 'all'. Returns 0 if not found.
int find(const std::string &id) const
int find(std::string_view id) const
{
IDMap::const_iterator it = mIds.find(id);
if (it == mIds.end()) {
@ -284,7 +284,7 @@ namespace MWWorld
void checkPlayer();
/// @return The number of instances defined in the base files. Excludes changes from the save file.
int getRefCount(const std::string& id) const;
int getRefCount(std::string_view id) const;
/// Actors with the same ID share spells, abilities, etc.
/// @return The shared spell list to use for this actor and whether or not it has already been initialized.

@ -12,6 +12,22 @@
#include <stdexcept>
#include <sstream>
namespace
{
// TODO: Switch to C++23 to get a working version of std::unordered_map::erase
template<class T>
bool eraseFromMap(T& map, std::string_view value)
{
auto it = map.find(value);
if(it != map.end())
{
map.erase(it);
return true;
}
return false;
}
}
namespace MWWorld
{
RecordId::RecordId(const std::string &id, bool isDeleted)
@ -97,7 +113,7 @@ namespace MWWorld
}
template<typename T>
const T *Store<T>::search(const std::string &id) const
const T* Store<T>::search(std::string_view id) const
{
typename Dynamic::const_iterator dit = mDynamic.find(id);
if (dit != mDynamic.end())
@ -110,7 +126,7 @@ namespace MWWorld
return nullptr;
}
template<typename T>
const T *Store<T>::searchStatic(const std::string &id) const
const T* Store<T>::searchStatic(std::string_view id) const
{
typename Static::const_iterator it = mStatic.find(id);
if (it != mStatic.end())
@ -120,13 +136,13 @@ namespace MWWorld
}
template<typename T>
bool Store<T>::isDynamic(const std::string &id) const
bool Store<T>::isDynamic(std::string_view id) const
{
typename Dynamic::const_iterator dit = mDynamic.find(id);
return (dit != mDynamic.end());
}
template<typename T>
const T *Store<T>::searchRandom(const std::string &id, Misc::Rng::Generator& prng) const
const T* Store<T>::searchRandom(std::string_view id, Misc::Rng::Generator& prng) const
{
std::vector<const T*> results;
std::copy_if(mShared.begin(), mShared.end(), std::back_inserter(results),
@ -139,7 +155,7 @@ namespace MWWorld
return nullptr;
}
template<typename T>
const T *Store<T>::find(const std::string &id) const
const T* Store<T>::find(std::string_view id) const
{
const T *ptr = search(id);
if (ptr == nullptr)
@ -226,7 +242,7 @@ namespace MWWorld
return ptr;
}
template<typename T>
bool Store<T>::eraseStatic(const std::string &id)
bool Store<T>::eraseStatic(std::string_view id)
{
typename Static::iterator it = mStatic.find(id);
@ -249,9 +265,9 @@ namespace MWWorld
}
template<typename T>
bool Store<T>::erase(const std::string &id)
bool Store<T>::erase(std::string_view id)
{
if (!mDynamic.erase(id))
if (!eraseFromMap(mDynamic, id))
return false;
// have to reinit the whole shared part
@ -475,7 +491,7 @@ namespace MWWorld
esm.restoreContext(ctx);
}
const ESM::Cell *Store<ESM::Cell>::search(const std::string &id) const
const ESM::Cell* Store<ESM::Cell>::search(std::string_view id) const
{
DynamicInt::const_iterator it = mInt.find(id);
if (it != mInt.end()) {
@ -534,12 +550,12 @@ namespace MWWorld
return &mExt.insert(std::make_pair(key, newCell)).first->second;
}
const ESM::Cell *Store<ESM::Cell>::find(const std::string &id) const
const ESM::Cell* Store<ESM::Cell>::find(std::string_view id) const
{
const ESM::Cell *ptr = search(id);
if (ptr == nullptr)
{
const std::string msg = "Cell '" + id + "' not found";
const std::string msg = "Cell '" + std::string(id) + "' not found";
throw std::runtime_error(msg);
}
return ptr;
@ -677,7 +693,7 @@ namespace MWWorld
{
return iterator(mSharedExt.end());
}
const ESM::Cell *Store<ESM::Cell>::searchExtByName(const std::string &id) const
const ESM::Cell* Store<ESM::Cell>::searchExtByName(std::string_view id) const
{
const ESM::Cell *cell = nullptr;
for (const ESM::Cell *sharedCell : mSharedExt)
@ -694,7 +710,7 @@ namespace MWWorld
}
return cell;
}
const ESM::Cell *Store<ESM::Cell>::searchExtByRegion(const std::string &id) const
const ESM::Cell* Store<ESM::Cell>::searchExtByRegion(std::string_view id) const
{
const ESM::Cell *cell = nullptr;
for (const ESM::Cell *sharedCell : mSharedExt)
@ -760,7 +776,7 @@ namespace MWWorld
}
return erase(cell.mName);
}
bool Store<ESM::Cell>::erase(const std::string &id)
bool Store<ESM::Cell>::erase(std::string_view id)
{
DynamicInt::iterator it = mDynamicInt.find(id);
@ -877,7 +893,7 @@ namespace MWWorld
return &(it->second);
return nullptr;
}
const ESM::Pathgrid *Store<ESM::Pathgrid>::search(const std::string& name) const
const ESM::Pathgrid* Store<ESM::Pathgrid>::search(std::string_view name) const
{
Interior::const_iterator it = mInt.find(name);
if (it != mInt.end())
@ -894,12 +910,12 @@ namespace MWWorld
}
return pathgrid;
}
const ESM::Pathgrid* Store<ESM::Pathgrid>::find(const std::string& name) const
const ESM::Pathgrid* Store<ESM::Pathgrid>::find(std::string_view name) const
{
const ESM::Pathgrid* pathgrid = search(name);
if (!pathgrid)
{
const std::string msg = "Pathgrid in cell '" + name + "' not found";
const std::string msg = "Pathgrid in cell '" + std::string(name) + "' not found";
throw std::runtime_error(msg);
}
return pathgrid;
@ -1012,7 +1028,7 @@ namespace MWWorld
mKeywordSearchModFlag = true;
}
const ESM::Dialogue *Store<ESM::Dialogue>::search(const std::string &id) const
const ESM::Dialogue* Store<ESM::Dialogue>::search(std::string_view id) const
{
typename Static::const_iterator it = mStatic.find(id);
if (it != mStatic.end())
@ -1021,7 +1037,7 @@ namespace MWWorld
return nullptr;
}
const ESM::Dialogue *Store<ESM::Dialogue>::find(const std::string &id) const
const ESM::Dialogue* Store<ESM::Dialogue>::find(std::string_view id) const
{
const ESM::Dialogue *ptr = search(id);
if (ptr == nullptr)
@ -1072,9 +1088,9 @@ namespace MWWorld
return RecordId(dialogue.mId, isDeleted);
}
bool Store<ESM::Dialogue>::eraseStatic(const std::string &id)
bool Store<ESM::Dialogue>::eraseStatic(std::string_view id)
{
if (mStatic.erase(id))
if (eraseFromMap(mStatic, id))
mKeywordSearchModFlag = true;
return true;

@ -31,7 +31,7 @@ namespace MWWorld
std::string mId;
bool mIsDeleted;
RecordId(const std::string &id = "", bool isDeleted = false);
RecordId(const std::string &id = {}, bool isDeleted = false);
};
class StoreBase
@ -48,7 +48,7 @@ namespace MWWorld
virtual int getDynamicSize() const { return 0; }
virtual RecordId load(ESM::ESMReader &esm) = 0;
virtual bool eraseStatic(const std::string &id) {return false;}
virtual bool eraseStatic(std::string_view id) { return false; }
virtual void clearDynamic() {}
virtual void write (ESM::ESMWriter& writer, Loading::Listener& progress) const {}
@ -175,19 +175,19 @@ namespace MWWorld
void clearDynamic() override;
void setUp() override;
const T *search(const std::string &id) const;
const T *searchStatic(const std::string &id) const;
const T* search(std::string_view id) const;
const T* searchStatic(std::string_view id) const;
/**
* Does the record with this ID come from the dynamic store?
*/
bool isDynamic(const std::string &id) const;
bool isDynamic(std::string_view id) const;
/** Returns a random record that starts with the named ID, or nullptr if not found. */
const T *searchRandom(const std::string &id, Misc::Rng::Generator& prng) const;
const T* searchRandom(std::string_view id, Misc::Rng::Generator& prng) const;
// calls `search` and throws an exception if not found
const T *find(const std::string &id) const;
const T* find(std::string_view id) const;
iterator begin() const;
iterator end() const;
@ -201,8 +201,8 @@ namespace MWWorld
T *insert(const T &item, bool overrideOnly = false);
T *insertStatic(const T &item);
bool eraseStatic(const std::string &id) override;
bool erase(const std::string &id);
bool eraseStatic(std::string_view id) override;
bool erase(std::string_view id);
bool erase(const T &item);
RecordId load(ESM::ESMReader &esm) override;
@ -318,12 +318,12 @@ namespace MWWorld
public:
typedef SharedIterator<ESM::Cell> iterator;
const ESM::Cell *search(const std::string &id) const;
const ESM::Cell* search(std::string_view id) const;
const ESM::Cell *search(int x, int y) const;
const ESM::Cell *searchStatic(int x, int y) const;
const ESM::Cell *searchOrCreate(int x, int y);
const ESM::Cell *find(const std::string &id) const;
const ESM::Cell* find(std::string_view id) const;
const ESM::Cell *find(int x, int y) const;
void clearDynamic() override;
@ -337,10 +337,10 @@ namespace MWWorld
iterator extEnd() const;
// Return the northernmost cell in the easternmost column.
const ESM::Cell *searchExtByName(const std::string &id) const;
const ESM::Cell* searchExtByName(std::string_view id) const;
// Return the northernmost cell in the easternmost column.
const ESM::Cell *searchExtByRegion(const std::string &id) const;
const ESM::Cell* searchExtByRegion(std::string_view id) const;
size_t getSize() const override;
size_t getExtSize() const;
@ -351,7 +351,7 @@ namespace MWWorld
ESM::Cell *insert(const ESM::Cell &cell);
bool erase(const ESM::Cell &cell);
bool erase(const std::string &id);
bool erase(std::string_view id);
bool erase(int x, int y);
};
@ -379,9 +379,9 @@ namespace MWWorld
void setUp() override;
const ESM::Pathgrid *search(int x, int y) const;
const ESM::Pathgrid *search(const std::string& name) const;
const ESM::Pathgrid* search(std::string_view name) const;
const ESM::Pathgrid *find(int x, int y) const;
const ESM::Pathgrid* find(const std::string& name) const;
const ESM::Pathgrid* find(std::string_view name) const;
const ESM::Pathgrid *search(const ESM::Cell &cell) const;
const ESM::Pathgrid *find(const ESM::Cell &cell) const;
};
@ -470,15 +470,15 @@ namespace MWWorld
void setUp() override;
const ESM::Dialogue *search(const std::string &id) const;
const ESM::Dialogue *find(const std::string &id) const;
const ESM::Dialogue* search(std::string_view id) const;
const ESM::Dialogue* find(std::string_view id) const;
iterator begin() const;
iterator end() const;
size_t getSize() const override;
bool eraseStatic(const std::string &id) override;
bool eraseStatic(std::string_view id) override;
RecordId load(ESM::ESMReader &esm) override;

@ -626,7 +626,7 @@ namespace
stopSounds();
}
void WeatherManager::changeWeather(const std::string& regionID, const unsigned int weatherID)
void WeatherManager::changeWeather(std::string_view regionID, const unsigned int weatherID)
{
// In Morrowind, this seems to have the following behavior, when applied to the current region:
// - When there is no transition in progress, start transitioning to the new weather.
@ -648,7 +648,7 @@ namespace
}
}
void WeatherManager::modRegion(const std::string& regionID, const std::vector<char>& chances)
void WeatherManager::modRegion(std::string_view regionID, const std::vector<char>& chances)
{
// Sets the region's probability for various weather patterns. Note that this appears to be saved permanently.
// In Morrowind, this seems to have the following behavior when applied to the current region:

@ -284,8 +284,8 @@ namespace MWWorld
* @param region that should be changed
* @param ID of the weather setting to shift to
*/
void changeWeather(const std::string& regionID, const unsigned int weatherID);
void modRegion(const std::string& regionID, const std::vector<char>& chances);
void changeWeather(std::string_view regionID, const unsigned int weatherID);
void modRegion(std::string_view regionID, const std::vector<char>& chances);
void playerTeleported(const std::string& playerRegion, bool isExterior);
/**

@ -547,7 +547,7 @@ namespace MWWorld
mRandomSeed = seed;
}
const ESM::Cell* World::getExterior(const std::string& cellName) const
const ESM::Cell* World::getExterior(std::string_view cellName) const
{
// first try named cells
const ESM::Cell *cell = mStore.get<ESM::Cell>().searchExtByName (cellName);
@ -579,7 +579,7 @@ namespace MWWorld
return mCells.getExterior (x, y);
}
CellStore *World::getInterior (const std::string& name)
CellStore *World::getInterior(std::string_view name)
{
return mCells.getInterior (name);
}
@ -2040,12 +2040,12 @@ namespace MWWorld
return mWeatherManager->getNightDayMode();
}
void World::changeWeather(const std::string& region, const unsigned int id)
void World::changeWeather(std::string_view region, const unsigned int id)
{
mWeatherManager->changeWeather(region, id);
}
void World::modRegion(const std::string &regionid, const std::vector<char> &chances)
void World::modRegion(std::string_view regionid, const std::vector<char>& chances)
{
mWeatherManager->modRegion(regionid, chances);
}
@ -2767,7 +2767,7 @@ namespace MWWorld
physicActor->enableCollisionBody(enable);
}
bool World::findInteriorPosition(const std::string &name, ESM::Position &pos)
bool World::findInteriorPosition(std::string_view name, ESM::Position& pos)
{
pos.rot[0] = pos.rot[1] = pos.rot[2] = 0;
pos.pos[0] = pos.pos[1] = pos.pos[2] = 0;
@ -3686,7 +3686,7 @@ namespace MWWorld
return file;
}
void World::spawnRandomCreature(const std::string &creatureList)
void World::spawnRandomCreature(std::string_view creatureList)
{
const ESM::CreatureLevList* list = mStore.get<ESM::CreatureLevList>().find(creatureList);
@ -3883,7 +3883,7 @@ namespace MWWorld
return mPhysics->getHitDistance(weaponPos, target) - halfExtents.y();
}
void preload(MWWorld::Scene* scene, const ESMStore& store, const std::string& obj)
void preload(MWWorld::Scene* scene, const ESMStore& store, std::string_view obj)
{
if (obj.empty())
return;

@ -222,7 +222,7 @@ namespace MWWorld
CellStore *getExterior (int x, int y) override;
CellStore *getInterior (const std::string& name) override;
CellStore* getInterior(std::string_view name) override;
CellStore *getCell (const ESM::CellId& id) override;
@ -333,7 +333,7 @@ namespace MWWorld
bool toggleSky() override;
///< \return Resulting mode
void changeWeather (const std::string& region, const unsigned int id) override;
void changeWeather(std::string_view region, const unsigned int id) override;
int getCurrentWeather() const override;
@ -349,7 +349,7 @@ namespace MWWorld
void setMoonColour (bool red) override;
void modRegion(const std::string &regionid, const std::vector<char> &chances) override;
void modRegion(std::string_view regionid, const std::vector<char> &chances) override;
float getTimeScaleFactor() const override;
@ -368,7 +368,7 @@ namespace MWWorld
void changeToCell (const ESM::CellId& cellId, const ESM::Position& position, bool adjustPlayerPos, bool changeEvent=true) override;
///< @param changeEvent If false, do not trigger cell change flag or detect worldspace changes
const ESM::Cell *getExterior (const std::string& cellName) const override;
const ESM::Cell* getExterior(std::string_view cellName) const override;
///< Return a cell matching the given name or a 0-pointer, if there is no such cell.
void markCellAsUnchanged() override;
@ -617,7 +617,7 @@ namespace MWWorld
/// Find position in interior cell near door entrance
/// \return false if interior with given name not exists, true otherwise
bool findInteriorPosition(const std::string &name, ESM::Position &pos) override;
bool findInteriorPosition(std::string_view name, ESM::Position &pos) override;
/// Enables or disables use of teleport spell effects (recall, intervention, etc).
void enableTeleporting(bool enable) override;
@ -687,7 +687,7 @@ namespace MWWorld
void goToJail () override;
/// Spawn a random creature from a levelled list next to the player
void spawnRandomCreature(const std::string& creatureList) override;
void spawnRandomCreature(std::string_view creatureList) override;
/// Spawn a blood effect for \a ptr at \a worldPosition
void spawnBloodEffect (const MWWorld::Ptr& ptr, const osg::Vec3f& worldPosition) override;

@ -57,6 +57,8 @@ namespace Misc::StringUtils
struct CiEqual
{
using is_transparent = void;
bool operator()(std::string_view left, std::string_view right) const
{
return ciEqual(left, right);
@ -65,10 +67,12 @@ namespace Misc::StringUtils
struct CiHash
{
std::size_t operator()(std::string str) const
using is_transparent = void;
std::size_t operator()(std::string_view str) const
{
lowerCaseInPlace(str);
return std::hash<std::string>{}(str);
// TODO avoid string copy
return std::hash<std::string>{}(lowerCase(str));
}
};

Loading…
Cancel
Save