diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2017-08-06 23:54:52 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2017-08-06 23:55:40 +0300 |
commit | 0fe0e7ff60a87834a4838e4f1ec651cf7c78a2f2 (patch) | |
tree | a2827c40b9c9962e64fb1ba35369a147c08e00ea /include | |
parent | code style (diff) | |
download | winapi-debug-0fe0e7ff60a87834a4838e4f1ec651cf7c78a2f2.tar.gz winapi-debug-0fe0e7ff60a87834a4838e4f1ec651cf7c78a2f2.zip |
don't hash bitwise (because you know, padding)
Diffstat (limited to '')
-rw-r--r-- | include/pdb/utils/file.hpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/include/pdb/utils/file.hpp b/include/pdb/utils/file.hpp index 50975aa..bf97115 100644 --- a/include/pdb/utils/file.hpp +++ b/include/pdb/utils/file.hpp @@ -7,12 +7,15 @@ #include <Windows.h> +#pragma warning(push, 0) +#include <boost/functional/hash.hpp> +#pragma warning(pop) + #include <cstddef> #include <cstring> #include <functional> #include <string> -#include <type_traits> namespace pdb { @@ -20,14 +23,19 @@ namespace pdb { std::size_t get_size(const std::string&); + inline bool operator==(const FILE_ID_128& a, const FILE_ID_128& b) + { + return 0 == std::memcmp(a.Identifier, b.Identifier, sizeof(a.Identifier)); + } + struct ID { const FILE_ID_INFO raw; bool operator==(const ID& other) const { - static_assert(std::is_pod<FILE_ID_INFO>::value, "Can't memcmp if file IDs aren't PODs"); - return 0 == std::memcmp(&raw, &other.raw, sizeof(FILE_ID_INFO)); + return raw.VolumeSerialNumber == other.raw.VolumeSerialNumber + && raw.FileId == other.raw.FileId; } }; @@ -42,7 +50,10 @@ namespace std { std::size_t operator()(const pdb::file::ID& id) const { - return _Bitwise_hash<FILE_ID_INFO>{}(id.raw); + std::size_t seed = 0; + boost::hash_combine(seed, id.raw.VolumeSerialNumber); + boost::hash_combine(seed, id.raw.FileId.Identifier); + return seed; } }; } |