mirror of
https://github.com/boostorg/functional.git
synced 2025-08-03 06:24:34 +02:00
Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41370]
This commit is contained in:
@@ -12,9 +12,6 @@
|
|||||||
// $Id$
|
// $Id$
|
||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
// $Log$
|
// $Log$
|
||||||
// Revision 1.2.24.1 2006/12/02 14:17:26 andreas_huber69
|
|
||||||
// Merged L & C issue fixes from trunk to branch.
|
|
||||||
//
|
|
||||||
// Revision 1.3 2006/12/02 13:57:32 andreas_huber69
|
// Revision 1.3 2006/12/02 13:57:32 andreas_huber69
|
||||||
// Fixed license & copyright issues.
|
// Fixed license & copyright issues.
|
||||||
//
|
//
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
# Copyright Daniel James 2005. Use, modification, and distribution are
|
# Copyright 2005 Daniel James.
|
||||||
# subject to the Boost Software License, Version 1.0. (See accompanying
|
# 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)
|
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
using quickbook ;
|
using quickbook ;
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
[/ Copyright 2005-2006 Daniel James.
|
[/ Copyright 2005-2007 Daniel James.
|
||||||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
/ 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) ]
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
[/ Copyright 2005-2006 Daniel James.
|
[/ Copyright 2005-2007 Daniel James.
|
||||||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
/ 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) ]
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
[library Boost.Functional/Hash
|
[library Boost.Functional/Hash
|
||||||
[quickbook 1.3]
|
[quickbook 1.4]
|
||||||
[authors [James, Daniel]]
|
[authors [James, Daniel]]
|
||||||
[copyright 2005 2006 Daniel James]
|
[copyright 2005 2006 2007 Daniel James]
|
||||||
[purpose A TR1 hash function object that can be extended to hash user
|
[purpose A TR1 hash function object that can be extended to hash user
|
||||||
defined types]
|
defined types]
|
||||||
[category higher-order]
|
[category higher-order]
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
[license
|
[license
|
||||||
Distributed under the Boost Software License, Version 1.0.
|
Distributed under the Boost Software License, Version 1.0.
|
||||||
(See accompanying file LICENSE_1_0.txt or copy at
|
(See accompanying file LICENSE_1_0.txt or copy at
|
||||||
[@http://www.boost.org/LICENSE_1_0.txt]
|
[@http://www.boost.org/LICENSE_1_0.txt])
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
[/ Copyright 2005-2006 Daniel James.
|
[/ Copyright 2005-2007 Daniel James.
|
||||||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
/ 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) ]
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
||||||
|
|
||||||
|
@@ -1,26 +1,26 @@
|
|||||||
|
|
||||||
[/ Copyright 2005-2006 Daniel James.
|
[/ Copyright 2005-2007 Daniel James.
|
||||||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
/ 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) ]
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
||||||
|
|
||||||
[section:links Links]
|
[section:links Links]
|
||||||
|
|
||||||
[*A Proposal to Add Hash Tables to the Standard Library]\n
|
[*A Proposal to Add Hash Tables to the Standard Library]
|
||||||
[@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1456.html]\n
|
[@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1456.html]
|
||||||
The hash table proposal explains much of the design. The hash function object
|
The hash table proposal explains much of the design. The hash function object
|
||||||
is discussed in Section D.
|
is discussed in Section D.
|
||||||
|
|
||||||
[*The C++ Standard Library Technical Report.]\n
|
[*The C++ Standard Library Technical Report.]
|
||||||
[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf]\n
|
[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf]
|
||||||
Contains the hash function specification in section 6.3.2.
|
Contains the hash function specification in section 6.3.2.
|
||||||
|
|
||||||
[*Library Extension Technical Report Issues List.]\n
|
[*Library Extension Technical Report Issues List.]
|
||||||
[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1837.pdf]\n
|
[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1837.pdf]
|
||||||
The library implements the extension described in Issue 6.18, pages 63-67.
|
The library implements the extension described in Issue 6.18, pages 63-67.
|
||||||
|
|
||||||
[*Methods for Identifying Versioned and Plagiarised Documents]\n
|
[*Methods for Identifying Versioned and Plagiarised Documents]
|
||||||
Timothy C. Hoad, Justin Zobel\n
|
Timothy C. Hoad, Justin Zobel
|
||||||
[@http://www.cs.rmit.edu.au/~jz/fulltext/jasist-tch.pdf]\n
|
[@http://www.cs.rmit.edu.au/~jz/fulltext/jasist-tch.pdf]
|
||||||
Contains the hash function that [funcref boost::hash_combine] is based on.
|
Contains the hash function that [funcref boost::hash_combine] is based on.
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
[/ Copyright 2005-2006 Daniel James.
|
[/ Copyright 2005-2007 Daniel James.
|
||||||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
/ 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) ]
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
__boost_hash__ is written to be as portable as possible, but unfortunately, several
|
__boost_hash__ is written to be as portable as possible, but unfortunately, several
|
||||||
older compilers don't support argument dependent lookup (ADL) - the mechanism
|
older compilers don't support argument dependent lookup (ADL) - the mechanism
|
||||||
used for customisation. On those compilers custom overloads for `hash_value`
|
used for customisation. On those compilers custom overloads for `hash_value`
|
||||||
need to be declared in the boost namespace.
|
needs to be declared in the boost namespace.
|
||||||
|
|
||||||
On a strictly standards compliant compiler, an overload defined in the
|
On a strictly standards compliant compiler, an overload defined in the
|
||||||
boost namespace won't be found when __boost_hash__ is instantiated,
|
boost namespace won't be found when __boost_hash__ is instantiated,
|
||||||
|
108
hash/doc/ref.xml
108
hash/doc/ref.xml
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Copyright 2005-2006 Daniel James.
|
Copyright Daniel James 2005-2007
|
||||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
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)
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
-->
|
-->
|
||||||
@@ -260,6 +261,42 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|||||||
</method>
|
</method>
|
||||||
</struct-specialization>
|
</struct-specialization>
|
||||||
|
|
||||||
|
<struct-specialization name="hash">
|
||||||
|
<template></template>
|
||||||
|
<specialization>
|
||||||
|
<template-arg>long long</template-arg>
|
||||||
|
</specialization>
|
||||||
|
<method name="operator()" cv="const">
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val">
|
||||||
|
<paramtype>long long</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>unsigned long long</template-arg>
|
||||||
|
</specialization>
|
||||||
|
<method name="operator()" cv="const">
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val">
|
||||||
|
<paramtype>unsigned long long</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">
|
<struct-specialization name="hash">
|
||||||
<template></template>
|
<template></template>
|
||||||
<specialization>
|
<specialization>
|
||||||
@@ -472,6 +509,41 @@ for(; first != last; ++first)
|
|||||||
Implementation of the hash function.
|
Implementation of the hash function.
|
||||||
</purpose>
|
</purpose>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>bool</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>char</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>signed char</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>unsigned char</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>wchar_t</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>short</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>unsigned short</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
<signature>
|
<signature>
|
||||||
<type>std::size_t</type>
|
<type>std::size_t</type>
|
||||||
<parameter name="val"><paramtype>int</paramtype></parameter>
|
<parameter name="val"><paramtype>int</paramtype></parameter>
|
||||||
@@ -492,6 +564,16 @@ for(; first != last; ++first)
|
|||||||
<parameter name="val"><paramtype>unsigned long</paramtype></parameter>
|
<parameter name="val"><paramtype>unsigned long</paramtype></parameter>
|
||||||
</signature>
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>long long</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>unsigned long long</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
<signature>
|
<signature>
|
||||||
<type>std::size_t</type>
|
<type>std::size_t</type>
|
||||||
<parameter name="val"><paramtype>float</paramtype></parameter>
|
<parameter name="val"><paramtype>float</paramtype></parameter>
|
||||||
@@ -620,6 +702,14 @@ for(; first != last; ++first)
|
|||||||
<parameter name="val"><paramtype>std::multimap<K, T, C, A> const&</paramtype></parameter>
|
<parameter name="val"><paramtype>std::multimap<K, T, C, A> const&</paramtype></parameter>
|
||||||
</signature>
|
</signature>
|
||||||
|
|
||||||
|
<signature>
|
||||||
|
<template>
|
||||||
|
<template-type-parameter name="T"/>
|
||||||
|
</template>
|
||||||
|
<type>std::size_t</type>
|
||||||
|
<parameter name="val"><paramtype>std::complex<T> const&</paramtype></parameter>
|
||||||
|
</signature>
|
||||||
|
|
||||||
<description><para>
|
<description><para>
|
||||||
Generally shouldn't be called directly by users, instead they should use
|
Generally shouldn't be called directly by users, instead they should use
|
||||||
<classname>boost::hash</classname>, <functionname>boost::hash_range</functionname>
|
<classname>boost::hash</classname>, <functionname>boost::hash_range</functionname>
|
||||||
@@ -650,9 +740,17 @@ for(; first != last; ++first)
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<row>
|
<row>
|
||||||
<entry><code>int</code>, <code>unsigned int</code>, <code>long</code>, <code>unsigned long</code></entry>
|
<entry><code>bool</code>,
|
||||||
|
<code>char</code>, <code>signed char</code>, <code>unsigned char</code>, <code>wchar_t</code>,
|
||||||
|
<code>short</code>, <code>unsigned short</code>,
|
||||||
|
<code>int</code>, <code>unsigned int</code>, <code>long</code>, <code>unsigned long</code>
|
||||||
|
</entry>
|
||||||
<entry><code>val</code></entry>
|
<entry><code>val</code></entry>
|
||||||
</row>
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><code>long long</code>, <code>unsigned long long</code></entry>
|
||||||
|
<entry><code>val</code> when <code>abs(val) <= std::numeric_limits<std::size_t>::max()</code>.</entry>
|
||||||
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry><code>float</code>, <code>double</code>, <code>long double</code></entry>
|
<entry><code>float</code>, <code>double</code>, <code>long double</code></entry>
|
||||||
<entry>An unspecified value, except that equal arguments shall yield the same result.</entry>
|
<entry>An unspecified value, except that equal arguments shall yield the same result.</entry>
|
||||||
@@ -688,6 +786,12 @@ for(; first != last; ++first)
|
|||||||
<functionname>hash_combine</functionname>(seed, val.second);
|
<functionname>hash_combine</functionname>(seed, val.second);
|
||||||
return seed;</programlisting></entry>
|
return seed;</programlisting></entry>
|
||||||
</row>
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>
|
||||||
|
<code>std::complex<T></code>
|
||||||
|
</entry>
|
||||||
|
<entry>When <code>T</code> is a built in type and <code>val.imag() == 0</code>, the result is equal to <code>hash_value(val.real())</code>. Otherwise an unspecified value, except that equal arguments shall yield the same result.</entry>
|
||||||
|
</row>
|
||||||
</tbody>
|
</tbody>
|
||||||
</tgroup>
|
</tgroup>
|
||||||
</informaltable>
|
</informaltable>
|
||||||
|
@@ -1,20 +1,19 @@
|
|||||||
|
|
||||||
[/ Copyright 2005-2006 Daniel James.
|
[/ Copyright 2005-2007 Daniel James.
|
||||||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
/ 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) ]
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
||||||
|
|
||||||
[section:acknowledgements Acknowledgements]
|
[section:acknowledgements Acknowledgements]
|
||||||
|
|
||||||
This library is based on the design by Peter Dimov's original design.
|
This library is based on the design by Peter Dimov. During the initial
|
||||||
|
development
|
||||||
During the initial development Joaquín M López Muñoz made many useful
|
Joaquín M López Muñoz made many useful suggestions and contributed fixes.
|
||||||
suggestions, contributed fixes.
|
|
||||||
|
|
||||||
The formal review was managed by Thorsten Ottosen, and the library reviewed by:
|
The formal review was managed by Thorsten Ottosen, and the library reviewed by:
|
||||||
David Abrahams, Alberto Barbati, Topher Cooper, Caleb Epstein, Dave Harris,
|
David Abrahams, Alberto Barbati, Topher Cooper, Caleb Epstein, Dave Harris,
|
||||||
Chris Jefferson, Bronek Kozicki, John Maddock, Tobias Swinger, Jaap Suter, Rob
|
Chris Jefferson, Bronek Kozicki, John Maddock, Tobias Swinger, Jaap Suter,
|
||||||
Stewart and Pavel Vozenilek. Since then, there have been further contributions
|
Rob Stewart and Pavel Vozenilek. Since then, further constructive criticism has
|
||||||
from Daniel Krügler, Alexander Nasonov, 沈慧峰 and John Maddock.
|
been made by Daniel Krügler, Alexander Nasonov and 沈慧峰.
|
||||||
|
|
||||||
The implementation of the hash function for pointers is based on suggestions
|
The implementation of the hash function for pointers is based on suggestions
|
||||||
made by Alberto Barbati and Dave Harris. Dave Harris also suggested an
|
made by Alberto Barbati and Dave Harris. Dave Harris also suggested an
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
[/ Copyright 2005-2006 Daniel James.
|
[/ Copyright 2005-2007 Daniel James.
|
||||||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
/ 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) ]
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ When writing a hash function, first look at how the equality function works.
|
|||||||
Objects that are equal must generate the same hash value.
|
Objects that are equal must generate the same hash value.
|
||||||
When objects are not equal they should generate different hash values.
|
When objects are not equal they should generate different hash values.
|
||||||
In this object equality was based just on the id so the hash function
|
In this object equality was based just on the id so the hash function
|
||||||
only hash the id. If it was based on the objects name and author
|
only hashes the id. If it was based on the object's name and author
|
||||||
then the hash function should take them into account
|
then the hash function should take them into account
|
||||||
(how to do this is discussed in the next section).
|
(how to do this is discussed in the next section).
|
||||||
]
|
]
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./books.hpp"
|
#include "./books.hpp"
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
// This example illustrates how to use boost::hash with a custom hash function.
|
// This example illustrates how to use boost::hash with a custom hash function.
|
||||||
// The implementation is contained in books.cpp
|
// The implementation is contained in books.cpp
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005. Use, modification, and distribution are
|
// Copyright 2005 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Copyright 2005-2006 Daniel James.
|
Copyright 2005-2007 Daniel James.
|
||||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
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)
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
-->
|
-->
|
||||||
|
@@ -1,13 +1,15 @@
|
|||||||
|
|
||||||
# Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
# Copyright 2005-2007 Daniel James.
|
||||||
# subject to the Boost Software License, Version 1.0. (See accompanying
|
# 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)
|
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
import testing ;
|
import testing ;
|
||||||
|
|
||||||
project hash-tests
|
project hash-tests
|
||||||
: requirements
|
: requirements
|
||||||
<toolset>gcc:<define>_GLIBCXX_DEBUG
|
<toolset>gcc:<define>_GLIBCXX_DEBUG
|
||||||
|
<toolset>gcc:<cxxflags>-Wsign-promo
|
||||||
|
#<toolset>gcc:<cxxflags>-Wextra
|
||||||
;
|
;
|
||||||
|
|
||||||
test-suite functional/hash
|
test-suite functional/hash
|
||||||
@@ -18,6 +20,7 @@ test-suite functional/hash
|
|||||||
[ run hash_pointer_test.cpp ]
|
[ run hash_pointer_test.cpp ]
|
||||||
[ run hash_function_pointer_test.cpp ]
|
[ run hash_function_pointer_test.cpp ]
|
||||||
[ run hash_float_test.cpp : : : <test-info>always_show_run_output ]
|
[ run hash_float_test.cpp : : : <test-info>always_show_run_output ]
|
||||||
|
[ run hash_long_double_test.cpp : : : <test-info>always_show_run_output ]
|
||||||
[ run hash_string_test.cpp ]
|
[ run hash_string_test.cpp ]
|
||||||
[ run hash_range_test.cpp ]
|
[ run hash_range_test.cpp ]
|
||||||
[ run hash_custom_test.cpp ]
|
[ run hash_custom_test.cpp ]
|
||||||
@@ -30,12 +33,14 @@ test-suite functional/hash
|
|||||||
[ run hash_deque_test.cpp ]
|
[ run hash_deque_test.cpp ]
|
||||||
[ run hash_set_test.cpp ]
|
[ run hash_set_test.cpp ]
|
||||||
[ run hash_map_test.cpp ]
|
[ run hash_map_test.cpp ]
|
||||||
|
[ run hash_complex_test.cpp ]
|
||||||
[ run link_test.cpp link_test_2.cpp ]
|
[ run link_test.cpp link_test_2.cpp ]
|
||||||
[ run link_ext_test.cpp link_no_ext_test.cpp ]
|
[ run link_ext_test.cpp link_no_ext_test.cpp ]
|
||||||
[ run container_fwd_test.cpp ]
|
[ run container_fwd_test.cpp ]
|
||||||
[ compile-fail hash_no_ext_fail_test.cpp ]
|
[ compile-fail hash_no_ext_fail_test.cpp ]
|
||||||
[ run hash_no_ext_macro_1.cpp ]
|
[ run hash_no_ext_macro_1.cpp ]
|
||||||
[ run hash_no_ext_macro_2.cpp ]
|
[ run hash_no_ext_macro_2.cpp ]
|
||||||
|
[ run hash_deprecated_headers.cpp : : : <test-info>always_show_run_output ]
|
||||||
;
|
;
|
||||||
|
|
||||||
build-project ../examples ;
|
build-project ../examples ;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <boost/static_assert.hpp>
|
#include <boost/static_assert.hpp>
|
||||||
@@ -12,5 +12,5 @@ void compile_time_tests(T*)
|
|||||||
{
|
{
|
||||||
BOOST_STATIC_ASSERT((boost::is_base_and_derived<
|
BOOST_STATIC_ASSERT((boost::is_base_and_derived<
|
||||||
std::unary_function<T, std::size_t>, HASH_NAMESPACE::hash<T> >::value));
|
std::unary_function<T, std::size_t>, HASH_NAMESPACE::hash<T> >::value));
|
||||||
};
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#if defined(TEST_STD)
|
#if defined(TEST_STD)
|
||||||
# define TEST_STD_INCLUDES
|
# define TEST_STD_INCLUDES
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/functional/detail/container_fwd.hpp>
|
#include <boost/functional/detail/container_fwd.hpp>
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
108
hash/test/hash_complex_test.cpp
Normal file
108
hash/test/hash_complex_test.cpp
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
|
||||||
|
// Copyright 2005-2007 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)
|
||||||
|
|
||||||
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
#ifdef TEST_EXTENSIONS
|
||||||
|
# ifdef TEST_STD_INCLUDES
|
||||||
|
# include <functional>
|
||||||
|
# else
|
||||||
|
# include <boost/functional/hash.hpp>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
#ifdef TEST_EXTENSIONS
|
||||||
|
|
||||||
|
#include <complex>
|
||||||
|
#include <sstream>
|
||||||
|
#include <boost/limits.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4244) // conversion from 'unsigned long' to 'unsigned short', possible loss of data
|
||||||
|
#pragma warning(disable:4512) // assignment operator could not be generated
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/random/mersenne_twister.hpp>
|
||||||
|
#include <boost/random/uniform_int.hpp>
|
||||||
|
#include <boost/random/uniform_real.hpp>
|
||||||
|
#include <boost/random/variate_generator.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void generic_complex_tests(std::complex<T> v)
|
||||||
|
{
|
||||||
|
HASH_NAMESPACE::hash<std::complex<T> > complex_hasher;
|
||||||
|
|
||||||
|
BOOST_TEST(complex_hasher(v) == complex_hasher(v));
|
||||||
|
|
||||||
|
HASH_NAMESPACE::hash<T> real_hasher;
|
||||||
|
T real = v.real();
|
||||||
|
T imag = v.imag();
|
||||||
|
|
||||||
|
BOOST_TEST(real_hasher(real) == complex_hasher(std::complex<T>(real)));
|
||||||
|
|
||||||
|
if(imag != 0 && real_hasher(real) == complex_hasher(v)) {
|
||||||
|
std::ostringstream os;
|
||||||
|
os<<"real_hasher("<<real<<") == complex_hasher("
|
||||||
|
<<v.real()<<" + "<<v.imag()<<"i) == "
|
||||||
|
<<real_hasher(real)<<" (This might not be a bug).";
|
||||||
|
BOOST_ERROR(os.str().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Float>
|
||||||
|
void complex_float_tests(Float*)
|
||||||
|
{
|
||||||
|
boost::mt19937 rng;
|
||||||
|
boost::uniform_real<Float> uniform;
|
||||||
|
boost::variate_generator<boost::mt19937&, boost::uniform_real<Float> >
|
||||||
|
uniform_generator(rng, uniform);
|
||||||
|
|
||||||
|
for(int i = 0; i < 100; ++i)
|
||||||
|
{
|
||||||
|
std::complex<Float> v(uniform_generator(), uniform_generator());
|
||||||
|
generic_complex_tests(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Integer>
|
||||||
|
void complex_integral_tests(Integer*)
|
||||||
|
{
|
||||||
|
boost::mt19937 rng;
|
||||||
|
boost::uniform_int<Integer> uniform(
|
||||||
|
(std::numeric_limits<Integer>::min)(),
|
||||||
|
(std::numeric_limits<Integer>::max)());
|
||||||
|
boost::variate_generator<boost::mt19937&, boost::uniform_int<Integer> >
|
||||||
|
uniform_generator(rng, uniform);
|
||||||
|
|
||||||
|
for(int i = 0; i < 100; ++i)
|
||||||
|
{
|
||||||
|
std::complex<Integer>v(uniform_generator(), uniform_generator());
|
||||||
|
generic_complex_tests(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
complex_float_tests((float*) 0);
|
||||||
|
complex_float_tests((double*) 0);
|
||||||
|
complex_float_tests((long double*) 0);
|
||||||
|
complex_integral_tests((short*) 0);
|
||||||
|
complex_integral_tests((int*) 0);
|
||||||
|
complex_integral_tests((long*) 0);
|
||||||
|
complex_integral_tests((unsigned short*) 0);
|
||||||
|
complex_integral_tests((unsigned int*) 0);
|
||||||
|
complex_integral_tests((unsigned long*) 0);
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
26
hash/test/hash_deprecated_headers.cpp
Normal file
26
hash/test/hash_deprecated_headers.cpp
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
// Copyright 2007 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)
|
||||||
|
|
||||||
|
// All these headers are meant output a warning, but not cause the compilation
|
||||||
|
// to fail.
|
||||||
|
|
||||||
|
#include <boost/functional/hash/deque.hpp>
|
||||||
|
#include <boost/functional/hash/list.hpp>
|
||||||
|
#include <boost/functional/hash/map.hpp>
|
||||||
|
#include <boost/functional/hash/pair.hpp>
|
||||||
|
#include <boost/functional/hash/set.hpp>
|
||||||
|
#include <boost/functional/hash/vector.hpp>
|
||||||
|
|
||||||
|
// And a quick check that the hash library was included.
|
||||||
|
// Strictly speaking I should do this once for each header
|
||||||
|
// but that would just be wasting the testing resources.
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::vector<int> v;
|
||||||
|
boost::hash<std::vector<int> > x;
|
||||||
|
x(v);
|
||||||
|
}
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,228 +1,18 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "hash_float_test.hpp"
|
||||||
|
|
||||||
#ifdef TEST_STD_INCLUDES
|
int main()
|
||||||
# include <functional>
|
|
||||||
#else
|
|
||||||
# include <boost/functional/hash.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/detail/lightweight_test.hpp>
|
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <boost/limits.hpp>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
void float_tests(char const* name, T* = 0)
|
|
||||||
{
|
|
||||||
std::cerr<<"\n"
|
|
||||||
<<"Testing " BOOST_STRINGIZE(HASH_NAMESPACE) "::hash<"<<name<<">\n"
|
|
||||||
<<"\n"
|
|
||||||
<<"std::numeric_limits<T>::digits = "
|
|
||||||
<<std::numeric_limits<T>::digits<<"\n"
|
|
||||||
<<"std::numeric_limits<int>::digits = "
|
|
||||||
<<std::numeric_limits<int>::digits<<"\n"
|
|
||||||
<<"std::numeric_limits<std::size_t>::digits = "
|
|
||||||
<<std::numeric_limits<std::size_t>::digits<<"\n"
|
|
||||||
<<"\n"
|
|
||||||
;
|
|
||||||
|
|
||||||
HASH_NAMESPACE::hash<T> x1;
|
|
||||||
|
|
||||||
T zero = 0;
|
|
||||||
T minus_zero = (T) -1 * zero;
|
|
||||||
|
|
||||||
BOOST_TEST(zero == minus_zero);
|
|
||||||
BOOST_TEST(x1(zero) == x1(minus_zero));
|
|
||||||
|
|
||||||
BOOST_TEST(x1(zero) == HASH_NAMESPACE::hash_value(zero));
|
|
||||||
BOOST_TEST(x1(minus_zero) == HASH_NAMESPACE::hash_value(minus_zero));
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
// Doing anything with infinity causes borland to crash.
|
|
||||||
#if defined(__BORLANDC__)
|
|
||||||
std::cerr<<"Not running infinity checks on Borland, as it causes it to crash.\n";
|
|
||||||
#else
|
|
||||||
if(std::numeric_limits<T>::has_infinity) {
|
|
||||||
T infinity = -log(zero);
|
|
||||||
T infinity2 = (T) 1. / zero;
|
|
||||||
T infinity3 = (T) -1. / minus_zero;
|
|
||||||
T infinity4 = std::numeric_limits<T>::infinity();
|
|
||||||
|
|
||||||
T minus_infinity = log(zero);
|
|
||||||
T minus_infinity2 = (T) -1. / zero;
|
|
||||||
T minus_infinity3 = (T) 1. / minus_zero;
|
|
||||||
|
|
||||||
BOOST_TEST(x1(infinity) == HASH_NAMESPACE::hash_value(infinity));
|
|
||||||
BOOST_TEST(x1(minus_infinity)
|
|
||||||
== HASH_NAMESPACE::hash_value(minus_infinity));
|
|
||||||
|
|
||||||
if(infinity == infinity2)
|
|
||||||
BOOST_TEST(x1(infinity) == x1(infinity2));
|
|
||||||
if(infinity == infinity3);
|
|
||||||
BOOST_TEST(x1(infinity) == x1(infinity3));
|
|
||||||
if(infinity == infinity4)
|
|
||||||
BOOST_TEST(x1(infinity) == x1(infinity4));
|
|
||||||
|
|
||||||
if(minus_infinity == minus_infinity2)
|
|
||||||
BOOST_TEST(x1(minus_infinity) == x1(minus_infinity2));
|
|
||||||
if(minus_infinity == minus_infinity3)
|
|
||||||
BOOST_TEST(x1(minus_infinity) == x1(minus_infinity3));
|
|
||||||
|
|
||||||
BOOST_TEST(infinity != minus_infinity);
|
|
||||||
|
|
||||||
if(x1(infinity) == x1(minus_infinity)) {
|
|
||||||
std::cerr<<"x1(infinity) == x1(-infinity) == "<<x1(infinity)<<"\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
// This should really be 'has_denorm == denorm_present' but some
|
|
||||||
// compilers don't have 'denorm_present'. See also a later use.
|
|
||||||
if(std::numeric_limits<T>::has_denorm) {
|
|
||||||
if(x1(std::numeric_limits<T>::denorm_min()) == x1(infinity)) {
|
|
||||||
std::cerr<<"x1(denorm_min) == x1(infinity) == "<<x1(infinity)<<"\n";
|
|
||||||
}
|
|
||||||
if(x1(std::numeric_limits<T>::denorm_min()) == x1(minus_infinity)) {
|
|
||||||
std::cerr<<"x1(denorm_min) == x1(-infinity) == "<<x1(minus_infinity)<<"\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(std::numeric_limits<T>::has_quiet_NaN) {
|
|
||||||
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(infinity)) {
|
|
||||||
std::cerr<<"x1(quiet_NaN) == x1(infinity) == "<<x1(infinity)<<"\n";
|
|
||||||
}
|
|
||||||
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(minus_infinity)) {
|
|
||||||
std::cerr<<"x1(quiet_NaN) == x1(-infinity) == "<<x1(minus_infinity)<<"\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
T max = (std::numeric_limits<T>::max)();
|
|
||||||
T half_max = max / 2;
|
|
||||||
T quarter_max = max / 4;
|
|
||||||
T three_quarter_max = max - quarter_max;
|
|
||||||
|
|
||||||
BOOST_TEST(x1(max) == HASH_NAMESPACE::hash_value(max));
|
|
||||||
BOOST_TEST(x1(half_max) == HASH_NAMESPACE::hash_value(half_max));
|
|
||||||
BOOST_TEST(x1(quarter_max) == HASH_NAMESPACE::hash_value(quarter_max));
|
|
||||||
BOOST_TEST(x1(three_quarter_max) == HASH_NAMESPACE::hash_value(three_quarter_max));
|
|
||||||
|
|
||||||
// The '!=' tests could legitimately fail, but with my hash it indicates a bug.
|
|
||||||
BOOST_TEST(x1(max) == x1(max));
|
|
||||||
BOOST_TEST(x1(max) != x1(quarter_max));
|
|
||||||
BOOST_TEST(x1(max) != x1(half_max));
|
|
||||||
BOOST_TEST(x1(max) != x1(three_quarter_max));
|
|
||||||
BOOST_TEST(x1(quarter_max) == x1(quarter_max));
|
|
||||||
BOOST_TEST(x1(quarter_max) != x1(half_max));
|
|
||||||
BOOST_TEST(x1(quarter_max) != x1(three_quarter_max));
|
|
||||||
BOOST_TEST(x1(half_max) == x1(half_max));
|
|
||||||
BOOST_TEST(x1(half_max) != x1(three_quarter_max));
|
|
||||||
BOOST_TEST(x1(three_quarter_max) == x1(three_quarter_max));
|
|
||||||
|
|
||||||
// Intel with gcc stdlib sometimes segfaults on calls to asin and acos.
|
|
||||||
#if !((defined(__INTEL_COMPILER) || defined(__ICL) || \
|
|
||||||
defined(__ICC) || defined(__ECC)) && \
|
|
||||||
(defined(__GLIBCPP__) || defined(__GLIBCXX__)))
|
|
||||||
T v1 = asin((T) 1);
|
|
||||||
T v2 = acos((T) 0);
|
|
||||||
if(v1 == v2)
|
|
||||||
BOOST_TEST(x1(v1) == x1(v2));
|
|
||||||
BOOST_TEST(x1(v1) == HASH_NAMESPACE::hash_value(v1));
|
|
||||||
BOOST_TEST(x1(v2) == HASH_NAMESPACE::hash_value(v2));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
BOOST_TEST(x1(std::numeric_limits<T>::epsilon()) ==
|
|
||||||
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::epsilon()));
|
|
||||||
|
|
||||||
BOOST_TEST(std::numeric_limits<T>::epsilon() != (T) 0);
|
|
||||||
if(x1(std::numeric_limits<T>::epsilon()) == x1((T) 0))
|
|
||||||
std::cerr<<"x1(epsilon) == x1(0) == "<<x1((T) 0)<<"\n";
|
|
||||||
|
|
||||||
BOOST_TEST(-std::numeric_limits<T>::epsilon() != (T) 0);
|
|
||||||
if(x1(-std::numeric_limits<T>::epsilon()) == x1((T) 0))
|
|
||||||
std::cerr<<"x1(-epsilon) == x1(0) == "<<x1((T) 0)<<"\n";
|
|
||||||
|
|
||||||
BOOST_TEST((T) 1 + std::numeric_limits<T>::epsilon() != (T) 1);
|
|
||||||
if(x1((T) 1 + std::numeric_limits<T>::epsilon()) == x1((T) 1))
|
|
||||||
std::cerr<<"x1(1 + epsilon) == x1(1) == "<<x1((T) 1)<<"\n";
|
|
||||||
|
|
||||||
BOOST_TEST((T) 1 - std::numeric_limits<T>::epsilon() != (T) 1);
|
|
||||||
if(x1((T) 1 - std::numeric_limits<T>::epsilon()) == x1((T) 1))
|
|
||||||
std::cerr<<"x1(1 - epsilon) == x1(1) == "<<x1((T) 1)<<"\n";
|
|
||||||
|
|
||||||
BOOST_TEST((T) -1 + std::numeric_limits<T>::epsilon() != (T) -1);
|
|
||||||
if(x1((T) -1 + std::numeric_limits<T>::epsilon()) == x1((T) -1))
|
|
||||||
std::cerr<<"x1(-1 + epsilon) == x1(-1) == "<<x1((T) -1)<<"\n";
|
|
||||||
|
|
||||||
BOOST_TEST((T) -1 - std::numeric_limits<T>::epsilon() != (T) -1);
|
|
||||||
if(x1((T) -1 - std::numeric_limits<T>::epsilon()) == x1((T) -1))
|
|
||||||
std::cerr<<"x1(-1 - epsilon) == x1(-1) == "<<x1((T) -1)<<"\n";
|
|
||||||
|
|
||||||
// As before.
|
|
||||||
if(std::numeric_limits<T>::has_denorm) {
|
|
||||||
if(x1(std::numeric_limits<T>::denorm_min()) == x1(zero)) {
|
|
||||||
std::cerr<<"x1(denorm_min) == x1(zero) == "<<x1(zero)<<"\n";
|
|
||||||
}
|
|
||||||
#if !BOOST_WORKAROUND(__DECCXX_VER,<70190006)
|
|
||||||
// The Tru64/CXX standard library prior to 7.1 contains a bug in the
|
|
||||||
// specialization of std::numeric_limits::denorm_min() for long
|
|
||||||
// doubles which causes this test to fail.
|
|
||||||
if(x1(std::numeric_limits<T>::denorm_min()) !=
|
|
||||||
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::denorm_min()))
|
|
||||||
{
|
|
||||||
std::cerr<<"x1(std::numeric_limits<T>::denorm_min()) = "
|
|
||||||
<< x1(std::numeric_limits<T>::denorm_min())
|
|
||||||
<< "\nhash_value(std::numeric_limits<T>::denorm_min()) = "
|
|
||||||
<< HASH_NAMESPACE::hash_value(
|
|
||||||
std::numeric_limits<T>::denorm_min())
|
|
||||||
<< "\nx1(0) = "<<x1(0)<<"\n";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// NaN also causes borland to crash.
|
|
||||||
#if !defined(__BORLANDC__)
|
|
||||||
if(std::numeric_limits<T>::has_quiet_NaN) {
|
|
||||||
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(1.0)) {
|
|
||||||
std::cerr<<"x1(quiet_NaN) == x1(1.0) == "<<x1(1.0)<<"\n";
|
|
||||||
}
|
|
||||||
BOOST_TEST(x1(std::numeric_limits<T>::quiet_NaN()) ==
|
|
||||||
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::quiet_NaN()));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void hash_float_tests()
|
|
||||||
{
|
{
|
||||||
std::cerr<<"Compiler: "<<BOOST_COMPILER<<"\n";
|
std::cerr<<"Compiler: "<<BOOST_COMPILER<<"\n";
|
||||||
std::cerr<<"Platform: "<<BOOST_PLATFORM<<"\n";
|
std::cerr<<"Platform: "<<BOOST_PLATFORM<<"\n";
|
||||||
std::cerr<<"Library: "<<BOOST_STDLIB<<"\n\n";
|
std::cerr<<"Library: "<<BOOST_STDLIB<<"\n\n";
|
||||||
|
|
||||||
float_tests("float", (float*) 0);
|
float_tests("float", (float*) 0);
|
||||||
}
|
|
||||||
|
|
||||||
void hash_double_tests()
|
|
||||||
{
|
|
||||||
float_tests("double", (double*) 0);
|
float_tests("double", (double*) 0);
|
||||||
}
|
|
||||||
|
|
||||||
void hash_long_double_tests()
|
|
||||||
{
|
|
||||||
float_tests("long double", (long double*) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
hash_float_tests();
|
|
||||||
hash_double_tests();
|
|
||||||
hash_long_double_tests();
|
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
208
hash/test/hash_float_test.hpp
Normal file
208
hash/test/hash_float_test.hpp
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
|
||||||
|
// Copyright 2005-2007 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)
|
||||||
|
|
||||||
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
#ifdef TEST_STD_INCLUDES
|
||||||
|
# include <functional>
|
||||||
|
#else
|
||||||
|
# include <boost/functional/hash.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <boost/limits.hpp>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4127) // conditional expression is constant
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void float_tests(char const* name, T* = 0)
|
||||||
|
{
|
||||||
|
std::cerr<<"\n"
|
||||||
|
<<"Testing " BOOST_STRINGIZE(HASH_NAMESPACE) "::hash<"<<name<<">\n"
|
||||||
|
<<"\n"
|
||||||
|
<<"std::numeric_limits<T>::digits = "
|
||||||
|
<<std::numeric_limits<T>::digits<<"\n"
|
||||||
|
<<"std::numeric_limits<int>::digits = "
|
||||||
|
<<std::numeric_limits<int>::digits<<"\n"
|
||||||
|
<<"std::numeric_limits<std::size_t>::digits = "
|
||||||
|
<<std::numeric_limits<std::size_t>::digits<<"\n"
|
||||||
|
<<"\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
HASH_NAMESPACE::hash<T> x1;
|
||||||
|
|
||||||
|
T zero = 0;
|
||||||
|
T minus_zero = (T) -1 * zero;
|
||||||
|
|
||||||
|
BOOST_TEST(zero == minus_zero);
|
||||||
|
BOOST_TEST(x1(zero) == x1(minus_zero));
|
||||||
|
|
||||||
|
BOOST_TEST(x1(zero) == HASH_NAMESPACE::hash_value(zero));
|
||||||
|
BOOST_TEST(x1(minus_zero) == HASH_NAMESPACE::hash_value(minus_zero));
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// Doing anything with infinity causes borland to crash.
|
||||||
|
#if defined(__BORLANDC__)
|
||||||
|
std::cerr<<"Not running infinity checks on Borland, as it causes it to crash.\n";
|
||||||
|
#else
|
||||||
|
if(std::numeric_limits<T>::has_infinity) {
|
||||||
|
T infinity = -log(zero);
|
||||||
|
T infinity2 = (T) 1. / zero;
|
||||||
|
T infinity3 = (T) -1. / minus_zero;
|
||||||
|
T infinity4 = std::numeric_limits<T>::infinity();
|
||||||
|
|
||||||
|
T minus_infinity = log(zero);
|
||||||
|
T minus_infinity2 = (T) -1. / zero;
|
||||||
|
T minus_infinity3 = (T) 1. / minus_zero;
|
||||||
|
|
||||||
|
BOOST_TEST(x1(infinity) == HASH_NAMESPACE::hash_value(infinity));
|
||||||
|
BOOST_TEST(x1(minus_infinity)
|
||||||
|
== HASH_NAMESPACE::hash_value(minus_infinity));
|
||||||
|
|
||||||
|
if(infinity == infinity2)
|
||||||
|
BOOST_TEST(x1(infinity) == x1(infinity2));
|
||||||
|
if(infinity == infinity3)
|
||||||
|
BOOST_TEST(x1(infinity) == x1(infinity3));
|
||||||
|
if(infinity == infinity4)
|
||||||
|
BOOST_TEST(x1(infinity) == x1(infinity4));
|
||||||
|
|
||||||
|
if(minus_infinity == minus_infinity2)
|
||||||
|
BOOST_TEST(x1(minus_infinity) == x1(minus_infinity2));
|
||||||
|
if(minus_infinity == minus_infinity3)
|
||||||
|
BOOST_TEST(x1(minus_infinity) == x1(minus_infinity3));
|
||||||
|
|
||||||
|
BOOST_TEST(infinity != minus_infinity);
|
||||||
|
|
||||||
|
if(x1(infinity) == x1(minus_infinity)) {
|
||||||
|
std::cerr<<"x1(infinity) == x1(-infinity) == "<<x1(infinity)<<"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// This should really be 'has_denorm == denorm_present' but some
|
||||||
|
// compilers don't have 'denorm_present'. See also a later use.
|
||||||
|
if(std::numeric_limits<T>::has_denorm) {
|
||||||
|
if(x1(std::numeric_limits<T>::denorm_min()) == x1(infinity)) {
|
||||||
|
std::cerr<<"x1(denorm_min) == x1(infinity) == "<<x1(infinity)<<"\n";
|
||||||
|
}
|
||||||
|
if(x1(std::numeric_limits<T>::denorm_min()) == x1(minus_infinity)) {
|
||||||
|
std::cerr<<"x1(denorm_min) == x1(-infinity) == "<<x1(minus_infinity)<<"\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(std::numeric_limits<T>::has_quiet_NaN) {
|
||||||
|
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(infinity)) {
|
||||||
|
std::cerr<<"x1(quiet_NaN) == x1(infinity) == "<<x1(infinity)<<"\n";
|
||||||
|
}
|
||||||
|
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(minus_infinity)) {
|
||||||
|
std::cerr<<"x1(quiet_NaN) == x1(-infinity) == "<<x1(minus_infinity)<<"\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
T max = (std::numeric_limits<T>::max)();
|
||||||
|
T half_max = max / 2;
|
||||||
|
T quarter_max = max / 4;
|
||||||
|
T three_quarter_max = max - quarter_max;
|
||||||
|
|
||||||
|
BOOST_TEST(x1(max) == HASH_NAMESPACE::hash_value(max));
|
||||||
|
BOOST_TEST(x1(half_max) == HASH_NAMESPACE::hash_value(half_max));
|
||||||
|
BOOST_TEST(x1(quarter_max) == HASH_NAMESPACE::hash_value(quarter_max));
|
||||||
|
BOOST_TEST(x1(three_quarter_max) == HASH_NAMESPACE::hash_value(three_quarter_max));
|
||||||
|
|
||||||
|
// The '!=' tests could legitimately fail, but with my hash it indicates a bug.
|
||||||
|
BOOST_TEST(x1(max) == x1(max));
|
||||||
|
BOOST_TEST(x1(max) != x1(quarter_max));
|
||||||
|
BOOST_TEST(x1(max) != x1(half_max));
|
||||||
|
BOOST_TEST(x1(max) != x1(three_quarter_max));
|
||||||
|
BOOST_TEST(x1(quarter_max) == x1(quarter_max));
|
||||||
|
BOOST_TEST(x1(quarter_max) != x1(half_max));
|
||||||
|
BOOST_TEST(x1(quarter_max) != x1(three_quarter_max));
|
||||||
|
BOOST_TEST(x1(half_max) == x1(half_max));
|
||||||
|
BOOST_TEST(x1(half_max) != x1(three_quarter_max));
|
||||||
|
BOOST_TEST(x1(three_quarter_max) == x1(three_quarter_max));
|
||||||
|
|
||||||
|
// Intel with gcc stdlib sometimes segfaults on calls to asin and acos.
|
||||||
|
#if !((defined(__INTEL_COMPILER) || defined(__ICL) || \
|
||||||
|
defined(__ICC) || defined(__ECC)) && \
|
||||||
|
(defined(__GLIBCPP__) || defined(__GLIBCXX__)))
|
||||||
|
T v1 = asin((T) 1);
|
||||||
|
T v2 = acos((T) 0);
|
||||||
|
if(v1 == v2)
|
||||||
|
BOOST_TEST(x1(v1) == x1(v2));
|
||||||
|
BOOST_TEST(x1(v1) == HASH_NAMESPACE::hash_value(v1));
|
||||||
|
BOOST_TEST(x1(v2) == HASH_NAMESPACE::hash_value(v2));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
BOOST_TEST(x1(std::numeric_limits<T>::epsilon()) ==
|
||||||
|
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::epsilon()));
|
||||||
|
|
||||||
|
BOOST_TEST(std::numeric_limits<T>::epsilon() != (T) 0);
|
||||||
|
if(x1(std::numeric_limits<T>::epsilon()) == x1((T) 0))
|
||||||
|
std::cerr<<"x1(epsilon) == x1(0) == "<<x1((T) 0)<<"\n";
|
||||||
|
|
||||||
|
BOOST_TEST(-std::numeric_limits<T>::epsilon() != (T) 0);
|
||||||
|
if(x1(-std::numeric_limits<T>::epsilon()) == x1((T) 0))
|
||||||
|
std::cerr<<"x1(-epsilon) == x1(0) == "<<x1((T) 0)<<"\n";
|
||||||
|
|
||||||
|
BOOST_TEST((T) 1 + std::numeric_limits<T>::epsilon() != (T) 1);
|
||||||
|
if(x1((T) 1 + std::numeric_limits<T>::epsilon()) == x1((T) 1))
|
||||||
|
std::cerr<<"x1(1 + epsilon) == x1(1) == "<<x1((T) 1)<<"\n";
|
||||||
|
|
||||||
|
BOOST_TEST((T) 1 - std::numeric_limits<T>::epsilon() != (T) 1);
|
||||||
|
if(x1((T) 1 - std::numeric_limits<T>::epsilon()) == x1((T) 1))
|
||||||
|
std::cerr<<"x1(1 - epsilon) == x1(1) == "<<x1((T) 1)<<"\n";
|
||||||
|
|
||||||
|
BOOST_TEST((T) -1 + std::numeric_limits<T>::epsilon() != (T) -1);
|
||||||
|
if(x1((T) -1 + std::numeric_limits<T>::epsilon()) == x1((T) -1))
|
||||||
|
std::cerr<<"x1(-1 + epsilon) == x1(-1) == "<<x1((T) -1)<<"\n";
|
||||||
|
|
||||||
|
BOOST_TEST((T) -1 - std::numeric_limits<T>::epsilon() != (T) -1);
|
||||||
|
if(x1((T) -1 - std::numeric_limits<T>::epsilon()) == x1((T) -1))
|
||||||
|
std::cerr<<"x1(-1 - epsilon) == x1(-1) == "<<x1((T) -1)<<"\n";
|
||||||
|
|
||||||
|
// As before.
|
||||||
|
if(std::numeric_limits<T>::has_denorm) {
|
||||||
|
if(x1(std::numeric_limits<T>::denorm_min()) == x1(zero)) {
|
||||||
|
std::cerr<<"x1(denorm_min) == x1(zero) == "<<x1(zero)<<"\n";
|
||||||
|
}
|
||||||
|
#if !BOOST_WORKAROUND(__DECCXX_VER,<70190006)
|
||||||
|
// The Tru64/CXX standard library prior to 7.1 contains a bug in the
|
||||||
|
// specialization of std::numeric_limits::denorm_min() for long
|
||||||
|
// doubles which causes this test to fail.
|
||||||
|
if(x1(std::numeric_limits<T>::denorm_min()) !=
|
||||||
|
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::denorm_min()))
|
||||||
|
{
|
||||||
|
std::cerr<<"x1(std::numeric_limits<T>::denorm_min()) = "
|
||||||
|
<< x1(std::numeric_limits<T>::denorm_min())
|
||||||
|
<< "\nhash_value(std::numeric_limits<T>::denorm_min()) = "
|
||||||
|
<< HASH_NAMESPACE::hash_value(
|
||||||
|
std::numeric_limits<T>::denorm_min())
|
||||||
|
<< "\nx1(0) = "<<x1(0)<<"\n";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// NaN also causes borland to crash.
|
||||||
|
#if !defined(__BORLANDC__)
|
||||||
|
if(std::numeric_limits<T>::has_quiet_NaN) {
|
||||||
|
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(1.0)) {
|
||||||
|
std::cerr<<"x1(quiet_NaN) == x1(1.0) == "<<x1(1.0)<<"\n";
|
||||||
|
}
|
||||||
|
BOOST_TEST(x1(std::numeric_limits<T>::quiet_NaN()) ==
|
||||||
|
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::quiet_NaN()));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
// This checks that template code implemented using hash_fwd will work.
|
// This checks that template code implemented using hash_fwd will work.
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
// This test just makes sure a header which uses hash_fwd can compile without
|
// This test just makes sure a header which uses hash_fwd can compile without
|
||||||
// the main hash headers.
|
// the main hash headers.
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
// This test demonstrates an ADL bug in Borland 5.5 where ADL isn't performed
|
// This test demonstrates an ADL bug in Borland 5.5 where ADL isn't performed
|
||||||
// in the global namespace.
|
// in the global namespace.
|
||||||
@@ -44,7 +44,7 @@ namespace boost
|
|||||||
# ifdef TEST_STD_INCLUDES
|
# ifdef TEST_STD_INCLUDES
|
||||||
# include <functional>
|
# include <functional>
|
||||||
# else
|
# else
|
||||||
# include <boost/functional/hash/hash.hpp>
|
# include <boost/functional/hash.hpp>
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
17
hash/test/hash_long_double_test.cpp
Normal file
17
hash/test/hash_long_double_test.cpp
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
// Copyright 2005-2007 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)
|
||||||
|
|
||||||
|
#include "hash_float_test.hpp"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
std::cerr<<"Compiler: "<<BOOST_COMPILER<<"\n";
|
||||||
|
std::cerr<<"Platform: "<<BOOST_PLATFORM<<"\n";
|
||||||
|
std::cerr<<"Library: "<<BOOST_STDLIB<<"\n\n";
|
||||||
|
|
||||||
|
float_tests("long double", (long double*) 0);
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#if !defined(CONTAINER_TYPE)
|
#if !defined(CONTAINER_TYPE)
|
||||||
#error "CONTAINER_TYPE not defined"
|
#error "CONTAINER_TYPE not defined"
|
||||||
@@ -9,6 +9,11 @@
|
|||||||
|
|
||||||
#include <boost/preprocessor/cat.hpp>
|
#include <boost/preprocessor/cat.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4245) // signed/unsigned mismatch
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
||||||
{
|
{
|
||||||
template <class T>
|
template <class T>
|
||||||
@@ -60,5 +65,9 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef CONTAINER_TYPE
|
#undef CONTAINER_TYPE
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#define HASH_NAMESPACE boost
|
#define HASH_NAMESPACE boost
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#define HASH_NAMESPACE boost
|
#define HASH_NAMESPACE boost
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#define HASH_NAMESPACE boost
|
#define HASH_NAMESPACE boost
|
||||||
#define BOOST_HASH_NO_EXTENSIONS
|
#define BOOST_HASH_NO_EXTENSIONS
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
@@ -21,6 +21,13 @@
|
|||||||
|
|
||||||
#include "./compile_time.hpp"
|
#include "./compile_time.hpp"
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4127) // conditional expression is constant
|
||||||
|
#pragma warning(disable:4309) // truncation of constant value
|
||||||
|
#pragma warning(disable:4310) // cast truncates constant value
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void numeric_test(T*)
|
void numeric_test(T*)
|
||||||
{
|
{
|
||||||
@@ -31,7 +38,7 @@ void numeric_test(T*)
|
|||||||
HASH_NAMESPACE::hash<T> x1;
|
HASH_NAMESPACE::hash<T> x1;
|
||||||
HASH_NAMESPACE::hash<T> x2;
|
HASH_NAMESPACE::hash<T> x2;
|
||||||
|
|
||||||
T v1 = -5;
|
T v1 = (T) -5;
|
||||||
BOOST_TEST(x1(v1) == x2(v1));
|
BOOST_TEST(x1(v1) == x2(v1));
|
||||||
BOOST_TEST(x1(T(-5)) == x2(T(-5)));
|
BOOST_TEST(x1(T(-5)) == x2(T(-5)));
|
||||||
BOOST_TEST(x1(T(0)) == x2(T(0)));
|
BOOST_TEST(x1(T(0)) == x2(T(0)));
|
||||||
@@ -48,7 +55,8 @@ void numeric_test(T*)
|
|||||||
|
|
||||||
if (limits::is_integer)
|
if (limits::is_integer)
|
||||||
{
|
{
|
||||||
BOOST_TEST(HASH_NAMESPACE::hash_value(T(-5)) == (std::size_t)T(-5));
|
if(limits::is_signed || limits::digits <= std::numeric_limits<std::size_t>::digits)
|
||||||
|
BOOST_TEST(HASH_NAMESPACE::hash_value(T(-5)) == (std::size_t)T(-5));
|
||||||
BOOST_TEST(HASH_NAMESPACE::hash_value(T(0)) == (std::size_t)T(0u));
|
BOOST_TEST(HASH_NAMESPACE::hash_value(T(0)) == (std::size_t)T(0u));
|
||||||
BOOST_TEST(HASH_NAMESPACE::hash_value(T(10)) == (std::size_t)T(10u));
|
BOOST_TEST(HASH_NAMESPACE::hash_value(T(10)) == (std::size_t)T(10u));
|
||||||
BOOST_TEST(HASH_NAMESPACE::hash_value(T(25)) == (std::size_t)T(25u));
|
BOOST_TEST(HASH_NAMESPACE::hash_value(T(25)) == (std::size_t)T(25u));
|
||||||
@@ -105,16 +113,29 @@ void poor_quality_tests(T*)
|
|||||||
BOOST_TEST(x1((limits::max)()) != x2((limits::max)() - 1));
|
BOOST_TEST(x1((limits::max)()) != x2((limits::max)() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bool_test()
|
||||||
|
{
|
||||||
|
HASH_NAMESPACE::hash<bool> x1;
|
||||||
|
HASH_NAMESPACE::hash<bool> x2;
|
||||||
|
|
||||||
|
BOOST_TEST(x1(true) == x2(true));
|
||||||
|
BOOST_TEST(x1(false) == x2(false));
|
||||||
|
BOOST_TEST(x1(true) != x2(false));
|
||||||
|
BOOST_TEST(x1(false) != x2(true));
|
||||||
|
}
|
||||||
|
|
||||||
#define NUMERIC_TEST(type, name) \
|
#define NUMERIC_TEST(type, name) \
|
||||||
std::cerr<<"Testing: " BOOST_STRINGIZE(name) "\n"; \
|
std::cerr<<"Testing: " BOOST_STRINGIZE(name) "\n"; \
|
||||||
numeric_test((type*) 0); \
|
numeric_test((type*) 0); \
|
||||||
limits_test((type*) 0); \
|
limits_test((type*) 0); \
|
||||||
poor_quality_tests((type*) 0);
|
poor_quality_tests((type*) 0);
|
||||||
|
#define NUMERIC_TEST_NO_LIMITS(type, name) \
|
||||||
|
std::cerr<<"Testing: " BOOST_STRINGIZE(name) "\n"; \
|
||||||
|
numeric_test((type*) 0); \
|
||||||
|
poor_quality_tests((type*) 0);
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
NUMERIC_TEST(bool, bool)
|
|
||||||
NUMERIC_TEST(char, char)
|
NUMERIC_TEST(char, char)
|
||||||
NUMERIC_TEST(signed char, schar)
|
NUMERIC_TEST(signed char, schar)
|
||||||
NUMERIC_TEST(unsigned char, uchar)
|
NUMERIC_TEST(unsigned char, uchar)
|
||||||
@@ -128,11 +149,19 @@ int main()
|
|||||||
NUMERIC_TEST(long, hash_long)
|
NUMERIC_TEST(long, hash_long)
|
||||||
NUMERIC_TEST(unsigned long, ulong)
|
NUMERIC_TEST(unsigned long, ulong)
|
||||||
|
|
||||||
|
#if defined(BOOST_HAS_LONG_LONG)
|
||||||
|
NUMERIC_TEST_NO_LIMITS(long long, hash_longlong)
|
||||||
|
NUMERIC_TEST_NO_LIMITS(unsigned long long, ulonglong)
|
||||||
|
#endif
|
||||||
|
|
||||||
NUMERIC_TEST(float, float)
|
NUMERIC_TEST(float, float)
|
||||||
NUMERIC_TEST(double, double)
|
NUMERIC_TEST(double, double)
|
||||||
NUMERIC_TEST(long double, ldouble)
|
|
||||||
|
bool_test();
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#if !defined(CONTAINER_TYPE)
|
#if !defined(CONTAINER_TYPE)
|
||||||
#error "CONTAINER_TYPE not defined"
|
#error "CONTAINER_TYPE not defined"
|
||||||
@@ -9,6 +9,11 @@
|
|||||||
|
|
||||||
#include <boost/preprocessor/cat.hpp>
|
#include <boost/preprocessor/cat.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4245) // signed/unsigned mismatch
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
||||||
{
|
{
|
||||||
template <class T>
|
template <class T>
|
||||||
@@ -63,5 +68,9 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef CONTAINER_TYPE
|
#undef CONTAINER_TYPE
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#if !defined(CONTAINER_TYPE)
|
#if !defined(CONTAINER_TYPE)
|
||||||
#error "CONTAINER_TYPE not defined"
|
#error "CONTAINER_TYPE not defined"
|
||||||
@@ -9,12 +9,17 @@
|
|||||||
|
|
||||||
#include <boost/preprocessor/cat.hpp>
|
#include <boost/preprocessor/cat.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4245) // signed/unsigned mismatch
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
||||||
{
|
{
|
||||||
template <class T>
|
template <class T>
|
||||||
void integer_tests(T* = 0)
|
void integer_tests(T* = 0)
|
||||||
{
|
{
|
||||||
const int number_of_containers = 11;
|
const int number_of_containers = 12;
|
||||||
T containers[number_of_containers];
|
T containers[number_of_containers];
|
||||||
|
|
||||||
for(int i = 0; i < 5; ++i) {
|
for(int i = 0; i < 5; ++i) {
|
||||||
@@ -30,6 +35,11 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
|||||||
containers[9].insert(-1);
|
containers[9].insert(-1);
|
||||||
containers[10].insert(-1);
|
containers[10].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);
|
||||||
|
|
||||||
HASH_NAMESPACE::hash<T> hasher;
|
HASH_NAMESPACE::hash<T> hasher;
|
||||||
|
|
||||||
@@ -61,5 +71,9 @@ namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(BOOST_MSVC)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef CONTAINER_TYPE
|
#undef CONTAINER_TYPE
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
// On some compilers hash_value isn't available for arrays, so I test it
|
// On some compilers hash_value isn't available for arrays, so I test it
|
||||||
// separately from the main array tests.
|
// separately from the main array tests.
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include "./config.hpp"
|
#include "./config.hpp"
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2006. Use, modification, and distribution are
|
// Copyright 2006-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#define HASH_NAMESPACE boost
|
#define HASH_NAMESPACE boost
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#define HASH_NAMESPACE boost
|
#define HASH_NAMESPACE boost
|
||||||
#define BOOST_HASH_NO_EXTENSIONS
|
#define BOOST_HASH_NO_EXTENSIONS
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
// Copyright Daniel James 2005-2006. Use, modification, and distribution are
|
// Copyright 2005-2007 Daniel James.
|
||||||
// subject to the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user