mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-19 20:53:52 +00:00
enable move construction/assignment to key ESM data structure to reduce sorting costs
This commit is contained in:
parent
e7665582ad
commit
6dbb53493b
3 changed files with 106 additions and 0 deletions
|
@ -1,6 +1,16 @@
|
|||
#ifndef OPENMW_ESM_DEFS_H
|
||||
#define OPENMW_ESM_DEFS_H
|
||||
|
||||
#if _MSC_VER >= 1600
|
||||
#define OPENMW_ESM_ENABLE_CPP11_MOVE
|
||||
#define OPENMW_ESM_DEFINE_CPP11_MOVE_OPS(Class) \
|
||||
Class () {} \
|
||||
Class (Class const & that) { copy (*this, that); } \
|
||||
Class (Class && that) { move (*this, that); } \
|
||||
Class & operator = (Class const & that) { copy (*this, that); return *this; } \
|
||||
Class & operator = (Class && that) { move (*this, that); return *this; }
|
||||
#endif
|
||||
|
||||
#include <libs/platform/stdint.h>
|
||||
|
||||
namespace ESM
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#include "loadinfo.hpp"
|
||||
|
||||
|
@ -35,6 +36,41 @@ struct Dialogue
|
|||
|
||||
void load(ESMReader &esm);
|
||||
void save(ESMWriter &esm);
|
||||
|
||||
#ifdef OPENMW_ESM_ENABLE_CPP11_MOVE
|
||||
OPENMW_ESM_DEFINE_CPP11_MOVE_OPS(Dialogue)
|
||||
|
||||
static void copy (Dialogue & d, Dialogue const & s)
|
||||
{
|
||||
d.mId = s.mId;
|
||||
d.mType = s.mType;
|
||||
d.mInfo = s.mInfo;
|
||||
}
|
||||
static void move (Dialogue & d, Dialogue & s)
|
||||
{
|
||||
d.mId = std::move (s.mId);
|
||||
d.mType = std::move (s.mType);
|
||||
d.mInfo = std::move (s.mInfo);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
custom swap to prevent memory allocations and deallocations for mId and mInfo
|
||||
while sorting
|
||||
*/
|
||||
namespace std
|
||||
{
|
||||
template <> inline
|
||||
void swap <ESM::Dialogue> (ESM::Dialogue & Left, ESM::Dialogue & Right)
|
||||
{
|
||||
#define _swp(id) std::swap (Left.id, Right.id);
|
||||
_swp(mId);
|
||||
_swp(mType);
|
||||
_swp(mInfo);
|
||||
#undef _swp
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -43,6 +43,22 @@ struct DialInfo
|
|||
{
|
||||
std::string mSelectRule; // This has a complicated format
|
||||
Variant mValue;
|
||||
|
||||
#ifdef OPENMW_ESM_ENABLE_CPP11_MOVE
|
||||
OPENMW_ESM_DEFINE_CPP11_MOVE_OPS(SelectStruct)
|
||||
|
||||
static void copy (SelectStruct & d, SelectStruct const & s)
|
||||
{
|
||||
d.mSelectRule = s.mSelectRule;
|
||||
d.mValue = s.mValue;
|
||||
}
|
||||
|
||||
static void move (SelectStruct & d, SelectStruct & s)
|
||||
{
|
||||
d.mSelectRule = std::move (s.mSelectRule);
|
||||
d.mValue = std::move (s.mValue);
|
||||
}
|
||||
#endif // OPENMW_ESM_ENABLE_CPP11_MOVE
|
||||
};
|
||||
|
||||
// Journal quest indices (introduced with the quest system in Tribunal)
|
||||
|
@ -100,6 +116,50 @@ struct DialInfo
|
|||
|
||||
void load(ESMReader &esm);
|
||||
void save(ESMWriter &esm);
|
||||
|
||||
#ifdef OPENMW_ESM_ENABLE_CPP11_MOVE
|
||||
OPENMW_ESM_DEFINE_CPP11_MOVE_OPS(DialInfo)
|
||||
|
||||
static void copy (DialInfo & d, DialInfo const & s)
|
||||
{
|
||||
d.mData = s.mData;
|
||||
d.mSelects = s.mSelects;
|
||||
d.mId = s.mId;
|
||||
d.mPrev = s.mPrev;
|
||||
d.mNext = s.mNext;
|
||||
d.mActor = s.mActor;
|
||||
d.mRace = s.mRace;
|
||||
d.mClass = s.mClass;
|
||||
d.mNpcFaction = s.mNpcFaction;
|
||||
d.mPcFaction = s.mPcFaction;
|
||||
d.mCell = s.mCell;
|
||||
d.mSound = s.mSound;
|
||||
d.mResponse = s.mResponse;
|
||||
d.mResultScript = s.mResultScript;
|
||||
d.mFactionLess = s.mFactionLess;
|
||||
d.mQuestStatus = s.mQuestStatus;
|
||||
}
|
||||
|
||||
static void move (DialInfo & d, DialInfo & s)
|
||||
{
|
||||
d.mData = std::move (s.mData);
|
||||
d.mSelects = std::move (s.mSelects);
|
||||
d.mId = std::move (s.mId);
|
||||
d.mPrev = std::move (s.mPrev);
|
||||
d.mNext = std::move (s.mNext);
|
||||
d.mActor = std::move (s.mActor);
|
||||
d.mRace = std::move (s.mRace);
|
||||
d.mClass = std::move (s.mClass);
|
||||
d.mNpcFaction = std::move (s.mNpcFaction);
|
||||
d.mPcFaction = std::move (s.mPcFaction);
|
||||
d.mCell = std::move (s.mCell);
|
||||
d.mSound = std::move (s.mSound);
|
||||
d.mResponse = std::move (s.mResponse);
|
||||
d.mResultScript = std::move (s.mResultScript);
|
||||
d.mFactionLess = std::move (s.mFactionLess);
|
||||
d.mQuestStatus = std::move (s.mQuestStatus);
|
||||
}
|
||||
#endif // OPENMW_ESM_ENABLE_CPP11_MOVE
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue