diff options
Diffstat (limited to 'src/shared/fileregister.h')
| -rw-r--r-- | src/shared/fileregister.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/shared/fileregister.h b/src/shared/fileregister.h new file mode 100644 index 00000000..d5e360c1 --- /dev/null +++ b/src/shared/fileregister.h @@ -0,0 +1,58 @@ +#ifndef MO_REGISTER_FILESREGISTER_INCLUDED +#define MO_REGISTER_FILESREGISTER_INCLUDED + +#include "fileregisterfwd.h" +#include <mutex> +#include <boost/shared_ptr.hpp> + +namespace MOShared +{ + +class FileRegister +{ +public: + FileRegister(boost::shared_ptr<OriginConnection> originConnection); + + // noncopyable + FileRegister(const FileRegister&) = delete; + FileRegister& operator=(const FileRegister&) = delete; + + bool indexValid(FileIndex index) const; + + FileEntryPtr createFile( + std::wstring name, DirectoryEntry *parent, DirectoryStats& stats); + + FileEntryPtr getFile(FileIndex index) const; + + size_t highestCount() const + { + std::scoped_lock lock(m_Mutex); + return m_Files.size(); + } + + void reserve(std::size_t n) + { + m_Files.reserve(n); + } + + bool removeFile(FileIndex index); + void removeOrigin(FileIndex index, int originID); + void removeOriginMulti(std::set<FileIndex> indices, int originID); + + void sortOrigins(); + +private: + using FileMap = std::vector<FileEntryPtr>; + + mutable std::mutex m_Mutex; + FileMap m_Files; + boost::shared_ptr<OriginConnection> m_OriginConnection; + std::atomic<FileIndex> m_NextIndex; + + void unregisterFile(FileEntryPtr file); + FileIndex generateIndex(); +}; + +} // namespace + +#endif // MO_REGISTER_FILESREGISTER_INCLUDED |
