From 6212152babdbed7bfcfce87eb623383132400c36 Mon Sep 17 00:00:00 2001 From: Matthew Fioravante Date: Sat, 21 Dec 2019 02:16:09 -0500 Subject: [PATCH] Optimize AsyncHandler::RequestFile Also add some inlines --- src/async_handler.cpp | 54 +++++++++++-------------------------------- src/async_handler.h | 33 ++++++++++++++++++-------- 2 files changed, 38 insertions(+), 49 deletions(-) diff --git a/src/async_handler.cpp b/src/async_handler.cpp index 0755fa5596..07ba0d1240 100644 --- a/src/async_handler.cpp +++ b/src/async_handler.cpp @@ -52,8 +52,11 @@ namespace { return nullptr; } - void RegisterRequest(const std::string& path, const FileRequestAsync& request) { - async_requests[path] = request; + FileRequestAsync* RegisterRequest(std::string path, std::string directory, std::string file) + { + auto req = FileRequestAsync(path, std::move(directory), std::move(file)); + auto p = async_requests.emplace(std::make_pair(std::move(path), std::move(req))); + return &p.first->second; } FileRequestBinding CreatePending() { @@ -91,20 +94,17 @@ void AsyncHandler::CreateRequestMapping(const std::string& file) { } FileRequestAsync* AsyncHandler::RequestFile(const std::string& folder_name, const std::string& file_name) { - std::string path = FileFinder::MakePath(folder_name, file_name); + auto path = FileFinder::MakePath(folder_name, file_name); - FileRequestAsync* request = GetRequest(path); + auto* request = GetRequest(path); if (request) { return request; } - FileRequestAsync req(folder_name, file_name); - RegisterRequest(path, req); - //Output::Debug("Waiting for %s", path.c_str()); - return GetRequest(path); + return RegisterRequest(std::move(path), folder_name, file_name); } FileRequestAsync* AsyncHandler::RequestFile(const std::string& file_name) { @@ -138,34 +138,12 @@ bool AsyncHandler::IsGraphicFilePending() { return IsFilePending(false, true); } -FileRequestAsync::FileRequestAsync(const std::string& folder_name, const std::string& file_name) : - directory(folder_name), - file(file_name) { - this->path = path = FileFinder::MakePath(folder_name, file_name); - this->important = false; - this->graphic = false; - - state = State_WaitForStart; -} - -FileRequestAsync::FileRequestAsync() { -} - -bool FileRequestAsync::IsReady() const { - return state == State_DoneSuccess || state == State_DoneFailure; -} - -bool FileRequestAsync::IsImportantFile() const { - return important; -} - -void FileRequestAsync::SetImportantFile(bool important) { - this->important = important; -} - -bool FileRequestAsync::IsGraphicFile() const { - return graphic; -} +FileRequestAsync::FileRequestAsync(std::string path, std::string directory, std::string file) : + directory(std::move(directory)), + file(std::move(file)), + path(std::move(path)), + state(State_WaitForStart) +{ } void FileRequestAsync::SetGraphicFile(bool graphic) { this->graphic = graphic; @@ -252,10 +230,6 @@ void FileRequestAsync::UpdateProgress() { #endif } -const std::string& FileRequestAsync::GetPath() const { - return path; -} - FileRequestBinding FileRequestAsync::Bind(void(*func)(FileRequestResult*)) { FileRequestBinding pending = CreatePending(); diff --git a/src/async_handler.h b/src/async_handler.h index 98627afcec..91ecc30909 100644 --- a/src/async_handler.h +++ b/src/async_handler.h @@ -106,19 +106,13 @@ class FileRequestAsync { State_Pending }; - /** - * Don't use this API directly. Use AsyncHandler::RequestFile. - */ - FileRequestAsync(); - /** * Don't use this API directly. Use AsyncHandler::RequestFile. * - * @param folder_name folder where the file is stored. - * @param file_name Name of the requested file requested. + * @param path path to the file * @return The async request. */ - FileRequestAsync(const std::string& folder_name, const std::string& file_name); + FileRequestAsync(std::string path, std::string directory, std::string file); /** * Checks if a request finished. @@ -215,7 +209,7 @@ class FileRequestAsync { std::string directory; std::string file; std::string path; - int state; + int state = State_DoneFailure; bool important = false; bool graphic = false; }; @@ -238,4 +232,25 @@ FileRequestBinding FileRequestAsync::Bind(void (T::*func)(FileRequestResult*, Ar return Bind(f); } +inline bool FileRequestAsync::IsReady() const { + return state == State_DoneSuccess || state == State_DoneFailure; +} + +inline bool FileRequestAsync::IsImportantFile() const { + return important; +} + +inline void FileRequestAsync::SetImportantFile(bool important) { + this->important = important; +} + +inline bool FileRequestAsync::IsGraphicFile() const { + return graphic; +} + +inline const std::string& FileRequestAsync::GetPath() const { + return path; +} + + #endif