forked from boostorg/container_hash
Compare commits
35 Commits
boost-1.61
...
boost-1.65
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
955cdaed3d | ||
|
|
9c82e48bc9 | ||
|
|
1b3bed82aa | ||
|
|
6dd58674aa | ||
|
|
4a530f85d0 | ||
|
|
babb4f8f73 | ||
|
|
01b81754cf | ||
|
|
5210c845f5 | ||
|
|
4b99dbdb64 | ||
|
|
2cdf1c7d9e | ||
|
|
a489b08e27 | ||
|
|
b9c3499f45 | ||
|
|
ab9f98455a | ||
|
|
7159a86166 | ||
|
|
d0ee8e13bd | ||
|
|
98140b7373 | ||
|
|
e2d7225f57 | ||
|
|
36545f62cf | ||
|
|
618fc6d074 | ||
|
|
c2764e22a7 | ||
|
|
9148cde86f | ||
|
|
5a811f25aa | ||
|
|
b790429529 | ||
|
|
1e6cefbfeb | ||
|
|
b0ddb244be | ||
|
|
3dfdb19bfd | ||
|
|
f184dd019f | ||
|
|
0361d416b7 | ||
|
|
7838c3678f | ||
|
|
5856bff480 | ||
|
|
468516ed71 | ||
|
|
c8d8c7edd4 | ||
|
|
e76c3dc1a2 | ||
|
|
8171dbb465 | ||
|
|
99d4923496 |
42
.travis.yml
Normal file
42
.travis.yml
Normal file
@@ -0,0 +1,42 @@
|
||||
# Copyright (C) 2016 Daniel James.
|
||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
# Use Trusty to get a reasonably recent version of Boost.
|
||||
sudo: required
|
||||
dist: trusty
|
||||
|
||||
language: c++
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libboost-dev
|
||||
- libboost-tools-dev
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- compiler: gcc
|
||||
env: BJAM_TOOLSET=gcc-std03
|
||||
- compiler: gcc
|
||||
env: BJAM_TOOLSET=gcc-std11
|
||||
- compiler: clang
|
||||
env: BJAM_TOOLSET=clang-std03
|
||||
- compiler: clang
|
||||
env: BJAM_TOOLSET=clang-std11
|
||||
- compiler: clang
|
||||
env: BJAM_TOOLSET=clang-pretend_no_auto_ptr_etc
|
||||
|
||||
before_script:
|
||||
- |
|
||||
echo "using gcc : std03 : g++-4.8 -Werror --std=c++03 ;" > ~/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 : 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
|
||||
- touch Jamroot.jam
|
||||
|
||||
script:
|
||||
- cd ${TRAVIS_BUILD_DIR}/test
|
||||
- bjam -q ${BJAM_TOOLSET} include=${TRAVIS_BUILD_DIR}/include
|
||||
@@ -179,4 +179,20 @@
|
||||
* Fixed strict aliasing violation
|
||||
([@https://github.com/boostorg/functional/pull/3 GitHub #3]).
|
||||
|
||||
[h2 Boost 1.63.0]
|
||||
|
||||
* Fixed some warnings.
|
||||
* Only define hash for `std::wstring` when we know we have a `wchar_t`.
|
||||
Otherwise there's a compile error as there's no overload for hashing
|
||||
the characters in wide strings ([ticket 8552]).
|
||||
|
||||
[h2 Boost 1.64.0]
|
||||
|
||||
* Fix for recent versions of Visual C++ which have removed `std::unary_function`
|
||||
and `std::binary_function` ([ticket 12353]).
|
||||
|
||||
[h2 Boost 1.65.0]
|
||||
|
||||
* Support for `char16_t`, `char32_t`, `u16string`, `u32string`
|
||||
|
||||
[endsect]
|
||||
|
||||
85
doc/ref.xml
85
doc/ref.xml
@@ -162,6 +162,42 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
</method>
|
||||
</struct-specialization>
|
||||
|
||||
<struct-specialization name="hash">
|
||||
<template></template>
|
||||
<specialization>
|
||||
<template-arg>char16_t</template-arg>
|
||||
</specialization>
|
||||
<method name="operator()" cv="const">
|
||||
<type>std::size_t</type>
|
||||
<parameter name="val">
|
||||
<paramtype>char16_t</paramtype>
|
||||
</parameter>
|
||||
<returns>
|
||||
<para>Unspecified in TR1, except that equal arguments yield the same result.</para>
|
||||
<para><functionname>hash_value</functionname>(val) in Boost.</para>
|
||||
</returns>
|
||||
<throws><para>Doesn't throw</para></throws>
|
||||
</method>
|
||||
</struct-specialization>
|
||||
|
||||
<struct-specialization name="hash">
|
||||
<template></template>
|
||||
<specialization>
|
||||
<template-arg>char32_t</template-arg>
|
||||
</specialization>
|
||||
<method name="operator()" cv="const">
|
||||
<type>std::size_t</type>
|
||||
<parameter name="val">
|
||||
<paramtype>char32_t</paramtype>
|
||||
</parameter>
|
||||
<returns>
|
||||
<para>Unspecified in TR1, except that equal arguments yield the same result.</para>
|
||||
<para><functionname>hash_value</functionname>(val) in Boost.</para>
|
||||
</returns>
|
||||
<throws><para>Doesn't throw</para></throws>
|
||||
</method>
|
||||
</struct-specialization>
|
||||
|
||||
<struct-specialization name="hash">
|
||||
<template></template>
|
||||
<specialization>
|
||||
@@ -396,6 +432,42 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
</method>
|
||||
</struct-specialization>
|
||||
|
||||
<struct-specialization name="hash">
|
||||
<template></template>
|
||||
<specialization>
|
||||
<template-arg>std::u16string</template-arg>
|
||||
</specialization>
|
||||
<method name="operator()" cv="const">
|
||||
<type>std::size_t</type>
|
||||
<parameter name="val">
|
||||
<paramtype>std::u16string const&</paramtype>
|
||||
</parameter>
|
||||
<returns>
|
||||
<para>Unspecified in TR1, except that equal arguments yield the same result.</para>
|
||||
<para><functionname>hash_value</functionname>(val) in Boost.</para>
|
||||
</returns>
|
||||
<throws><para>Doesn't throw</para></throws>
|
||||
</method>
|
||||
</struct-specialization>
|
||||
|
||||
<struct-specialization name="hash">
|
||||
<template></template>
|
||||
<specialization>
|
||||
<template-arg>std::u32string</template-arg>
|
||||
</specialization>
|
||||
<method name="operator()" cv="const">
|
||||
<type>std::size_t</type>
|
||||
<parameter name="val">
|
||||
<paramtype>std::u32string const&</paramtype>
|
||||
</parameter>
|
||||
<returns>
|
||||
<para>Unspecified in TR1, except that equal arguments yield the same result.</para>
|
||||
<para><functionname>hash_value</functionname>(val) in Boost.</para>
|
||||
</returns>
|
||||
<throws><para>Doesn't throw</para></throws>
|
||||
</method>
|
||||
</struct-specialization>
|
||||
|
||||
<struct-specialization name="hash">
|
||||
<template>
|
||||
<template-type-parameter name="T"/>
|
||||
@@ -597,6 +669,16 @@ for(; first != last; ++first)
|
||||
<parameter name="val"><paramtype>wchar_t</paramtype></parameter>
|
||||
</signature>
|
||||
|
||||
<signature>
|
||||
<type>std::size_t</type>
|
||||
<parameter name="val"><paramtype>char16_t</paramtype></parameter>
|
||||
</signature>
|
||||
|
||||
<signature>
|
||||
<type>std::size_t</type>
|
||||
<parameter name="val"><paramtype>char32_t</paramtype></parameter>
|
||||
</signature>
|
||||
|
||||
<signature>
|
||||
<type>std::size_t</type>
|
||||
<parameter name="val"><paramtype>short</paramtype></parameter>
|
||||
@@ -833,7 +915,8 @@ for(; first != last; ++first)
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><code>bool</code>,
|
||||
<code>char</code>, <code>signed char</code>, <code>unsigned char</code>, <code>wchar_t</code>,
|
||||
<code>char</code>, <code>signed char</code>, <code>unsigned char</code>,
|
||||
<code>wchar_t</code>, <code>char16_t</code>, <code>char32_t</code>,
|
||||
<code>short</code>, <code>unsigned short</code>,
|
||||
<code>int</code>, <code>unsigned int</code>, <code>long</code>, <code>unsigned long</code>
|
||||
</entry>
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Force use of assert.
|
||||
#if defined(NDEBUG)
|
||||
#undef NDEBUG
|
||||
#endif
|
||||
|
||||
#include <boost/functional/hash.hpp>
|
||||
#include <cassert>
|
||||
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Force use of assert.
|
||||
#if defined(NDEBUG)
|
||||
#undef NDEBUG
|
||||
#endif
|
||||
|
||||
#include <boost/functional/hash.hpp>
|
||||
#include <cassert>
|
||||
|
||||
|
||||
@@ -179,7 +179,7 @@ namespace boost
|
||||
hash_float_combine(seed, part);
|
||||
}
|
||||
|
||||
hash_float_combine(seed, exp);
|
||||
hash_float_combine(seed, static_cast<std::size_t>(exp));
|
||||
|
||||
return seed;
|
||||
}
|
||||
|
||||
@@ -254,7 +254,7 @@ namespace boost
|
||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
||||
|
||||
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)
|
||||
std::size_t operator()(T const& val) const
|
||||
@@ -271,7 +271,7 @@ namespace boost
|
||||
|
||||
#if BOOST_WORKAROUND(__DMC__, <= 0x848)
|
||||
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
|
||||
{
|
||||
@@ -296,7 +296,7 @@ namespace boost
|
||||
{
|
||||
template <class T>
|
||||
struct inner
|
||||
: std::unary_function<T, std::size_t>
|
||||
: boost::hash_detail::hash_base<T>
|
||||
{
|
||||
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
||||
std::size_t operator()(T const& val) const
|
||||
|
||||
@@ -62,6 +62,18 @@ namespace boost
|
||||
{
|
||||
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; };
|
||||
|
||||
template <typename T> struct basic_numbers {};
|
||||
@@ -95,6 +107,16 @@ namespace boost
|
||||
boost::hash_detail::enable_hash_value {};
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||
template <> struct basic_numbers<char16_t> :
|
||||
boost::hash_detail::enable_hash_value {};
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||
template <> struct basic_numbers<char32_t> :
|
||||
boost::hash_detail::enable_hash_value {};
|
||||
#endif
|
||||
|
||||
// long_numbers is defined like this to allow for separate
|
||||
// specialization for long_long and int128_type, in case
|
||||
// they conflict.
|
||||
@@ -168,10 +190,10 @@ namespace boost
|
||||
template <class T>
|
||||
inline std::size_t hash_value_signed(T val)
|
||||
{
|
||||
const int size_t_bits = std::numeric_limits<std::size_t>::digits;
|
||||
const unsigned int size_t_bits = std::numeric_limits<std::size_t>::digits;
|
||||
// ceiling(std::numeric_limits<T>::digits / size_t_bits) - 1
|
||||
const int length = (std::numeric_limits<T>::digits - 1)
|
||||
/ size_t_bits;
|
||||
/ static_cast<int>(size_t_bits);
|
||||
|
||||
std::size_t seed = 0;
|
||||
T positive = val < 0 ? -1 - val : val;
|
||||
@@ -189,10 +211,10 @@ namespace boost
|
||||
template <class T>
|
||||
inline std::size_t hash_value_unsigned(T val)
|
||||
{
|
||||
const int size_t_bits = std::numeric_limits<std::size_t>::digits;
|
||||
const unsigned int size_t_bits = std::numeric_limits<std::size_t>::digits;
|
||||
// ceiling(std::numeric_limits<T>::digits / size_t_bits) - 1
|
||||
const int length = (std::numeric_limits<T>::digits - 1)
|
||||
/ size_t_bits;
|
||||
/ static_cast<int>(size_t_bits);
|
||||
|
||||
std::size_t seed = 0;
|
||||
|
||||
@@ -212,7 +234,6 @@ namespace boost
|
||||
seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2);
|
||||
}
|
||||
|
||||
template <typename SizeT>
|
||||
inline void hash_combine_impl(boost::uint32_t& h1,
|
||||
boost::uint32_t k1)
|
||||
{
|
||||
@@ -229,16 +250,15 @@ namespace boost
|
||||
}
|
||||
|
||||
|
||||
// Don't define 64-bit hash combine on platforms with 64 bit integers,
|
||||
// Don't define 64-bit hash combine on platforms without 64 bit integers,
|
||||
// and also not for 32-bit gcc as it warns about the 64-bit constant.
|
||||
#if !defined(BOOST_NO_INT64_T) && \
|
||||
!(defined(__GNUC__) && ULONG_MAX == 0xffffffff)
|
||||
|
||||
template <typename SizeT>
|
||||
inline void hash_combine_impl(boost::uint64_t& h,
|
||||
boost::uint64_t k)
|
||||
{
|
||||
const uint64_t m = UINT64_C(0xc6a4a7935bd1e995);
|
||||
const boost::uint64_t m = UINT64_C(0xc6a4a7935bd1e995);
|
||||
const int r = 47;
|
||||
|
||||
k *= m;
|
||||
@@ -247,6 +267,10 @@ namespace boost
|
||||
|
||||
h ^= k;
|
||||
h *= m;
|
||||
|
||||
// Completely arbitrary number, to prevent 0's
|
||||
// from hashing to 0.
|
||||
h += 0xe6546b64;
|
||||
}
|
||||
|
||||
#endif // BOOST_NO_INT64_T
|
||||
@@ -417,7 +441,7 @@ namespace boost
|
||||
|
||||
#define BOOST_HASH_SPECIALIZE(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 \
|
||||
{ \
|
||||
@@ -427,7 +451,7 @@ namespace boost
|
||||
|
||||
#define BOOST_HASH_SPECIALIZE_REF(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 \
|
||||
{ \
|
||||
@@ -441,6 +465,12 @@ namespace boost
|
||||
BOOST_HASH_SPECIALIZE(unsigned char)
|
||||
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
||||
BOOST_HASH_SPECIALIZE(wchar_t)
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||
BOOST_HASH_SPECIALIZE(char16_t)
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||
BOOST_HASH_SPECIALIZE(char32_t)
|
||||
#endif
|
||||
BOOST_HASH_SPECIALIZE(short)
|
||||
BOOST_HASH_SPECIALIZE(unsigned short)
|
||||
@@ -454,9 +484,15 @@ namespace boost
|
||||
BOOST_HASH_SPECIALIZE(long double)
|
||||
|
||||
BOOST_HASH_SPECIALIZE_REF(std::string)
|
||||
#if !defined(BOOST_NO_STD_WSTRING)
|
||||
#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
||||
BOOST_HASH_SPECIALIZE_REF(std::wstring)
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||
BOOST_HASH_SPECIALIZE_REF(std::basic_string<char16_t>)
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||
BOOST_HASH_SPECIALIZE_REF(std::basic_string<char32_t>)
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_LONG_LONG)
|
||||
BOOST_HASH_SPECIALIZE(boost::long_long_type)
|
||||
@@ -481,7 +517,7 @@ namespace boost
|
||||
|
||||
template <class 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
|
||||
{
|
||||
@@ -514,7 +550,7 @@ namespace boost
|
||||
{
|
||||
template <class T>
|
||||
struct inner
|
||||
: public std::unary_function<T, std::size_t>
|
||||
: public boost::hash_detail::hash_base<T>
|
||||
{
|
||||
std::size_t operator()(T val) const
|
||||
{
|
||||
|
||||
@@ -12,6 +12,7 @@ project hash-tests
|
||||
#<toolset>intel:<cxxflags>-strict-ansi
|
||||
<toolset>gcc:<cxxflags>"-pedantic -Wstrict-aliasing -fstrict-aliasing -Wextra -Wsign-promo -Wunused-parameter -Wconversion -Wfloat-equal -Wshadow"
|
||||
<toolset>darwin:<cxxflags>"-pedantic -Wstrict-aliasing -fstrict-aliasing -Wextra -Wsign-promo -Wunused-parameter -Wconversion -Wfloat-equal -Wshadow"
|
||||
<toolset>clang:<cxxflags>"-pedantic -Wstrict-aliasing -fstrict-aliasing -Wextra -Wsign-promo -Wunused-parameter -Wsign-conversion -Wconversion -Wfloat-equal -Wshadow"
|
||||
#<toolset>msvc:<warnings-as-errors>on
|
||||
#<toolset>gcc:<warnings-as-errors>on
|
||||
#<toolset>darwin:<warnings-as-errors>on
|
||||
@@ -19,6 +20,7 @@ project hash-tests
|
||||
|
||||
test-suite functional/hash
|
||||
:
|
||||
[ compile check_float_funcs.cpp ]
|
||||
[ run hash_fwd_test_1.cpp ]
|
||||
[ run hash_fwd_test_2.cpp ]
|
||||
[ run hash_number_test.cpp ]
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
template <class T>
|
||||
void compile_time_tests(T*)
|
||||
{
|
||||
#if !defined(_HAS_AUTO_PTR_ETC) || _HAS_AUTO_PTR_ETC
|
||||
BOOST_STATIC_ASSERT((boost::is_base_and_derived<
|
||||
std::unary_function<T, std::size_t>, BOOST_HASH_TEST_NAMESPACE::hash<T> >::value));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
# Copyright 2012 Daniel James.
|
||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
import testing ;
|
||||
|
||||
build-project .. ;
|
||||
|
||||
test-suite functional/hash/config
|
||||
:
|
||||
[ compile check_float_funcs.cpp ]
|
||||
;
|
||||
@@ -84,8 +84,8 @@ void complex_integral_tests(Integer*)
|
||||
generic_complex_tests(complex(15342,124));
|
||||
generic_complex_tests(complex(25,54356));
|
||||
generic_complex_tests(complex(5325,2346));
|
||||
generic_complex_tests(complex(-243897,-49923874));
|
||||
generic_complex_tests(complex(-543,763));
|
||||
generic_complex_tests(complex(Integer(-243897),Integer(-49923874)));
|
||||
generic_complex_tests(complex(Integer(-543),Integer(763)));
|
||||
}
|
||||
|
||||
int main()
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace test
|
||||
|
||||
std::size_t hash() const
|
||||
{
|
||||
return value_ * 10;
|
||||
return static_cast<std::size_t>(value_ * 10);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace test
|
||||
|
||||
std::size_t hash() const
|
||||
{
|
||||
return value_ * 10;
|
||||
return static_cast<std::size_t>(value_ * 10);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
|
||||
@@ -17,7 +17,7 @@ struct custom
|
||||
|
||||
std::size_t hash() const
|
||||
{
|
||||
return value_ * 10;
|
||||
return static_cast<std::size_t>(value_ * 10);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
|
||||
@@ -58,8 +58,6 @@ void numeric_extra_tests(typename
|
||||
template <class T>
|
||||
void numeric_test(T*)
|
||||
{
|
||||
typedef boost::hash_detail::limits<T> limits;
|
||||
|
||||
compile_time_tests((T*) 0);
|
||||
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<T> x1;
|
||||
@@ -129,9 +127,13 @@ void poor_quality_tests(T*)
|
||||
BOOST_TEST(x1(T(1)) != x2(T(-1)));
|
||||
if(T(1) != T(2))
|
||||
BOOST_TEST(x1(T(1)) != x2(T(2)));
|
||||
if((limits::max)() != (limits::max)() - 1)
|
||||
BOOST_TEST(x1(static_cast<T>((limits::max)()))
|
||||
!= x2(static_cast<T>((limits::max)() - 1)));
|
||||
|
||||
// TODO: This test is useless for floating point numbers.
|
||||
T max_number = static_cast<T>((limits::max)());
|
||||
T max_minus_one = static_cast<T>(max_number - 1);
|
||||
if (max_number != max_minus_one) {
|
||||
BOOST_TEST(x1(max_number) != x1(max_minus_one));
|
||||
}
|
||||
}
|
||||
|
||||
void bool_test()
|
||||
@@ -162,6 +164,12 @@ int main()
|
||||
NUMERIC_TEST(unsigned char, uchar)
|
||||
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
|
||||
NUMERIC_TEST(wchar_t, wchar)
|
||||
#endif
|
||||
#ifndef BOOST_NO_CXX11_CHAR16_T
|
||||
NUMERIC_TEST(char16_t, char16)
|
||||
#endif
|
||||
#ifndef BOOST_NO_CXX11_CHAR32_T
|
||||
NUMERIC_TEST(char32_t, char32)
|
||||
#endif
|
||||
NUMERIC_TEST(short, short)
|
||||
NUMERIC_TEST(unsigned short, ushort)
|
||||
|
||||
@@ -19,6 +19,8 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
||||
template <class T>
|
||||
void integer_tests(T* = 0)
|
||||
{
|
||||
typedef typename T::value_type value_type;
|
||||
|
||||
const int number_of_containers = 11;
|
||||
T containers[number_of_containers];
|
||||
|
||||
@@ -27,16 +29,16 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
||||
containers[i].push_back(0);
|
||||
}
|
||||
|
||||
containers[5].push_back(1);
|
||||
containers[6].push_back(1);
|
||||
containers[6].push_back(1);
|
||||
containers[7].push_back(-1);
|
||||
containers[8].push_back(-1);
|
||||
containers[8].push_back(-1);
|
||||
containers[9].push_back(1);
|
||||
containers[9].push_back(-1);
|
||||
containers[10].push_back(-1);
|
||||
containers[10].push_back(1);
|
||||
containers[5].push_back(value_type(1));
|
||||
containers[6].push_back(value_type(1));
|
||||
containers[6].push_back(value_type(1));
|
||||
containers[7].push_back(value_type(-1));
|
||||
containers[8].push_back(value_type(-1));
|
||||
containers[8].push_back(value_type(-1));
|
||||
containers[9].push_back(value_type(1));
|
||||
containers[9].push_back(value_type(-1));
|
||||
containers[10].push_back(value_type(-1));
|
||||
containers[10].push_back(value_type(1));
|
||||
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<T> hasher;
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
||||
template <class T>
|
||||
void integer_tests(T* = 0)
|
||||
{
|
||||
typedef typename T::value_type value_type;
|
||||
|
||||
const int number_of_containers = 12;
|
||||
T containers[number_of_containers];
|
||||
|
||||
@@ -27,19 +29,19 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
||||
containers[i].insert(0);
|
||||
}
|
||||
|
||||
containers[6].insert(1);
|
||||
containers[7].insert(1);
|
||||
containers[7].insert(1);
|
||||
containers[8].insert(-1);
|
||||
containers[9].insert(-1);
|
||||
containers[9].insert(-1);
|
||||
containers[10].insert(-1);
|
||||
containers[10].insert(1);
|
||||
containers[11].insert(1);
|
||||
containers[11].insert(2);
|
||||
containers[11].insert(3);
|
||||
containers[11].insert(4);
|
||||
containers[11].insert(5);
|
||||
containers[6].insert(value_type(1));
|
||||
containers[7].insert(value_type(1));
|
||||
containers[7].insert(value_type(1));
|
||||
containers[8].insert(value_type(-1));
|
||||
containers[9].insert(value_type(-1));
|
||||
containers[9].insert(value_type(-1));
|
||||
containers[10].insert(value_type(-1));
|
||||
containers[10].insert(value_type(1));
|
||||
containers[11].insert(value_type(1));
|
||||
containers[11].insert(value_type(2));
|
||||
containers[11].insert(value_type(3));
|
||||
containers[11].insert(value_type(4));
|
||||
containers[11].insert(value_type(5));
|
||||
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<T> hasher;
|
||||
|
||||
|
||||
@@ -38,7 +38,24 @@ void string_tests()
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_STD_WSTRING)
|
||||
void string0_tests()
|
||||
{
|
||||
std::string x1(1, '\0');
|
||||
std::string x2(2, '\0');
|
||||
std::string x3(3, '\0');
|
||||
std::string x4(10, '\0');
|
||||
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<std::string> hasher;
|
||||
|
||||
BOOST_TEST(hasher(x1) != hasher(x2));
|
||||
BOOST_TEST(hasher(x1) != hasher(x3));
|
||||
BOOST_TEST(hasher(x1) != hasher(x4));
|
||||
BOOST_TEST(hasher(x2) != hasher(x3));
|
||||
BOOST_TEST(hasher(x2) != hasher(x4));
|
||||
BOOST_TEST(hasher(x3) != hasher(x4));
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
||||
void wstring_tests()
|
||||
{
|
||||
compile_time_tests((std::wstring*) 0);
|
||||
@@ -63,11 +80,68 @@ void wstring_tests()
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||
void u16string_tests()
|
||||
{
|
||||
compile_time_tests((std::u16string*) 0);
|
||||
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<std::u16string> x1;
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<std::u16string> x2;
|
||||
|
||||
BOOST_TEST(x1(u"Hello") == x2(std::u16string(u"Hel") + u"lo"));
|
||||
BOOST_TEST(x1(u"") == x2(std::u16string()));
|
||||
|
||||
#if defined(BOOST_HASH_TEST_EXTENSIONS)
|
||||
std::u16string value1;
|
||||
std::u16string value2(u"Hello");
|
||||
|
||||
BOOST_TEST(x1(value1) == BOOST_HASH_TEST_NAMESPACE::hash_value(value1));
|
||||
BOOST_TEST(x1(value2) == BOOST_HASH_TEST_NAMESPACE::hash_value(value2));
|
||||
BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value1) ==
|
||||
BOOST_HASH_TEST_NAMESPACE::hash_range(value1.begin(), value1.end()));
|
||||
BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value2) ==
|
||||
BOOST_HASH_TEST_NAMESPACE::hash_range(value2.begin(), value2.end()));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||
void u32string_tests()
|
||||
{
|
||||
compile_time_tests((std::u32string*) 0);
|
||||
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<std::u32string> x1;
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<std::u32string> x2;
|
||||
|
||||
BOOST_TEST(x1(U"Hello") == x2(std::u32string(U"Hel") + U"lo"));
|
||||
BOOST_TEST(x1(U"") == x2(std::u32string()));
|
||||
|
||||
#if defined(BOOST_HASH_TEST_EXTENSIONS)
|
||||
std::u32string value1;
|
||||
std::u32string value2(U"Hello");
|
||||
|
||||
BOOST_TEST(x1(value1) == BOOST_HASH_TEST_NAMESPACE::hash_value(value1));
|
||||
BOOST_TEST(x1(value2) == BOOST_HASH_TEST_NAMESPACE::hash_value(value2));
|
||||
BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value1) ==
|
||||
BOOST_HASH_TEST_NAMESPACE::hash_range(value1.begin(), value1.end()));
|
||||
BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value2) ==
|
||||
BOOST_HASH_TEST_NAMESPACE::hash_range(value2.begin(), value2.end()));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
string_tests();
|
||||
#if !defined(BOOST_NO_STD_WSTRING)
|
||||
string0_tests();
|
||||
#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
||||
wstring_tests();
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||
u16string_tests();
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||
u32string_tests();
|
||||
#endif
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ int f(std::size_t hash1, int* x1) {
|
||||
|
||||
// Check that std::vector<std::size_t> is avaiable in this file.
|
||||
std::vector<std::size_t> x;
|
||||
x.push_back(*x1);
|
||||
x.push_back(static_cast<std::size_t>(*x1));
|
||||
BOOST_HASH_TEST_NAMESPACE::hash<std::vector<std::size_t> > vector_hasher;
|
||||
return vector_hasher(x) != BOOST_HASH_TEST_NAMESPACE::hash_value(x);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user