-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add stuff for compiler user tracking
- Loading branch information
1 parent
f2474e1
commit 0386325
Showing
1,563 changed files
with
247,188 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,9 @@ | ||
add_library(boost INTERFACE) | ||
target_include_directories(boost SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libs/align/include/) | ||
target_include_directories(boost SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libs/range/include/) | ||
target_include_directories(boost SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libs/optional/include/) | ||
target_include_directories(boost SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libs/utility/include/) | ||
target_include_directories(boost SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libs/tuple/include/) | ||
target_include_directories(boost SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libs/iterator/include/) | ||
target_include_directories(boost SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) | ||
add_library(Boost::headers ALIAS boost) |
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
// Copyright 2021-2023 Peter Dimov | ||
// Distributed under the Boost Software License, Version 1.0. | ||
// https://www.boost.org/LICENSE_1_0.txt | ||
|
||
#ifndef BOOST_HASH_DETAIL_HASH_INTEGRAL_HPP | ||
#define BOOST_HASH_DETAIL_HASH_INTEGRAL_HPP | ||
|
||
#include <boost/container_hash/detail/hash_mix.hpp> | ||
#include <type_traits> | ||
#include <cstddef> | ||
#include <climits> | ||
|
||
namespace boost | ||
{ | ||
namespace hash_detail | ||
{ | ||
|
||
// libstdc++ doesn't provide support for __int128 in the standard traits | ||
|
||
template<class T> struct is_integral: public std::is_integral<T> | ||
{ | ||
}; | ||
|
||
template<class T> struct is_unsigned: public std::is_unsigned<T> | ||
{ | ||
}; | ||
|
||
template<class T> struct make_unsigned: public std::make_unsigned<T> | ||
{ | ||
}; | ||
|
||
#if defined(__SIZEOF_INT128__) | ||
|
||
template<> struct is_integral<__int128_t>: public std::true_type | ||
{ | ||
}; | ||
|
||
template<> struct is_integral<__uint128_t>: public std::true_type | ||
{ | ||
}; | ||
|
||
template<> struct is_unsigned<__int128_t>: public std::false_type | ||
{ | ||
}; | ||
|
||
template<> struct is_unsigned<__uint128_t>: public std::true_type | ||
{ | ||
}; | ||
|
||
template<> struct make_unsigned<__int128_t> | ||
{ | ||
typedef __uint128_t type; | ||
}; | ||
|
||
template<> struct make_unsigned<__uint128_t> | ||
{ | ||
typedef __uint128_t type; | ||
}; | ||
|
||
#endif | ||
|
||
template<class T, | ||
bool bigger_than_size_t = (sizeof(T) > sizeof(std::size_t)), | ||
bool is_unsigned = is_unsigned<T>::value, | ||
std::size_t size_t_bits = sizeof(std::size_t) * CHAR_BIT, | ||
std::size_t type_bits = sizeof(T) * CHAR_BIT> | ||
struct hash_integral_impl; | ||
|
||
template<class T, bool is_unsigned, std::size_t size_t_bits, std::size_t type_bits> struct hash_integral_impl<T, false, is_unsigned, size_t_bits, type_bits> | ||
{ | ||
static std::size_t fn( T v ) | ||
{ | ||
return static_cast<std::size_t>( v ); | ||
} | ||
}; | ||
|
||
template<class T, std::size_t size_t_bits, std::size_t type_bits> struct hash_integral_impl<T, true, false, size_t_bits, type_bits> | ||
{ | ||
static std::size_t fn( T v ) | ||
{ | ||
typedef typename make_unsigned<T>::type U; | ||
|
||
if( v >= 0 ) | ||
{ | ||
return hash_integral_impl<U>::fn( static_cast<U>( v ) ); | ||
} | ||
else | ||
{ | ||
return ~hash_integral_impl<U>::fn( static_cast<U>( ~static_cast<U>( v ) ) ); | ||
} | ||
} | ||
}; | ||
|
||
template<class T> struct hash_integral_impl<T, true, true, 32, 64> | ||
{ | ||
static std::size_t fn( T v ) | ||
{ | ||
std::size_t seed = 0; | ||
|
||
seed = static_cast<std::size_t>( v >> 32 ) + hash_detail::hash_mix( seed ); | ||
seed = static_cast<std::size_t>( v & 0xFFFFFFFF ) + hash_detail::hash_mix( seed ); | ||
|
||
return seed; | ||
} | ||
}; | ||
|
||
template<class T> struct hash_integral_impl<T, true, true, 32, 128> | ||
{ | ||
static std::size_t fn( T v ) | ||
{ | ||
std::size_t seed = 0; | ||
|
||
seed = static_cast<std::size_t>( v >> 96 ) + hash_detail::hash_mix( seed ); | ||
seed = static_cast<std::size_t>( v >> 64 ) + hash_detail::hash_mix( seed ); | ||
seed = static_cast<std::size_t>( v >> 32 ) + hash_detail::hash_mix( seed ); | ||
seed = static_cast<std::size_t>( v ) + hash_detail::hash_mix( seed ); | ||
|
||
return seed; | ||
} | ||
}; | ||
|
||
template<class T> struct hash_integral_impl<T, true, true, 64, 128> | ||
{ | ||
static std::size_t fn( T v ) | ||
{ | ||
std::size_t seed = 0; | ||
|
||
seed = static_cast<std::size_t>( v >> 64 ) + hash_detail::hash_mix( seed ); | ||
seed = static_cast<std::size_t>( v ) + hash_detail::hash_mix( seed ); | ||
|
||
return seed; | ||
} | ||
}; | ||
|
||
} // namespace hash_detail | ||
|
||
template <typename T> | ||
typename std::enable_if<hash_detail::is_integral<T>::value, std::size_t>::type | ||
hash_value( T v ) | ||
{ | ||
return hash_detail::hash_integral_impl<T>::fn( v ); | ||
} | ||
|
||
} // namespace boost | ||
|
||
#endif // #ifndef BOOST_HASH_DETAIL_HASH_INTEGRAL_HPP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
// Copyright 2022 Peter Dimov | ||
// Distributed under the Boost Software License, Version 1.0. | ||
// https://www.boost.org/LICENSE_1_0.txt | ||
|
||
#ifndef BOOST_HASH_DETAIL_HASH_MIX_HPP | ||
#define BOOST_HASH_DETAIL_HASH_MIX_HPP | ||
|
||
#include <cstdint> | ||
#include <cstddef> | ||
#include <climits> | ||
|
||
namespace boost | ||
{ | ||
namespace hash_detail | ||
{ | ||
|
||
template<std::size_t Bits> struct hash_mix_impl; | ||
|
||
// hash_mix for 64 bit size_t | ||
// | ||
// The general "xmxmx" form of state of the art 64 bit mixers originates | ||
// from Murmur3 by Austin Appleby, which uses the following function as | ||
// its "final mix": | ||
// | ||
// k ^= k >> 33; | ||
// k *= 0xff51afd7ed558ccd; | ||
// k ^= k >> 33; | ||
// k *= 0xc4ceb9fe1a85ec53; | ||
// k ^= k >> 33; | ||
// | ||
// (https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp) | ||
// | ||
// It has subsequently been improved multiple times by different authors | ||
// by changing the constants. The most well known improvement is the | ||
// so-called "variant 13" function by David Stafford: | ||
// | ||
// k ^= k >> 30; | ||
// k *= 0xbf58476d1ce4e5b9; | ||
// k ^= k >> 27; | ||
// k *= 0x94d049bb133111eb; | ||
// k ^= k >> 31; | ||
// | ||
// (https://zimbry.blogspot.com/2011/09/better-bit-mixing-improving-on.html) | ||
// | ||
// This mixing function is used in the splitmix64 RNG: | ||
// http://xorshift.di.unimi.it/splitmix64.c | ||
// | ||
// We use Jon Maiga's implementation from | ||
// http://jonkagstrom.com/mx3/mx3_rev2.html | ||
// | ||
// x ^= x >> 32; | ||
// x *= 0xe9846af9b1a615d; | ||
// x ^= x >> 32; | ||
// x *= 0xe9846af9b1a615d; | ||
// x ^= x >> 28; | ||
// | ||
// An equally good alternative is Pelle Evensen's Moremur: | ||
// | ||
// x ^= x >> 27; | ||
// x *= 0x3C79AC492BA7B653; | ||
// x ^= x >> 33; | ||
// x *= 0x1C69B3F74AC4AE35; | ||
// x ^= x >> 27; | ||
// | ||
// (https://mostlymangling.blogspot.com/2019/12/stronger-better-morer-moremur-better.html) | ||
|
||
template<> struct hash_mix_impl<64> | ||
{ | ||
inline static std::uint64_t fn( std::uint64_t x ) | ||
{ | ||
std::uint64_t const m = 0xe9846af9b1a615d; | ||
|
||
x ^= x >> 32; | ||
x *= m; | ||
x ^= x >> 32; | ||
x *= m; | ||
x ^= x >> 28; | ||
|
||
return x; | ||
} | ||
}; | ||
|
||
// hash_mix for 32 bit size_t | ||
// | ||
// We use the "best xmxmx" implementation from | ||
// https://github.com/skeeto/hash-prospector/issues/19 | ||
|
||
template<> struct hash_mix_impl<32> | ||
{ | ||
inline static std::uint32_t fn( std::uint32_t x ) | ||
{ | ||
std::uint32_t const m1 = 0x21f0aaad; | ||
std::uint32_t const m2 = 0x735a2d97; | ||
|
||
x ^= x >> 16; | ||
x *= m1; | ||
x ^= x >> 15; | ||
x *= m2; | ||
x ^= x >> 15; | ||
|
||
return x; | ||
} | ||
}; | ||
|
||
inline std::size_t hash_mix( std::size_t v ) | ||
{ | ||
return hash_mix_impl<sizeof(std::size_t) * CHAR_BIT>::fn( v ); | ||
} | ||
|
||
} // namespace hash_detail | ||
} // namespace boost | ||
|
||
#endif // #ifndef BOOST_HASH_DETAIL_HASH_MIX_HPP |
Oops, something went wrong.