diff options
| author | 2018-08-16 17:10:01 -0400 | |
|---|---|---|
| committer | 2018-08-23 11:53:30 -0400 | |
| commit | cde665c56514c1b701c0fe94fc943c7692be7f32 (patch) | |
| tree | 70ab7a531c27b88c423f08c3fd84313dad2fe081 /src/core/crypto/key_manager.h | |
| parent | game_list: Add SD registration loading to game list (diff) | |
| download | yuzu-cde665c56514c1b701c0fe94fc943c7692be7f32.tar.gz yuzu-cde665c56514c1b701c0fe94fc943c7692be7f32.tar.xz yuzu-cde665c56514c1b701c0fe94fc943c7692be7f32.zip | |
key_manager: Switch to boost flat_map for keys
Should make key gets marginally faster.
Diffstat (limited to 'src/core/crypto/key_manager.h')
| -rw-r--r-- | src/core/crypto/key_manager.h | 41 |
1 files changed, 11 insertions, 30 deletions
diff --git a/src/core/crypto/key_manager.h b/src/core/crypto/key_manager.h index 0c62d4421..33b1ad383 100644 --- a/src/core/crypto/key_manager.h +++ b/src/core/crypto/key_manager.h | |||
| @@ -7,10 +7,11 @@ | |||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <string> | 8 | #include <string> |
| 9 | #include <type_traits> | 9 | #include <type_traits> |
| 10 | #include <unordered_map> | ||
| 11 | #include <vector> | 10 | #include <vector> |
| 11 | #include <boost/container/flat_map.hpp> | ||
| 12 | #include <fmt/format.h> | 12 | #include <fmt/format.h> |
| 13 | #include "common/common_types.h" | 13 | #include "common/common_types.h" |
| 14 | #include "core/loader/loader.h" | ||
| 14 | 15 | ||
| 15 | namespace Core::Crypto { | 16 | namespace Core::Crypto { |
| 16 | 17 | ||
| @@ -59,34 +60,14 @@ struct KeyIndex { | |||
| 59 | } | 60 | } |
| 60 | }; | 61 | }; |
| 61 | 62 | ||
| 62 | // The following two (== and hash) are so KeyIndex can be a key in unordered_map | 63 | // boost flat_map requires operator< for O(log(n)) lookups. |
| 63 | |||
| 64 | template <typename KeyType> | ||
| 65 | bool operator==(const KeyIndex<KeyType>& lhs, const KeyIndex<KeyType>& rhs) { | ||
| 66 | return std::tie(lhs.type, lhs.field1, lhs.field2) == std::tie(rhs.type, rhs.field1, rhs.field2); | ||
| 67 | } | ||
| 68 | |||
| 69 | template <typename KeyType> | 64 | template <typename KeyType> |
| 70 | bool operator!=(const KeyIndex<KeyType>& lhs, const KeyIndex<KeyType>& rhs) { | 65 | bool operator<(const KeyIndex<KeyType>& lhs, const KeyIndex<KeyType>& rhs) { |
| 71 | return !operator==(lhs, rhs); | 66 | return (static_cast<size_t>(lhs.type) < static_cast<size_t>(rhs.type)) || |
| 67 | (lhs.type == rhs.type && lhs.field1 < rhs.field1) || | ||
| 68 | (lhs.type == rhs.type && lhs.field1 == rhs.field1 && lhs.field2 < rhs.field2); | ||
| 72 | } | 69 | } |
| 73 | 70 | ||
| 74 | } // namespace Core::Crypto | ||
| 75 | |||
| 76 | namespace std { | ||
| 77 | template <typename KeyType> | ||
| 78 | struct hash<Core::Crypto::KeyIndex<KeyType>> { | ||
| 79 | size_t operator()(const Core::Crypto::KeyIndex<KeyType>& k) const { | ||
| 80 | using std::hash; | ||
| 81 | |||
| 82 | return ((hash<u64>()(static_cast<u64>(k.type)) ^ (hash<u64>()(k.field1) << 1)) >> 1) ^ | ||
| 83 | (hash<u64>()(k.field2) << 1); | ||
| 84 | } | ||
| 85 | }; | ||
| 86 | } // namespace std | ||
| 87 | |||
| 88 | namespace Core::Crypto { | ||
| 89 | |||
| 90 | class KeyManager { | 71 | class KeyManager { |
| 91 | public: | 72 | public: |
| 92 | KeyManager(); | 73 | KeyManager(); |
| @@ -103,15 +84,15 @@ public: | |||
| 103 | static bool KeyFileExists(bool title); | 84 | static bool KeyFileExists(bool title); |
| 104 | 85 | ||
| 105 | private: | 86 | private: |
| 106 | std::unordered_map<KeyIndex<S128KeyType>, Key128> s128_keys; | 87 | boost::container::flat_map<KeyIndex<S128KeyType>, Key128> s128_keys; |
| 107 | std::unordered_map<KeyIndex<S256KeyType>, Key256> s256_keys; | 88 | boost::container::flat_map<KeyIndex<S256KeyType>, Key256> s256_keys; |
| 108 | 89 | ||
| 109 | bool dev_mode; | 90 | bool dev_mode; |
| 110 | void LoadFromFile(const std::string& filename, bool is_title_keys); | 91 | void LoadFromFile(const std::string& filename, bool is_title_keys); |
| 111 | void AttemptLoadKeyFile(const std::string& dir1, const std::string& dir2, | 92 | void AttemptLoadKeyFile(const std::string& dir1, const std::string& dir2, |
| 112 | const std::string& filename, bool title); | 93 | const std::string& filename, bool title); |
| 113 | 94 | ||
| 114 | static const std::unordered_map<std::string, KeyIndex<S128KeyType>> s128_file_id; | 95 | static const boost::container::flat_map<std::string, KeyIndex<S128KeyType>> s128_file_id; |
| 115 | static const std::unordered_map<std::string, KeyIndex<S256KeyType>> s256_file_id; | 96 | static const boost::container::flat_map<std::string, KeyIndex<S256KeyType>> s256_file_id; |
| 116 | }; | 97 | }; |
| 117 | } // namespace Core::Crypto | 98 | } // namespace Core::Crypto |