Browse Source
Merge pull request #9989 from Morph1984/boost-1.79-exact
Merge pull request #9989 from Morph1984/boost-1.79-exact
CMakeLists: Use boost 1.79.0 insteadnce_cpp
committed by
GitHub
7 changed files with 139 additions and 5 deletions
-
2CMakeLists.txt
-
1src/common/CMakeLists.txt
-
91src/common/container_hash.h
-
1src/tests/CMakeLists.txt
-
41src/tests/common/container_hash.cpp
-
6src/video_core/macro/macro.cpp
-
2vcpkg.json
@ -0,0 +1,91 @@ |
|||
// SPDX-FileCopyrightText: 2005-2014 Daniel James |
|||
// SPDX-FileCopyrightText: 2016 Austin Appleby |
|||
// SPDX-License-Identifier: BSL-1.0 |
|||
|
|||
#include <array> |
|||
#include <cstdint> |
|||
#include <limits> |
|||
#include <type_traits> |
|||
#include <vector> |
|||
|
|||
namespace Common { |
|||
|
|||
namespace detail { |
|||
|
|||
template <typename T> |
|||
requires std::is_unsigned_v<T> |
|||
inline std::size_t HashValue(T val) { |
|||
const unsigned int size_t_bits = std::numeric_limits<std::size_t>::digits; |
|||
const unsigned int length = |
|||
(std::numeric_limits<T>::digits - 1) / static_cast<unsigned int>(size_t_bits); |
|||
|
|||
std::size_t seed = 0; |
|||
|
|||
for (unsigned int i = length * size_t_bits; i > 0; i -= size_t_bits) { |
|||
seed ^= static_cast<size_t>(val >> i) + (seed << 6) + (seed >> 2); |
|||
} |
|||
|
|||
seed ^= static_cast<size_t>(val) + (seed << 6) + (seed >> 2); |
|||
|
|||
return seed; |
|||
} |
|||
|
|||
template <size_t Bits> |
|||
struct HashCombineImpl { |
|||
template <typename T> |
|||
static inline T fn(T seed, T value) { |
|||
seed ^= value + 0x9e3779b9 + (seed << 6) + (seed >> 2); |
|||
return seed; |
|||
} |
|||
}; |
|||
|
|||
template <> |
|||
struct HashCombineImpl<64> { |
|||
static inline std::uint64_t fn(std::uint64_t h, std::uint64_t k) { |
|||
const std::uint64_t m = (std::uint64_t(0xc6a4a793) << 32) + 0x5bd1e995; |
|||
const int r = 47; |
|||
|
|||
k *= m; |
|||
k ^= k >> r; |
|||
k *= m; |
|||
|
|||
h ^= k; |
|||
h *= m; |
|||
|
|||
// Completely arbitrary number, to prevent 0's |
|||
// from hashing to 0. |
|||
h += 0xe6546b64; |
|||
|
|||
return h; |
|||
} |
|||
}; |
|||
|
|||
} // namespace detail |
|||
|
|||
template <typename T> |
|||
inline void HashCombine(std::size_t& seed, const T& v) { |
|||
seed = detail::HashCombineImpl<sizeof(std::size_t) * CHAR_BIT>::fn(seed, detail::HashValue(v)); |
|||
} |
|||
|
|||
template <typename It> |
|||
inline std::size_t HashRange(It first, It last) { |
|||
std::size_t seed = 0; |
|||
|
|||
for (; first != last; ++first) { |
|||
HashCombine<typename std::iterator_traits<It>::value_type>(seed, *first); |
|||
} |
|||
|
|||
return seed; |
|||
} |
|||
|
|||
template <typename T, size_t Size> |
|||
std::size_t HashValue(const std::array<T, Size>& v) { |
|||
return HashRange(v.cbegin(), v.cend()); |
|||
} |
|||
|
|||
template <typename T, typename Allocator> |
|||
std::size_t HashValue(const std::vector<T, Allocator>& v) { |
|||
return HashRange(v.cbegin(), v.cend()); |
|||
} |
|||
|
|||
} // namespace Common |
|||
@ -0,0 +1,41 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include <catch2/catch_test_macros.hpp>
|
|||
|
|||
#include "common/common_types.h"
|
|||
#include "common/container_hash.h"
|
|||
|
|||
TEST_CASE("ContainerHash", "[common]") { |
|||
constexpr std::array<u8, 32> U8Values{ |
|||
114, 10, 238, 189, 199, 242, 86, 96, 53, 193, 195, 247, 249, 56, 253, 61, |
|||
205, 3, 172, 4, 210, 197, 43, 72, 103, 8, 99, 89, 5, 97, 68, 196, |
|||
}; |
|||
constexpr std::array<u16, 32> U16Values{ |
|||
61586, 49151, 3313, 11641, 31695, 54795, 46764, 20965, 23287, 14039, 19265, |
|||
49093, 58932, 22518, 27139, 42825, 57417, 54237, 48057, 14586, 42813, 32994, |
|||
33970, 45501, 5619, 15895, 33227, 27509, 25391, 37275, 60218, 17599, |
|||
}; |
|||
constexpr std::array<u32, 32> U32Values{ |
|||
3838402410, 2029146863, 1730869921, 985528872, 186773874, 2094639868, 3324775932, |
|||
1795512424, 2571165571, 3256934519, 2358691590, 2752682538, 1484336451, 378124520, |
|||
3463015699, 3395942161, 1263211979, 3473632889, 3039822212, 2068707357, 2223837919, |
|||
1823232191, 1583884041, 1264393380, 4087566993, 3188607101, 3933680362, 1464520765, |
|||
1786838406, 1311734848, 2773642241, 3993641692, |
|||
}; |
|||
constexpr std::array<u64, 32> U64Values{ |
|||
5908025796157537817, 10947547850358315100, 844798943576724669, 7999662937458523703, |
|||
4006550374705895164, 1832550525423503632, 9323088254855830976, 12028890075598379412, |
|||
6021511300787826236, 7864675007938747948, 18099387408859708806, 6438638299316820708, |
|||
9029399285648501543, 18195459433089960253, 17214335092761966083, 5549347964591337833, |
|||
14899526073304962015, 5058883181561464475, 7436311795731206973, 7535129567768649864, |
|||
1287169596809258072, 8237671246353565927, 1715230541978016153, 8443157615068813300, |
|||
6098675262328527839, 704652094100376853, 1303411723202926503, 7808312933946424854, |
|||
6863726670433556594, 9870361541383217495, 9273671094091079488, 17541434976160119010, |
|||
}; |
|||
|
|||
REQUIRE(Common::HashValue(U8Values) == 5867183267093890552); |
|||
REQUIRE(Common::HashValue(U16Values) == 9594135570564347135); |
|||
REQUIRE(Common::HashValue(U32Values) == 13123757214696618460); |
|||
REQUIRE(Common::HashValue(U64Values) == 7296500016546938380); |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue