forked from boostorg/container_hash
Support for removed function objects in C++17
std::unary_function and std::binary_function are removed in C++17, and Visual C++ is the first compiler to do this (when the appropriate macro is defined). I'm not sure what the long term solution should be, but hopefully this will work for now.
This commit is contained in:
@@ -24,6 +24,8 @@ matrix:
|
|||||||
env: BJAM_TOOLSET=clang-std03
|
env: BJAM_TOOLSET=clang-std03
|
||||||
- compiler: clang
|
- compiler: clang
|
||||||
env: BJAM_TOOLSET=clang-std11
|
env: BJAM_TOOLSET=clang-std11
|
||||||
|
- compiler: clang
|
||||||
|
env: BJAM_TOOLSET=clang-pretend_no_auto_ptr_etc
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- |
|
- |
|
||||||
@@ -31,6 +33,7 @@ before_script:
|
|||||||
echo "using gcc : std11 : g++-4.8 -Werror --std=c++11 ;" >> ~/user-config.jam
|
echo "using gcc : std11 : g++-4.8 -Werror --std=c++11 ;" >> ~/user-config.jam
|
||||||
echo "using clang : std03 : clang++ -Werror --std=c++03 ;" >> ~/user-config.jam
|
echo "using clang : std03 : clang++ -Werror --std=c++03 ;" >> ~/user-config.jam
|
||||||
echo "using clang : std11 : clang++ -Werror --std=c++11 ;" >> ~/user-config.jam
|
echo "using clang : std11 : clang++ -Werror --std=c++11 ;" >> ~/user-config.jam
|
||||||
|
echo "using clang : pretend_no_auto_ptr_etc : clang++ -Werror --std=c++11 -D_HAS_AUTO_PTR_ETC=0 ;" >> ~/user-config.jam
|
||||||
- cat ~/user-config.jam
|
- cat ~/user-config.jam
|
||||||
- touch Jamroot.jam
|
- touch Jamroot.jam
|
||||||
|
|
||||||
|
@@ -254,7 +254,7 @@ namespace boost
|
|||||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
||||||
|
|
||||||
template <class T> struct hash
|
template <class T> struct hash
|
||||||
: std::unary_function<T, std::size_t>
|
: boost::hash_detail::hash_base<T>
|
||||||
{
|
{
|
||||||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
||||||
std::size_t operator()(T const& val) const
|
std::size_t operator()(T const& val) const
|
||||||
@@ -271,7 +271,7 @@ namespace boost
|
|||||||
|
|
||||||
#if BOOST_WORKAROUND(__DMC__, <= 0x848)
|
#if BOOST_WORKAROUND(__DMC__, <= 0x848)
|
||||||
template <class T, unsigned int n> struct hash<T[n]>
|
template <class T, unsigned int n> struct hash<T[n]>
|
||||||
: std::unary_function<T[n], std::size_t>
|
: boost::hash_detail::hash_base<T[n]>
|
||||||
{
|
{
|
||||||
std::size_t operator()(const T* val) const
|
std::size_t operator()(const T* val) const
|
||||||
{
|
{
|
||||||
@@ -296,7 +296,7 @@ namespace boost
|
|||||||
{
|
{
|
||||||
template <class T>
|
template <class T>
|
||||||
struct inner
|
struct inner
|
||||||
: std::unary_function<T, std::size_t>
|
: boost::hash_detail::hash_base<T>
|
||||||
{
|
{
|
||||||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
||||||
std::size_t operator()(T const& val) const
|
std::size_t operator()(T const& val) const
|
||||||
|
@@ -62,6 +62,18 @@ namespace boost
|
|||||||
{
|
{
|
||||||
namespace hash_detail
|
namespace hash_detail
|
||||||
{
|
{
|
||||||
|
#if defined(_HAS_AUTO_PTR_ETC) && !_HAS_AUTO_PTR_ETC
|
||||||
|
template <typename T>
|
||||||
|
struct hash_base
|
||||||
|
{
|
||||||
|
typedef T argument_type;
|
||||||
|
typedef std::size_t result_type;
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
template <typename T>
|
||||||
|
struct hash_base : std::unary_function<T, std::size_t> {};
|
||||||
|
#endif
|
||||||
|
|
||||||
struct enable_hash_value { typedef std::size_t type; };
|
struct enable_hash_value { typedef std::size_t type; };
|
||||||
|
|
||||||
template <typename T> struct basic_numbers {};
|
template <typename T> struct basic_numbers {};
|
||||||
@@ -419,7 +431,7 @@ namespace boost
|
|||||||
|
|
||||||
#define BOOST_HASH_SPECIALIZE(type) \
|
#define BOOST_HASH_SPECIALIZE(type) \
|
||||||
template <> struct hash<type> \
|
template <> struct hash<type> \
|
||||||
: public std::unary_function<type, std::size_t> \
|
: public boost::hash_detail::hash_base<type> \
|
||||||
{ \
|
{ \
|
||||||
std::size_t operator()(type v) const \
|
std::size_t operator()(type v) const \
|
||||||
{ \
|
{ \
|
||||||
@@ -429,7 +441,7 @@ namespace boost
|
|||||||
|
|
||||||
#define BOOST_HASH_SPECIALIZE_REF(type) \
|
#define BOOST_HASH_SPECIALIZE_REF(type) \
|
||||||
template <> struct hash<type> \
|
template <> struct hash<type> \
|
||||||
: public std::unary_function<type, std::size_t> \
|
: public boost::hash_detail::hash_base<type> \
|
||||||
{ \
|
{ \
|
||||||
std::size_t operator()(type const& v) const \
|
std::size_t operator()(type const& v) const \
|
||||||
{ \
|
{ \
|
||||||
@@ -483,7 +495,7 @@ namespace boost
|
|||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct hash<T*>
|
struct hash<T*>
|
||||||
: public std::unary_function<T*, std::size_t>
|
: public boost::hash_detail::hash_base<T*>
|
||||||
{
|
{
|
||||||
std::size_t operator()(T* v) const
|
std::size_t operator()(T* v) const
|
||||||
{
|
{
|
||||||
@@ -516,7 +528,7 @@ namespace boost
|
|||||||
{
|
{
|
||||||
template <class T>
|
template <class T>
|
||||||
struct inner
|
struct inner
|
||||||
: public std::unary_function<T, std::size_t>
|
: public boost::hash_detail::hash_base<T>
|
||||||
{
|
{
|
||||||
std::size_t operator()(T val) const
|
std::size_t operator()(T val) const
|
||||||
{
|
{
|
||||||
|
@@ -10,7 +10,9 @@
|
|||||||
template <class T>
|
template <class T>
|
||||||
void compile_time_tests(T*)
|
void compile_time_tests(T*)
|
||||||
{
|
{
|
||||||
|
#if !defined(_HAS_AUTO_PTR_ETC) || _HAS_AUTO_PTR_ETC
|
||||||
BOOST_STATIC_ASSERT((boost::is_base_and_derived<
|
BOOST_STATIC_ASSERT((boost::is_base_and_derived<
|
||||||
std::unary_function<T, std::size_t>, BOOST_HASH_TEST_NAMESPACE::hash<T> >::value));
|
std::unary_function<T, std::size_t>, BOOST_HASH_TEST_NAMESPACE::hash<T> >::value));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user