From b1cf498924e461556c8f2fe961172685d92bb03f Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 15 Feb 2020 13:24:56 -0500 Subject: split directoryentry made classes noncopyable, fixed a few unintended copies --- src/shared/originconnection.cpp | 145 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/shared/originconnection.cpp (limited to 'src/shared/originconnection.cpp') diff --git a/src/shared/originconnection.cpp b/src/shared/originconnection.cpp new file mode 100644 index 00000000..a56126cc --- /dev/null +++ b/src/shared/originconnection.cpp @@ -0,0 +1,145 @@ +#include "originconnection.h" +#include "filesorigin.h" +#include "util.h" +#include + +namespace MOShared +{ + +using namespace MOBase; + +OriginConnection::OriginConnection() + : m_NextID(0) +{ +} + +std::pair OriginConnection::getOrCreate( + const std::wstring &originName, const std::wstring &directory, int priority, + const boost::shared_ptr& fileRegister, + const boost::shared_ptr& originConnection, + DirectoryStats& stats) +{ + std::unique_lock lock(m_Mutex); + + auto itor = m_OriginsNameMap.find(originName); + + if (itor == m_OriginsNameMap.end()) { + FilesOrigin& origin = createOriginNoLock( + originName, directory, priority, fileRegister, originConnection); + + return {origin, true}; + } else { + FilesOrigin& origin = m_Origins[itor->second]; + lock.unlock(); + + origin.enable(true, stats); + return {origin, false}; + } +} + +FilesOrigin& OriginConnection::createOrigin( + const std::wstring &originName, const std::wstring &directory, int priority, + boost::shared_ptr fileRegister, + boost::shared_ptr originConnection) +{ + std::scoped_lock lock(m_Mutex); + + return createOriginNoLock( + originName, directory, priority, fileRegister, originConnection); +} + +bool OriginConnection::exists(const std::wstring &name) +{ + std::scoped_lock lock(m_Mutex); + return m_OriginsNameMap.find(name) != m_OriginsNameMap.end(); +} + +FilesOrigin& OriginConnection::getByID(Index ID) +{ + std::scoped_lock lock(m_Mutex); + return m_Origins[ID]; +} + +const FilesOrigin* OriginConnection::findByID(Index ID) const +{ + std::scoped_lock lock(m_Mutex); + + auto itor = m_Origins.find(ID); + + if (itor == m_Origins.end()) { + return nullptr; + } else { + return &itor->second; + } +} + +FilesOrigin& OriginConnection::getByName(const std::wstring &name) +{ + std::scoped_lock lock(m_Mutex); + + std::map::iterator iter = m_OriginsNameMap.find(name); + + if (iter != m_OriginsNameMap.end()) { + return m_Origins[iter->second]; + } else { + std::ostringstream stream; + stream << QObject::tr("invalid origin name: ").toStdString() << ToString(name, true); + throw std::runtime_error(stream.str()); + } +} + +void OriginConnection::changePriorityLookup(int oldPriority, int newPriority) +{ + std::scoped_lock lock(m_Mutex); + + auto iter = m_OriginsPriorityMap.find(oldPriority); + + if (iter != m_OriginsPriorityMap.end()) { + Index idx = iter->second; + m_OriginsPriorityMap.erase(iter); + m_OriginsPriorityMap[newPriority] = idx; + } +} + +void OriginConnection::changeNameLookup(const std::wstring &oldName, const std::wstring &newName) +{ + std::scoped_lock lock(m_Mutex); + + auto iter = m_OriginsNameMap.find(oldName); + + if (iter != m_OriginsNameMap.end()) { + Index idx = iter->second; + m_OriginsNameMap.erase(iter); + m_OriginsNameMap[newName] = idx; + } else { + log::error(QObject::tr("failed to change name lookup from {} to {}").toStdString(), oldName, newName); + } +} + +OriginConnection::Index OriginConnection::createID() +{ + return m_NextID++; +} + +FilesOrigin& OriginConnection::createOriginNoLock( + const std::wstring &originName, const std::wstring &directory, int priority, + boost::shared_ptr fileRegister, + boost::shared_ptr originConnection) +{ + int newID = createID(); + + auto itor = m_Origins.emplace( + std::piecewise_construct, + std::forward_as_tuple(newID), + std::forward_as_tuple( + newID, originName, directory, priority, + fileRegister, originConnection)) + .first; + + m_OriginsNameMap.insert({originName, newID}); + m_OriginsPriorityMap.insert({priority, newID}); + + return itor->second; +} + +} // namespace -- cgit v1.3.1 From 777d822f13fcd15fc5f5ac0bb45589460a1e16f1 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 15 Feb 2020 13:44:34 -0500 Subject: cleanup, typedefs --- src/organizercore.cpp | 20 ++++++++++---------- src/shared/directoryentry.cpp | 23 +++++++++++------------ src/shared/directoryentry.h | 36 +++++++++++++++++------------------- src/shared/fileentry.cpp | 14 +++++++------- src/shared/fileentry.h | 21 +++++++++------------ src/shared/fileregister.cpp | 6 +++--- src/shared/fileregister.h | 4 ++-- src/shared/fileregisterfwd.h | 7 ++++++- src/shared/filesorigin.cpp | 13 +------------ src/shared/filesorigin.h | 10 ++++------ src/shared/originconnection.cpp | 14 +++++++------- src/shared/originconnection.h | 17 +++++++---------- 12 files changed, 84 insertions(+), 101 deletions(-) (limited to 'src/shared/originconnection.cpp') diff --git a/src/organizercore.cpp b/src/organizercore.cpp index c9c0bee5..2c680847 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -847,8 +847,8 @@ QStringList OrganizerCore::findFiles( if (!path.isEmpty()) dir = dir->findSubDirectoryRecursive(ToWString(path)); if (dir != nullptr) { - std::vector files = dir->getFiles(); - foreach (FileEntry::Ptr file, files) { + std::vector files = dir->getFiles(); + foreach (FileEntryPtr file, files) { if (filter(ToQString(file->getFullPath()))) { result.append(ToQString(file->getFullPath())); } @@ -860,7 +860,7 @@ QStringList OrganizerCore::findFiles( QStringList OrganizerCore::getFileOrigins(const QString &fileName) const { QStringList result; - const FileEntry::Ptr file = m_DirectoryStructure->searchFile(ToWString(fileName), nullptr); + const FileEntryPtr file = m_DirectoryStructure->searchFile(ToWString(fileName), nullptr); if (file.get() != nullptr) { result.append(ToQString( @@ -883,8 +883,8 @@ QList OrganizerCore::findFileInfos( if (!path.isEmpty()) dir = dir->findSubDirectoryRecursive(ToWString(path)); if (dir != nullptr) { - std::vector files = dir->getFiles(); - foreach (FileEntry::Ptr file, files) { + std::vector files = dir->getFiles(); + foreach (FileEntryPtr file, files) { IOrganizer::FileInfo info; info.filePath = ToQString(file->getFullPath()); bool fromArchive = false; @@ -966,7 +966,7 @@ bool OrganizerCore::previewFileWithAlternatives( - const FileEntry::Ptr file = directoryStructure()->searchFile(ToWString(fileName), nullptr); + const FileEntryPtr file = directoryStructure()->searchFile(ToWString(fileName), nullptr); if (file.get() == nullptr) { reportError(tr("file not found: %1").arg(qUtf8Printable(fileName))); @@ -1180,7 +1180,7 @@ void OrganizerCore::updateModsActiveState(const QList &modIndices, QDir dir(modInfo->absolutePath()); for (const QString &esm : dir.entryList(QStringList() << "*.esm", QDir::Files)) { - const FileEntry::Ptr file = m_DirectoryStructure->findFile(ToWString(esm)); + const FileEntryPtr file = m_DirectoryStructure->findFile(ToWString(esm)); if (file.get() == nullptr) { log::warn("failed to activate {}", esm); continue; @@ -1196,7 +1196,7 @@ void OrganizerCore::updateModsActiveState(const QList &modIndices, for (const QString &esl : dir.entryList(QStringList() << "*.esl", QDir::Files)) { - const FileEntry::Ptr file = m_DirectoryStructure->findFile(ToWString(esl)); + const FileEntryPtr file = m_DirectoryStructure->findFile(ToWString(esl)); if (file.get() == nullptr) { log::warn("failed to activate {}", esl); continue; @@ -1212,7 +1212,7 @@ void OrganizerCore::updateModsActiveState(const QList &modIndices, } QStringList esps = dir.entryList(QStringList() << "*.esp", QDir::Files); for (const QString &esp : esps) { - const FileEntry::Ptr file = m_DirectoryStructure->findFile(ToWString(esp)); + const FileEntryPtr file = m_DirectoryStructure->findFile(ToWString(esp)); if (file.get() == nullptr) { log::warn("failed to activate {}", esp); continue; @@ -1899,7 +1899,7 @@ std::vector OrganizerCore::fileMapping( { std::vector result; - for (FileEntry::Ptr current : directoryEntry->getFiles()) { + for (FileEntryPtr current : directoryEntry->getFiles()) { bool isArchive = false; int origin = current->getOrigin(isArchive); if (isArchive || (origin == 0)) { diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 1036dfe6..14c8323e 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -359,7 +359,7 @@ int DirectoryEntry::anyOrigin() const // we continue looking in subdirectories for (DirectoryEntry *entry : m_SubDirectories) { int res = entry->anyOrigin(); - if (res != -1){ + if (res != InvalidOriginID){ return res; } } @@ -398,7 +398,7 @@ DirectoryEntry *DirectoryEntry::findSubDirectory( DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &path) { - return getSubDirectoryRecursive(path, false, -1); + return getSubDirectoryRecursive(path, false, InvalidOriginID); } const FileEntryPtr DirectoryEntry::findFile( @@ -407,9 +407,9 @@ const FileEntryPtr DirectoryEntry::findFile( FilesLookup::const_iterator iter; if (alreadyLowerCase) { - iter = m_FilesLookup.find(FileKey(name)); + iter = m_FilesLookup.find(DirectoryEntryFileKey(name)); } else { - iter = m_FilesLookup.find(FileKey(ToLowerCopy(name))); + iter = m_FilesLookup.find(DirectoryEntryFileKey(ToLowerCopy(name))); } if (iter != m_FilesLookup.end()) { @@ -419,7 +419,7 @@ const FileEntryPtr DirectoryEntry::findFile( } } -const FileEntryPtr DirectoryEntry::findFile(const FileKey& key) const +const FileEntryPtr DirectoryEntry::findFile(const DirectoryEntryFileKey& key) const { auto iter = m_FilesLookup.find(key); @@ -495,7 +495,7 @@ const FileEntryPtr DirectoryEntry::searchFile( return FileEntryPtr(); } -void DirectoryEntry::removeFile(FileEntry::Index index) +void DirectoryEntry::removeFile(FileIndex index) { removeFileFromList(index); } @@ -589,7 +589,7 @@ FilesOrigin &DirectoryEntry::createOrigin( return r.first; } -void DirectoryEntry::removeFiles(const std::set &indices) +void DirectoryEntry::removeFiles(const std::set &indices) { removeFilesFromList(indices); } @@ -601,7 +601,7 @@ FileEntryPtr DirectoryEntry::insert( std::wstring fileNameLower = ToLowerCopy(fileName); FileEntryPtr fe; - FileKey key(std::move(fileNameLower)); + DirectoryEntryFileKey key(std::move(fileNameLower)); { std::unique_lock lock(m_FilesMutex); @@ -931,7 +931,7 @@ void DirectoryEntry::removeDirectoryFromList(SubDirectories::iterator itor) m_SubDirectories.erase(itor); } -void DirectoryEntry::removeFileFromList(FileEntry::Index index) +void DirectoryEntry::removeFileFromList(FileIndex index) { auto removeFrom = [&](auto& list) { auto iter = std::find_if( @@ -961,7 +961,7 @@ void DirectoryEntry::removeFileFromList(FileEntry::Index index) removeFrom(m_Files); } -void DirectoryEntry::removeFilesFromList(const std::set& indices) +void DirectoryEntry::removeFilesFromList(const std::set& indices) { for (auto iter = m_Files.begin(); iter != m_Files.end();) { if (indices.find(iter->second) != indices.end()) { @@ -980,8 +980,7 @@ void DirectoryEntry::removeFilesFromList(const std::set& indic } } -void DirectoryEntry::addFileToList( - std::wstring fileNameLower, FileEntry::Index index) +void DirectoryEntry::addFileToList(std::wstring fileNameLower, FileIndex index) { m_FilesLookup.emplace(fileNameLower, index); m_Files.emplace(std::move(fileNameLower), index); diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index df946946..5ca7389d 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -49,22 +49,20 @@ namespace MOShared class DirectoryEntry { public: - using FileKey = DirectoryEntryFileKey; - DirectoryEntry( - std::wstring name, DirectoryEntry *parent, int originID); + std::wstring name, DirectoryEntry *parent, OriginID originID); DirectoryEntry( - std::wstring name, DirectoryEntry *parent, int originID, + std::wstring name, DirectoryEntry *parent, OriginID originID, boost::shared_ptr fileRegister, boost::shared_ptr originConnection); + ~DirectoryEntry(); + // noncopyable DirectoryEntry(const DirectoryEntry&) = delete; DirectoryEntry& operator=(const DirectoryEntry&) = delete; - ~DirectoryEntry(); - void clear(); bool isPopulated() const @@ -110,7 +108,7 @@ public: const std::wstring &originName, const std::wstring &directory, env::Directory& root, int priority, DirectoryStats& stats); - void propagateOrigin(int origin); + void propagateOrigin(OriginID origin); const std::wstring &getName() const { @@ -123,11 +121,11 @@ public: } bool originExists(const std::wstring &name) const; - FilesOrigin &getOriginByID(int ID) const; + FilesOrigin &getOriginByID(OriginID ID) const; FilesOrigin &getOriginByName(const std::wstring &name) const; - const FilesOrigin* findOriginByID(int ID) const; + const FilesOrigin* findOriginByID(OriginID ID) const; - int anyOrigin() const; + OriginID anyOrigin() const; std::vector getFiles() const; @@ -191,7 +189,7 @@ public: * @return fileentry object for the file or nullptr if no file matches */ const FileEntryPtr findFile(const std::wstring &name, bool alreadyLowerCase=false) const; - const FileEntryPtr findFile(const FileKey& key) const; + const FileEntryPtr findFile(const DirectoryEntryFileKey& key) const; bool hasFile(const std::wstring& name) const; bool containsArchive(std::wstring archiveName); @@ -209,7 +207,7 @@ public: // remove the specified file from the tree. This can be a path leading to a // file in a subdirectory - bool removeFile(const std::wstring &filePath, int *origin = nullptr); + bool removeFile(const std::wstring &filePath, OriginID *origin = nullptr); /** * @brief remove the specified directory @@ -217,9 +215,9 @@ public: */ void removeDir(const std::wstring &path); - bool remove(const std::wstring &fileName, int *origin); + bool remove(const std::wstring &fileName, OriginID *origin); - bool hasContentsFromOrigin(int originID) const; + bool hasContentsFromOrigin(OriginID originID) const; FilesOrigin &createOrigin( const std::wstring &originName, @@ -231,7 +229,7 @@ public: private: using FilesMap = std::map; - using FilesLookup = std::unordered_map; + using FilesLookup = std::unordered_map; using SubDirectories = std::vector; using SubDirectoriesLookup = std::unordered_map; @@ -245,7 +243,7 @@ private: SubDirectoriesLookup m_SubDirectoriesLookup; DirectoryEntry *m_Parent; - std::set m_Origins; + std::set m_Origins; bool m_Populated; bool m_TopLevel; mutable std::mutex m_SubDirMutex; @@ -273,14 +271,14 @@ private: DirectoryEntry* getSubDirectory( std::wstring_view name, bool create, DirectoryStats& stats, - int originID = -1); + OriginID originID = InvalidOriginID); DirectoryEntry* getSubDirectory( env::Directory& dir, bool create, DirectoryStats& stats, - int originID = -1); + OriginID originID = InvalidOriginID); DirectoryEntry* getSubDirectoryRecursive( - const std::wstring &path, bool create, int originID = -1); + const std::wstring &path, bool create, OriginID originID = InvalidOriginID); void removeDirRecursive(); diff --git a/src/shared/fileentry.cpp b/src/shared/fileentry.cpp index d4e1beb4..e57c3cc5 100644 --- a/src/shared/fileentry.cpp +++ b/src/shared/fileentry.cpp @@ -6,19 +6,19 @@ namespace MOShared { FileEntry::FileEntry() : - m_Index(UINT_MAX), m_Name(), m_Origin(-1), m_Parent(nullptr), + m_Index(InvalidFileIndex), m_Name(), m_Origin(-1), m_Parent(nullptr), m_FileSize(NoFileSize), m_CompressedFileSize(NoFileSize) { } -FileEntry::FileEntry(Index index, std::wstring name, DirectoryEntry *parent) : +FileEntry::FileEntry(FileIndex index, std::wstring name, DirectoryEntry *parent) : m_Index(index), m_Name(std::move(name)), m_Origin(-1), m_Archive(L"", -1), m_Parent(parent), m_FileSize(NoFileSize), m_CompressedFileSize(NoFileSize) { } void FileEntry::addOrigin( - int origin, FILETIME fileTime, std::wstring_view archive, int order) + OriginID origin, FILETIME fileTime, std::wstring_view archive, int order) { std::scoped_lock lock(m_OriginsMutex); @@ -83,7 +83,7 @@ void FileEntry::addOrigin( } } -bool FileEntry::removeOrigin(int origin) +bool FileEntry::removeOrigin(OriginID origin) { std::scoped_lock lock(m_OriginsMutex); @@ -116,7 +116,7 @@ bool FileEntry::removeOrigin(int origin) } } - int currentID = currentIter->first; + OriginID currentID = currentIter->first; m_Archive = currentIter->second; m_Alternatives.erase(currentIter); @@ -201,11 +201,11 @@ bool FileEntry::isFromArchive(std::wstring archiveName) const return false; } -std::wstring FileEntry::getFullPath(int originID) const +std::wstring FileEntry::getFullPath(OriginID originID) const { std::scoped_lock lock(m_OriginsMutex); - if (originID == -1) { + if (originID == InvalidOriginID) { bool ignore = false; originID = getOrigin(ignore); } diff --git a/src/shared/fileentry.h b/src/shared/fileentry.h index 52ce89cd..aceeec57 100644 --- a/src/shared/fileentry.h +++ b/src/shared/fileentry.h @@ -12,28 +12,25 @@ public: static constexpr uint64_t NoFileSize = std::numeric_limits::max(); - typedef unsigned int Index; - typedef boost::shared_ptr Ptr; - FileEntry(); - FileEntry(Index index, std::wstring name, DirectoryEntry *parent); + FileEntry(FileIndex index, std::wstring name, DirectoryEntry *parent); // noncopyable FileEntry(const FileEntry&) = delete; FileEntry& operator=(const FileEntry&) = delete; - Index getIndex() const + FileIndex getIndex() const { return m_Index; } void addOrigin( - int origin, FILETIME fileTime, std::wstring_view archive, int order); + OriginID origin, FILETIME fileTime, std::wstring_view archive, int order); // remove the specified origin from the list of origins that contain this // file. if no origin is left, the file is effectively deleted and true is // returned. otherwise, false is returned - bool removeOrigin(int origin); + bool removeOrigin(OriginID origin); void sortOrigins(); @@ -50,12 +47,12 @@ public: return m_Name; } - int getOrigin() const + OriginID getOrigin() const { return m_Origin; } - int getOrigin(bool &archive) const + OriginID getOrigin(bool &archive) const { archive = (m_Archive.first.length() != 0); return m_Origin; @@ -71,7 +68,7 @@ public: // if originID is -1, uses the main origin; if this file doesn't exist in the // given origin, returns an empty string // - std::wstring getFullPath(int originID=-1) const; + std::wstring getFullPath(OriginID originID=InvalidOriginID) const; std::wstring getRelativePath() const; @@ -107,9 +104,9 @@ public: } private: - Index m_Index; + FileIndex m_Index; std::wstring m_Name; - int m_Origin; + OriginID m_Origin; std::pair m_Archive; AlternativesVector m_Alternatives; DirectoryEntry *m_Parent; diff --git a/src/shared/fileregister.cpp b/src/shared/fileregister.cpp index 4add0455..b56599d1 100644 --- a/src/shared/fileregister.cpp +++ b/src/shared/fileregister.cpp @@ -79,7 +79,7 @@ bool FileRegister::removeFile(FileIndex index) return false; } -void FileRegister::removeOrigin(FileIndex index, int originID) +void FileRegister::removeOrigin(FileIndex index, OriginID originID) { std::unique_lock lock(m_Mutex); @@ -100,7 +100,7 @@ void FileRegister::removeOrigin(FileIndex index, int originID) } void FileRegister::removeOriginMulti( - std::set indices, int originID) + std::set indices, OriginID originID) { std::vector removedFiles; @@ -167,7 +167,7 @@ void FileRegister::unregisterFile(FileEntryPtr file) bool ignore; // unregister from origin - int originID = file->getOrigin(ignore); + OriginID originID = file->getOrigin(ignore); m_OriginConnection->getByID(originID).removeFile(file->getIndex()); const auto& alternatives = file->getAlternatives(); diff --git a/src/shared/fileregister.h b/src/shared/fileregister.h index d5e360c1..9294d20e 100644 --- a/src/shared/fileregister.h +++ b/src/shared/fileregister.h @@ -36,8 +36,8 @@ public: } bool removeFile(FileIndex index); - void removeOrigin(FileIndex index, int originID); - void removeOriginMulti(std::set indices, int originID); + void removeOrigin(FileIndex index, OriginID originID); + void removeOriginMulti(std::set indices, OriginID originID); void sortOrigins(); diff --git a/src/shared/fileregisterfwd.h b/src/shared/fileregisterfwd.h index b8d33378..6348fee1 100644 --- a/src/shared/fileregisterfwd.h +++ b/src/shared/fileregisterfwd.h @@ -35,6 +35,11 @@ struct DirectoryStats; using FileEntryPtr = boost::shared_ptr; using FileIndex = unsigned int; +using OriginID = int; + +constexpr FileIndex InvalidFileIndex = UINT_MAX; +constexpr OriginID InvalidOriginID = -1; + // a vector of {originId, {archiveName, order}} // @@ -43,7 +48,7 @@ using FileIndex = unsigned int; // // is a file is not in an archive, archiveName is empty and order is usually // -1 -using AlternativesVector = std::vector>>; +using AlternativesVector = std::vector>>; struct DirectoryStats { diff --git a/src/shared/filesorigin.cpp b/src/shared/filesorigin.cpp index 47ae4b94..7476b6c5 100644 --- a/src/shared/filesorigin.cpp +++ b/src/shared/filesorigin.cpp @@ -21,19 +21,8 @@ FilesOrigin::FilesOrigin() { } -/*FilesOrigin::FilesOrigin(const FilesOrigin &reference) - : m_ID(reference.m_ID) - , m_Disabled(reference.m_Disabled) - , m_Name(reference.m_Name) - , m_Path(reference.m_Path) - , m_Priority(reference.m_Priority) - , m_FileRegister(reference.m_FileRegister) - , m_OriginConnection(reference.m_OriginConnection) -{ -}*/ - FilesOrigin::FilesOrigin( - int ID, const std::wstring &name, const std::wstring &path, int priority, + OriginID ID, const std::wstring &name, const std::wstring &path, int priority, boost::shared_ptr fileRegister, boost::shared_ptr originConnection) : m_ID(ID), m_Disabled(false), m_Name(name), m_Path(path), diff --git a/src/shared/filesorigin.h b/src/shared/filesorigin.h index 4ea21f57..222a834f 100644 --- a/src/shared/filesorigin.h +++ b/src/shared/filesorigin.h @@ -11,18 +11,16 @@ class FilesOrigin { public: FilesOrigin(); -// FilesOrigin(const FilesOrigin &reference); FilesOrigin( - int ID, const std::wstring &name, const std::wstring &path, int priority, + OriginID ID, const std::wstring &name, const std::wstring &path, + int priority, boost::shared_ptr fileRegister, boost::shared_ptr originConnection); // noncopyable FilesOrigin(const FilesOrigin&) = delete; FilesOrigin& operator=(const FilesOrigin&) = delete; - FilesOrigin(FilesOrigin&&) = default; - FilesOrigin& operator=(FilesOrigin&&) = default; // sets priority for this origin, but it will overwrite the existing mapping // for this priority, the previous origin will no longer be referenced @@ -39,7 +37,7 @@ public: return m_Name; } - int getID() const + OriginID getID() const { return m_ID; } @@ -71,7 +69,7 @@ public: bool containsArchive(std::wstring archiveName); private: - int m_ID; + OriginID m_ID; bool m_Disabled; std::set m_Files; std::wstring m_Name; diff --git a/src/shared/originconnection.cpp b/src/shared/originconnection.cpp index a56126cc..c1c096f0 100644 --- a/src/shared/originconnection.cpp +++ b/src/shared/originconnection.cpp @@ -54,13 +54,13 @@ bool OriginConnection::exists(const std::wstring &name) return m_OriginsNameMap.find(name) != m_OriginsNameMap.end(); } -FilesOrigin& OriginConnection::getByID(Index ID) +FilesOrigin& OriginConnection::getByID(OriginID ID) { std::scoped_lock lock(m_Mutex); return m_Origins[ID]; } -const FilesOrigin* OriginConnection::findByID(Index ID) const +const FilesOrigin* OriginConnection::findByID(OriginID ID) const { std::scoped_lock lock(m_Mutex); @@ -77,7 +77,7 @@ FilesOrigin& OriginConnection::getByName(const std::wstring &name) { std::scoped_lock lock(m_Mutex); - std::map::iterator iter = m_OriginsNameMap.find(name); + auto iter = m_OriginsNameMap.find(name); if (iter != m_OriginsNameMap.end()) { return m_Origins[iter->second]; @@ -95,7 +95,7 @@ void OriginConnection::changePriorityLookup(int oldPriority, int newPriority) auto iter = m_OriginsPriorityMap.find(oldPriority); if (iter != m_OriginsPriorityMap.end()) { - Index idx = iter->second; + OriginID idx = iter->second; m_OriginsPriorityMap.erase(iter); m_OriginsPriorityMap[newPriority] = idx; } @@ -108,7 +108,7 @@ void OriginConnection::changeNameLookup(const std::wstring &oldName, const std:: auto iter = m_OriginsNameMap.find(oldName); if (iter != m_OriginsNameMap.end()) { - Index idx = iter->second; + OriginID idx = iter->second; m_OriginsNameMap.erase(iter); m_OriginsNameMap[newName] = idx; } else { @@ -116,7 +116,7 @@ void OriginConnection::changeNameLookup(const std::wstring &oldName, const std:: } } -OriginConnection::Index OriginConnection::createID() +OriginID OriginConnection::createID() { return m_NextID++; } @@ -126,7 +126,7 @@ FilesOrigin& OriginConnection::createOriginNoLock( boost::shared_ptr fileRegister, boost::shared_ptr originConnection) { - int newID = createID(); + OriginID newID = createID(); auto itor = m_Origins.emplace( std::piecewise_construct, diff --git a/src/shared/originconnection.h b/src/shared/originconnection.h index 1fbb07ac..5fecd63a 100644 --- a/src/shared/originconnection.h +++ b/src/shared/originconnection.h @@ -9,9 +9,6 @@ namespace MOShared class OriginConnection { public: - typedef int Index; - static const int INVALID_INDEX = INT_MIN; - OriginConnection(); // noncopyable @@ -31,8 +28,8 @@ public: bool exists(const std::wstring &name); - FilesOrigin &getByID(Index ID); - const FilesOrigin* findByID(Index ID) const; + FilesOrigin &getByID(OriginID ID); + const FilesOrigin* findByID(OriginID ID) const; FilesOrigin &getByName(const std::wstring &name); void changePriorityLookup(int oldPriority, int newPriority); @@ -40,13 +37,13 @@ public: void changeNameLookup(const std::wstring &oldName, const std::wstring &newName); private: - Index m_NextID; - std::map m_Origins; - std::map m_OriginsNameMap; - std::map m_OriginsPriorityMap; + std::atomic m_NextID; + std::map m_Origins; + std::map m_OriginsNameMap; + std::map m_OriginsPriorityMap; mutable std::mutex m_Mutex; - Index createID(); + OriginID createID(); FilesOrigin& createOriginNoLock( const std::wstring &originName, const std::wstring &directory, int priority, -- cgit v1.3.1