27 enum class RequestType
33 enum class RequestFileHandleType
44 using FileCallback = std::variant<std::function<void(std::unique_ptr<ReadFileHandle>&&)>, std::function<void(std::unique_ptr<WriteFileHandle>&&)>>;
48 FileCallback callback;
49 std::promise<void> requestPromise;
50 RequestFileHandleType handleType;
52 RequestStruct(FileCallback&& callback, std::promise<void>&& requestPromise, RequestFileHandleType handleType);
55 friend bool operator == (
const RequestStruct& request, RequestType type);
63 std::atomic_size_t readRequests;
64 std::atomic_bool isWriteRequest;
70 std::queue<RequestStruct> requests;
71 std::mutex requestsMutex;
79 void addRequest(FileCallback&& callback, std::promise<void>&& requestPromise, RequestFileHandleType handleType);
81 void processQueue(
const std::filesystem::path& filePath);
83 ~FileNode() =
default;
86 class FILE_MANAGER_API NodesContainer
89 std::unordered_map<std::filesystem::path, FileNode*, utility::pathHash> data;
90 mutable std::mutex readWriteMutex;
93 NodesContainer() =
default;
95 void addNode(
const std::filesystem::path& filePath);
97 FileNode* operator [](
const std::filesystem::path& filePath)
const;
99 inline ~NodesContainer()
101 for (
const auto& [_, value] : data)
112 NodesContainer nodes;
113 std::shared_ptr<threading::ThreadPool> threadPool;
116 static void threadPoolCallback(std::promise<void>&& requestPromise);
119 FileHandle* createHandle(
const std::filesystem::path& filePath, RequestFileHandleType handleType);
121 void notify(std::filesystem::path&& filePath);
123 void addRequest(
const std::filesystem::path& filePath, FileCallback&& callback, std::promise<void>&& requestPromise, RequestFileHandleType handleType);
125 void decreaseReadRequests(
const std::filesystem::path& filePath);
127 void completeWriteRequest(
const std::filesystem::path& filePath);
134 FileManager(std::shared_ptr<threading::ThreadPool> threadPool);
147 std::future<void> addReadRequest(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<ReadFileHandle>&&)>& callback, RequestFileHandleType handleType,
bool isWait);
149 std::future<void> addWriteRequest(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<WriteFileHandle>&&)>& callback, RequestFileHandleType handleType,
bool isWait);
165 static FileManager& getInstance(
size_t threadsNumber);
178 static std::string getVersion();
185 void addFile(
const std::filesystem::path& filePath,
bool isFileAlreadyExist =
true);
193 std::future<void> readFile(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<ReadFileHandle>&&)>& callback,
bool isWait =
true);
201 std::future<void> readBinaryFile(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<ReadFileHandle>&&)>& callback,
bool isWait =
true);
207 std::future<void> writeFile(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<WriteFileHandle>&&)>& callback,
bool isWait =
true);
213 std::future<void> appendFile(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<WriteFileHandle>&&)>& callback,
bool isWait =
true);
219 std::future<void> writeBinaryFile(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<WriteFileHandle>&&)>& callback,
bool isWait =
true);
225 std::future<void> appendBinaryFile(
const std::filesystem::path& filePath,
const std::function<
void(std::unique_ptr<WriteFileHandle>&&)>& callback,
bool isWait =
true);
233 const Cache& getCache()
const;