diff --git a/include/Nazara/Core/Algorithm.hpp b/include/Nazara/Core/Algorithm.hpp index 5670b57d6..d70aff30b 100644 --- a/include/Nazara/Core/Algorithm.hpp +++ b/include/Nazara/Core/Algorithm.hpp @@ -24,10 +24,10 @@ namespace Nz template void HashCombine(std::size_t& seed, const T& v); template - struct Hashable; + struct TypeTag {}; + template - struct TypeTag {}; } #include diff --git a/include/Nazara/Core/Algorithm.inl b/include/Nazara/Core/Algorithm.inl index 25e4ecdb2..3912f615a 100644 --- a/include/Nazara/Core/Algorithm.inl +++ b/include/Nazara/Core/Algorithm.inl @@ -53,7 +53,9 @@ namespace Nz ByteArray ComputeHash(AbstractHash* hash, const T& v) { hash->Begin(); - Hashable()(v, hash); + + HashAppend(hash, v); + return hash->End(); } diff --git a/include/Nazara/Core/ByteArray.hpp b/include/Nazara/Core/ByteArray.hpp index 8be45779b..90f9c5d03 100644 --- a/include/Nazara/Core/ByteArray.hpp +++ b/include/Nazara/Core/ByteArray.hpp @@ -128,8 +128,7 @@ namespace Nz Container m_array; }; - template<> - struct Hashable; + inline bool HashAppend(AbstractHash* hash, const ByteArray& byteArray); } namespace std diff --git a/include/Nazara/Core/ByteArray.inl b/include/Nazara/Core/ByteArray.inl index 13c846c05..ada835e3e 100644 --- a/include/Nazara/Core/ByteArray.inl +++ b/include/Nazara/Core/ByteArray.inl @@ -335,15 +335,11 @@ namespace Nz return m_array >= rhs.m_array; } - template<> - struct Hashable + inline bool HashAppend(AbstractHash* hash, const ByteArray& byteArray) { - bool operator()(const ByteArray& byteArray, AbstractHash* hash) const - { - hash->Append(byteArray.GetConstBuffer(), byteArray.GetSize()); - return true; - } - }; + hash->Append(byteArray.GetConstBuffer(), byteArray.GetSize()); + return true; + } } namespace std diff --git a/include/Nazara/Core/File.hpp b/include/Nazara/Core/File.hpp index b5496310a..18ed54b98 100644 --- a/include/Nazara/Core/File.hpp +++ b/include/Nazara/Core/File.hpp @@ -104,8 +104,7 @@ namespace Nz FileImpl* m_impl; }; - template<> - struct Hashable; + NAZARA_CORE_API bool HashAppend(AbstractHash* hash, const File& originalFile); } #include diff --git a/include/Nazara/Core/File.inl b/include/Nazara/Core/File.inl index c5603c320..818d0098f 100644 --- a/include/Nazara/Core/File.inl +++ b/include/Nazara/Core/File.inl @@ -3,8 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include -#include +#include #include namespace Nz @@ -18,39 +17,6 @@ namespace Nz { return Nz::ComputeHash(hash, File(filePath)); } - - template<> - struct Hashable - { - bool operator()(const Nz::File& originalFile, AbstractHash* hash) const - { - - File file(originalFile.GetPath()); - if (!file.Open(OpenMode_ReadOnly)) - { - NazaraError("Unable to open file"); - return false; - } - - UInt64 remainingSize = file.GetSize(); - - char buffer[NAZARA_CORE_FILE_BUFFERSIZE]; - while (remainingSize > 0) - { - unsigned int size = static_cast(std::min(remainingSize, static_cast(NAZARA_CORE_FILE_BUFFERSIZE))); - if (file.Read(&buffer[0], sizeof(char), size) != sizeof(char)*size) - { - NazaraError("Unable to read file"); - return false; - } - - remainingSize -= size; - hash->Append(reinterpret_cast(&buffer[0]), size); - } - - return true; - } - }; } #include diff --git a/include/Nazara/Core/String.hpp b/include/Nazara/Core/String.hpp index 61af938d1..988ed96d3 100644 --- a/include/Nazara/Core/String.hpp +++ b/include/Nazara/Core/String.hpp @@ -324,8 +324,7 @@ namespace Nz }; }; - template<> - struct Hashable; + inline bool HashAppend(AbstractHash* hash, const String& string); } namespace std diff --git a/include/Nazara/Core/String.inl b/include/Nazara/Core/String.inl index cc323d697..202cec2e6 100644 --- a/include/Nazara/Core/String.inl +++ b/include/Nazara/Core/String.inl @@ -39,15 +39,11 @@ namespace Nz string[strSize] = '\0'; } - template<> - struct Hashable + inline bool HashAppend(AbstractHash* hash, const String& string) { - bool operator()(const String& str, AbstractHash* hash) const - { - hash->Append(reinterpret_cast(str.GetConstBuffer()), str.GetSize()); - return true; - } - }; + hash->Append(reinterpret_cast(string.GetConstBuffer()), string.GetSize()); + return true; + } } namespace std diff --git a/src/Nazara/Core/File.cpp b/src/Nazara/Core/File.cpp index f4e3f3895..eedfc99a6 100644 --- a/src/Nazara/Core/File.cpp +++ b/src/Nazara/Core/File.cpp @@ -596,4 +596,32 @@ namespace Nz return FileImpl::Rename(NormalizePath(sourcePath), NormalizePath(targetPath)); } + + NAZARA_CORE_API bool HashAppend(AbstractHash* hash, const File& originalFile) + { + File file(originalFile.GetPath()); + if (!file.Open(OpenMode_ReadOnly)) + { + NazaraError("Unable to open file"); + return false; + } + + UInt64 remainingSize = file.GetSize(); + + char buffer[NAZARA_CORE_FILE_BUFFERSIZE]; + while (remainingSize > 0) + { + unsigned int size = static_cast(std::min(remainingSize, static_cast(NAZARA_CORE_FILE_BUFFERSIZE))); + if (file.Read(&buffer[0], sizeof(char), size) != sizeof(char)*size) + { + NazaraError("Unable to read file"); + return false; + } + + remainingSize -= size; + hash->Append(reinterpret_cast(&buffer[0]), size); + } + + return true; + }; }