diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index 5219ab72cc..fc7bc21d8b 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -57,7 +57,7 @@ namespace ESM struct ItemLevList; struct TimeStamp; struct RefId; - struct CellVariant; + class CellVariant; } diff --git a/apps/openmw/mwrender/fogmanager.hpp b/apps/openmw/mwrender/fogmanager.hpp index 258371bc9e..a0a2f71047 100644 --- a/apps/openmw/mwrender/fogmanager.hpp +++ b/apps/openmw/mwrender/fogmanager.hpp @@ -5,7 +5,7 @@ namespace MWWorld { - struct Cell; + class Cell; } namespace MWRender diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 70b40f6f67..62e546bdad 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -43,7 +43,7 @@ namespace ESM { struct Cell; struct RefNum; - struct CellVariant; + class CellVariant; } namespace Terrain @@ -74,7 +74,7 @@ namespace DetourNavigator namespace MWWorld { class GroundcoverStore; - struct Cell; + class Cell; } namespace Debug diff --git a/apps/openmw/mwworld/cell.hpp b/apps/openmw/mwworld/cell.hpp index 902f2487e0..a052222005 100644 --- a/apps/openmw/mwworld/cell.hpp +++ b/apps/openmw/mwworld/cell.hpp @@ -24,7 +24,6 @@ namespace MWWorld class Cell : public ESM::CellVariant { - friend MWWorld::CellStore; struct MoodData { uint32_t mAmbiantColor; diff --git a/apps/openmw/mwworld/cellstore.cpp b/apps/openmw/mwworld/cellstore.cpp index 35b6dc98f3..767c3c86d0 100644 --- a/apps/openmw/mwworld/cellstore.cpp +++ b/apps/openmw/mwworld/cellstore.cpp @@ -842,7 +842,7 @@ namespace MWWorld { std::map refNumToID; // used to detect refID modifications - std::visit([&refNumToID, this](auto&& cell) { this->loadRefs(*cell, refNumToID); }, mCellVariant.mVariant); + std::visit([&refNumToID, this](auto&& cell) { this->loadRefs(*cell, refNumToID); }, mCellVariant); updateMergedRefs(); } @@ -1099,7 +1099,7 @@ namespace MWWorld bool CellStore::operator==(const CellStore& right) const { - return std::visit(Visitor{}, this->mCellVariant.mVariant, right.mCellVariant.mVariant); + return std::visit(Visitor{}, this->mCellVariant, right.mCellVariant); } void CellStore::setFog(std::unique_ptr&& fog) diff --git a/components/esm/esmbridge.hpp b/components/esm/esmbridge.hpp index 1439f271c1..7912e66cbe 100644 --- a/components/esm/esmbridge.hpp +++ b/components/esm/esmbridge.hpp @@ -35,10 +35,24 @@ namespace ESM } bool isEsm4() const { return std::holds_alternative(mVariant); } - const ESM4::Cell& getEsm4() const; - const ESM::Cell& getEsm3() const; + + template + auto visit(F&& f) const + { + return std::visit(f, mVariant); + } + template + auto visit(F&& f) + { + return std::visit(f, mVariant); + } + template + auto visit(F&& f, const CellVariant& v2) const + { + return std::visit(f, mVariant, v2.mVariant); + } }; struct ReferenceVariant @@ -65,4 +79,22 @@ namespace ESM }; } +namespace std +{ + template + auto visit(F&& f, const ESM::CellVariant& v) + { + return v.visit(f); + } + template + auto visit(F&& f, ESM::CellVariant& v) + { + return v.visit(f); + } + template + auto visit(F&& f, const ESM::CellVariant& v1, const ESM::CellVariant& v2) + { + return v1.visit(f, v2); + } +} #endif