From 49e21e121ab8d6200a0f0a4d3c5b6425a0485d2e Mon Sep 17 00:00:00 2001 From: Matt <3397065-ZehMatt@users.noreply.gitlab.com> Date: Mon, 4 Apr 2022 17:09:52 +0000 Subject: [PATCH] Revert "Merge branch 'refactor/6677-2' into 'master'" This reverts merge request !1733 --- apps/openmw/mwmechanics/actors.cpp | 10 +- apps/openmw/mwmechanics/actors.hpp | 3 +- apps/openmw/mwphysics/physicssystem.hpp | 9 +- apps/openmw/mwworld/ptr.hpp | 15 -- apps/openmw_test_suite/CMakeLists.txt | 1 - .../misc/test_indexedvector.cpp | 88 --------- components/CMakeLists.txt | 2 +- components/misc/indexedvector.hpp | 186 ------------------ 8 files changed, 9 insertions(+), 305 deletions(-) delete mode 100644 apps/openmw_test_suite/misc/test_indexedvector.cpp delete mode 100644 components/misc/indexedvector.hpp diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 6c2354def2..a024507cf3 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -1057,11 +1057,9 @@ namespace MWMechanics MWRender::Animation *anim = MWBase::Environment::get().getWorld()->getAnimation(ptr); if (!anim) return; + mActors.emplace(ptr, new Actor(ptr, anim)); - auto* newActor = new Actor(ptr, anim); - mActors.emplace(ptr, newActor); - - CharacterController* ctrl = newActor->getCharacterController(); + CharacterController* ctrl = mActors[ptr]->getCharacterController(); if (updateImmediately) ctrl->update(0); @@ -1162,7 +1160,7 @@ namespace MWMechanics mActors.erase(iter); actor->updatePtr(ptr); - mActors.emplace(ptr, actor); + mActors.insert(std::make_pair(ptr, actor)); } } @@ -1175,7 +1173,7 @@ namespace MWMechanics { removeTemporaryEffects(iter->first); delete iter->second; - iter = mActors.erase(iter); + mActors.erase(iter++); } else ++iter; diff --git a/apps/openmw/mwmechanics/actors.hpp b/apps/openmw/mwmechanics/actors.hpp index e6ec6c1021..f1985377e8 100644 --- a/apps/openmw/mwmechanics/actors.hpp +++ b/apps/openmw/mwmechanics/actors.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include "../mwmechanics/actorutil.hpp" @@ -63,7 +62,7 @@ namespace MWMechanics Actors(); ~Actors(); - using PtrActorMap = Misc::IndexedVector; + typedef std::map PtrActorMap; PtrActorMap::const_iterator begin() { return mActors.begin(); } PtrActorMap::const_iterator end() { return mActors.end(); } diff --git a/apps/openmw/mwphysics/physicssystem.hpp b/apps/openmw/mwphysics/physicssystem.hpp index 30c1aa47c0..b165f10761 100644 --- a/apps/openmw/mwphysics/physicssystem.hpp +++ b/apps/openmw/mwphysics/physicssystem.hpp @@ -11,8 +11,6 @@ #include #include -#include - #include #include #include @@ -57,7 +55,7 @@ namespace MWPhysics class PhysicsTaskScheduler; class Projectile; - using ActorMap = Misc::IndexedVector>; + using ActorMap = std::unordered_map>; struct ContactPoint { @@ -301,9 +299,8 @@ namespace MWPhysics using ObjectMap = std::unordered_map>; ObjectMap mObjects; - - using AnimatedObjectMap = Misc::IndexedVector; - AnimatedObjectMap mAnimatedObjects; // stores pointers to elements in mObjects + + std::map mAnimatedObjects; // stores pointers to elements in mObjects ActorMap mActors; diff --git a/apps/openmw/mwworld/ptr.hpp b/apps/openmw/mwworld/ptr.hpp index 911f62dac0..33e062df90 100644 --- a/apps/openmw/mwworld/ptr.hpp +++ b/apps/openmw/mwworld/ptr.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include "livecellref.hpp" @@ -162,20 +161,6 @@ namespace MWWorld ConstPtr(const LiveCellRefBase *liveCellRef=nullptr, const CellStoreType *cell=nullptr) : PtrBase(liveCellRef, cell, nullptr) {} }; - struct PtrHash - { - size_t operator()(const Ptr& ptr) const noexcept - { - const void* p = ptr; - return std::hash{}(p); - } - size_t operator()(const ConstPtr& ptr) const noexcept - { - const void* p = ptr; - return std::hash{}(p); - } - }; - } #endif diff --git a/apps/openmw_test_suite/CMakeLists.txt b/apps/openmw_test_suite/CMakeLists.txt index 3f3a134b45..854526dc8c 100644 --- a/apps/openmw_test_suite/CMakeLists.txt +++ b/apps/openmw_test_suite/CMakeLists.txt @@ -30,7 +30,6 @@ if (GTEST_FOUND AND GMOCK_FOUND) misc/test_stringops.cpp misc/test_endianness.cpp misc/test_resourcehelpers.cpp - misc/test_indexedvector.cpp misc/progressreporter.cpp misc/compression.cpp diff --git a/apps/openmw_test_suite/misc/test_indexedvector.cpp b/apps/openmw_test_suite/misc/test_indexedvector.cpp deleted file mode 100644 index 7039aed1fb..0000000000 --- a/apps/openmw_test_suite/misc/test_indexedvector.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include - -#include -#include - -#include -#include - -namespace -{ - TEST(IndexedVectorTests, basicInsert) - { - std::vector> vec; - Misc::IndexedVector map; - - for (int i = 0; i < 10000; i++) - { - vec.emplace_back(i, i << 13); - map.emplace(i, i << 13); - } - - ASSERT_EQ(vec.size(), map.size()); - - auto itVec = vec.begin(); - auto itMap = map.begin(); - while (itMap != map.end() && itVec != vec.end()) - { - ASSERT_EQ(itVec->first, itMap->first); - ASSERT_EQ(itVec->second, itMap->second); - itMap++; - itVec++; - } - } - - TEST(IndexedVectorTests, duplicateInsert) - { - Misc::IndexedVector map; - - auto pairVal = map.emplace(1, 5); - ASSERT_EQ(map.size(), 1); - ASSERT_EQ(pairVal.first, map.begin()); - ASSERT_EQ(pairVal.first->second, 5); - ASSERT_EQ(pairVal.second, true); - - pairVal = map.emplace(1, 10); - ASSERT_EQ(map.size(), 1); - ASSERT_EQ(pairVal.first, map.begin()); - ASSERT_EQ(pairVal.first->second, 5); - ASSERT_EQ(pairVal.second, false); - } - - TEST(IndexedVectorTests, testErase) - { - Misc::IndexedVector map; - for (int i = 0; i < 10000; i++) - { - map.emplace(i, i); - } - - auto itA = map.find(100); - ASSERT_NE(itA, map.end()); - ASSERT_EQ(itA->second, 100); - - itA = map.erase(itA); - ASSERT_EQ(map.size(), 10000 - 1); - ASSERT_NE(itA, map.end()); - ASSERT_EQ(itA->second, 101); - } - - TEST(IndexedVectorTests, testLookup) - { - Misc::IndexedVector map; - for (int i = 0; i < 10000; i++) - { - map.emplace(i, i); - } - - auto itA = map.find(100); - ASSERT_NE(itA, map.end()); - ASSERT_EQ(itA->second, 100); - - map.erase(itA); - ASSERT_EQ(map.size(), 10000 - 1); - itA = map.find(101); - ASSERT_NE(itA, map.end()); - ASSERT_EQ(itA->second, 101); - } -} diff --git a/components/CMakeLists.txt b/components/CMakeLists.txt index b9a5cfa2ee..efc80081e3 100644 --- a/components/CMakeLists.txt +++ b/components/CMakeLists.txt @@ -189,7 +189,7 @@ add_component_dir (esm4 add_component_dir (misc constants utf8stream stringops resourcehelpers rng messageformatparser weakcache thread - compression osguservalues errorMarker color indexedvector + compression osguservalues errorMarker color ) add_component_dir (debug diff --git a/components/misc/indexedvector.hpp b/components/misc/indexedvector.hpp deleted file mode 100644 index 9ade1e1e5e..0000000000 --- a/components/misc/indexedvector.hpp +++ /dev/null @@ -1,186 +0,0 @@ -#ifndef OPENMW_COMPONENTS_FLATMAP_HPP -#define OPENMW_COMPONENTS_FLATMAP_HPP - -#include -#include -#include -#include -#include - -namespace Misc -{ - /// \class IndexedVector - /// Works like std::unordered_map but storage is std::vector and uses insertion order. - template > - class IndexedVector - { - using ElementType = std::pair; - - private: - using Storage = std::vector; - using LookupTable = std::unordered_map; - - public: - using iterator = typename Storage::iterator; - using const_iterator = typename Storage::const_iterator; - using value_type = typename Storage::value_type; - - void clear() - { - mData.clear(); - mLookup.clear(); - } - - size_t size() const noexcept - { - return mData.size(); - } - - /// Inserts the element at the back with move semantics. - std::pair insert(const value_type& value) - { - auto it = find(value.first); - if (it != std::end(mData)) - { - return { it, false }; - } - else - { - const auto& key = value.first; - it = mData.emplace(std::end(mData), value); - mLookup.emplace(key, std::distance(std::begin(mData), it)); - return { it, true }; - } - } - - std::pair insert(value_type&& value) - { - auto it = find(value.first); - if (it != std::end(mData)) - { - return { it, false }; - } - else - { - const auto& key = value.first; - it = mData.emplace(std::end(mData), std::move(value)); - mLookup.emplace(key, std::distance(std::begin(mData), it)); - return { it, true }; - } - } - - /// Inserts the element at the back - template - std::pair emplace(TArgs&& ...args) - { - value_type value{ std::forward(args)... }; - auto it = find(value.first); - if (it != std::end(mData)) - { - return { it, false }; - } - else - { - const auto& key = value.first; - it = mData.emplace(std::end(mData), std::move(value)); - mLookup.emplace(key, std::distance(std::begin(mData), it)); - return { it, true }; - } - } - - /// Erases a single element, iterators are invalidated after this call. - /// The returned iterator points to the value after the removed element. - iterator erase(iterator it) noexcept - { - return eraseImpl(it); - } - - iterator erase(const_iterator it) noexcept - { - return eraseImpl(it); - } - - /// Erases a single element by key, iterators are invalidated after this call. - /// The returned iterator points to the value after the removed element. - iterator erase(const Key& key) noexcept - { - auto it = find(key); - if (it == end()) - return it; - return erase(it); - } - - template - iterator find(const K& key) - { - auto it = mLookup.find(key); - if (it == std::end(mLookup)) - return end(); - return std::begin(mData) + it->second; - } - - template - const_iterator find(const K& key) const - { - auto it = mLookup.find(key); - if (it == std::end(mLookup)) - return end(); - return std::begin(mData) + it->second; - } - - iterator begin() - { - return mData.begin(); - } - - const_iterator begin() const - { - return mData.begin(); - } - - const_iterator cbegin() const - { - return mData.cbegin(); - } - - iterator end() - { - return mData.end(); - } - - const_iterator end() const - { - return mData.end(); - } - - const_iterator cend() const - { - return mData.cend(); - } - - private: - template - iterator eraseImpl(TIterator&& it) noexcept - { - const auto lookupIt = mLookup.find(it->first); - if (lookupIt == std::end(mLookup)) - return end(); - const auto index = lookupIt->second; - mLookup.erase(lookupIt); - // Adjust indices by one. - for (auto& [_, idx] : mLookup) - { - if (idx > index) - idx--; - } - return mData.erase(it); - } - - private: - Storage mData; - LookupTable mLookup; - }; - -} - -#endif