From 015ec122154b869f22c9f0f7d50c1028067adfb5 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 27 Nov 2020 13:44:52 +0100 Subject: [PATCH] Improved byte write speed by a lot --- include/event.hpp | 1 + include/providers/file_provider.hpp | 4 ++-- include/providers/provider.hpp | 4 ++-- source/providers/file_provider.cpp | 12 ++++++------ source/views/view_pattern.cpp | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/event.hpp b/include/event.hpp index 779b3314a..fb5918e7a 100644 --- a/include/event.hpp +++ b/include/event.hpp @@ -6,6 +6,7 @@ namespace hex { enum class Events { + FileLoaded, DataChanged, PatternChanged, FileDropped, diff --git a/include/providers/file_provider.hpp b/include/providers/file_provider.hpp index 877d87773..a1cfa048b 100644 --- a/include/providers/file_provider.hpp +++ b/include/providers/file_provider.hpp @@ -18,10 +18,10 @@ namespace hex::prv { bool isWritable() override; void read(u64 offset, void *buffer, size_t size) override; - void write(u64 offset, void *buffer, size_t size) override; + void write(u64 offset, const void *buffer, size_t size) override; void readRaw(u64 offset, void *buffer, size_t size) override; - void writeRaw(u64 offset, void *buffer, size_t size) override; + void writeRaw(u64 offset, const void *buffer, size_t size) override; size_t getActualSize() override; std::vector> getDataInformation() override; diff --git a/include/providers/provider.hpp b/include/providers/provider.hpp index 7b4f7d553..6b086a090 100644 --- a/include/providers/provider.hpp +++ b/include/providers/provider.hpp @@ -26,10 +26,10 @@ namespace hex::prv { virtual bool isWritable() = 0; virtual void read(u64 offset, void *buffer, size_t size) { this->readRaw(offset, buffer, size); } - virtual void write(u64 offset, void *buffer, size_t size) { this->writeRaw(offset, buffer, size); } + virtual void write(u64 offset, const void *buffer, size_t size) { this->writeRaw(offset, buffer, size); } virtual void readRaw(u64 offset, void *buffer, size_t size) = 0; - virtual void writeRaw(u64 offset, void *buffer, size_t size) = 0; + virtual void writeRaw(u64 offset, const void *buffer, size_t size) = 0; virtual size_t getActualSize() = 0; const std::map& getPatches() { return this->m_patches.back(); } diff --git a/source/providers/file_provider.cpp b/source/providers/file_provider.cpp index 63f10c834..c58709a21 100644 --- a/source/providers/file_provider.cpp +++ b/source/providers/file_provider.cpp @@ -48,23 +48,23 @@ namespace hex::prv { return; fseeko64(this->m_file, this->getCurrentPage() * PageSize + offset, SEEK_SET); - fread(buffer, 1, size, this->m_file); + size_t readSize = fread(buffer, 1, size, this->m_file); - for (u64 i = 0; i < size; i++) + for (u64 i = 0; i < readSize; i++) if (this->m_patches.back().contains(offset + i)) reinterpret_cast(buffer)[i] = this->m_patches.back()[offset + i]; } - void FileProvider::write(u64 offset, void *buffer, size_t size) { + void FileProvider::write(u64 offset, const void *buffer, size_t size) { if (buffer == nullptr || size == 0) return; this->m_patches.push_back(this->m_patches.back()); for (u64 i = 0; i < size; i++) - this->m_patches.back()[offset + i] = reinterpret_cast(buffer)[i]; + this->m_patches.back()[offset + i] = reinterpret_cast(buffer)[i]; } void FileProvider::readRaw(u64 offset, void *buffer, size_t size) { @@ -75,12 +75,12 @@ namespace hex::prv { fread(buffer, 1, size, this->m_file); } - void FileProvider::writeRaw(u64 offset, void *buffer, size_t size) { + void FileProvider::writeRaw(u64 offset, const void *buffer, size_t size) { if (buffer == nullptr || size == 0) return; fseeko64(this->m_file, offset, SEEK_SET); - fwrite(&buffer, 1, size, this->m_file); + fwrite(buffer, 1, size, this->m_file); } size_t FileProvider::getActualSize() { fseeko64(this->m_file, 0, SEEK_END); diff --git a/source/views/view_pattern.cpp b/source/views/view_pattern.cpp index 7a8604f16..b8e7257b2 100644 --- a/source/views/view_pattern.cpp +++ b/source/views/view_pattern.cpp @@ -74,7 +74,7 @@ namespace hex { this->m_textEditor.SetLanguageDefinition(PatternLanguage()); this->m_textEditor.SetShowWhitespaces(false); - View::subscribeEvent(Events::DataChanged, [this](const void* userData) { + View::subscribeEvent(Events::FileLoaded, [this](const void* userData) { lang::Preprocessor preprocessor; std::string magicFiles; @@ -85,7 +85,7 @@ namespace hex { magicFiles += entry.path().string() + MAGIC_PATH_SEPARATOR; } - std::vector buffer(std::min(this->m_dataProvider->getSize(), size_t(0xFF'FFFF)), 0x00); + std::vector buffer(std::min(this->m_dataProvider->getSize(), size_t(0xFFFF)), 0x00); this->m_dataProvider->read(0, buffer.data(), buffer.size()); std::string mimeType;