|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r81920 - in branches/release: . boost boost/functional boost/functional/hash boost/functional/hash/detail libs libs/functional libs/functional/hash/doc libs/functional/hash/test libs/functional/hash/test/extra status
From: dnljms_at_[hidden]
Date: 2012-12-13 17:34:20
Author: danieljames
Date: 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
New Revision: 81920
URL: http://svn.boost.org/trac/boost/changeset/81920
Log:
Hash: Merge from trunk.
- Avoid floating point workarounds on recent standard libraries.
- Support int128.
- Remove container_fwd_0x.hpp.
Added:
branches/release/libs/functional/hash/test/extra/
- copied from r81210, /trunk/libs/functional/hash/test/extra/
Removed:
branches/release/boost/functional/hash/detail/container_fwd_0x.hpp
Properties modified:
branches/release/ (props changed)
branches/release/boost/ (props changed)
branches/release/boost/functional/ (props changed)
branches/release/libs/ (props changed)
branches/release/libs/functional/ (props changed)
branches/release/status/ (props changed)
branches/release/status/Jamfile.v2 (contents, props changed)
Text files modified:
branches/release/boost/functional/hash/detail/float_functions.hpp | 90 ++++++++++++++++++++++++++++++++++++++++
branches/release/boost/functional/hash/detail/hash_float.hpp | 9 +++
branches/release/boost/functional/hash/extensions.hpp | 16 ++++++
branches/release/boost/functional/hash/hash.hpp | 31 +++++++++++--
branches/release/libs/functional/hash/doc/changes.qbk | 6 ++
branches/release/libs/functional/hash/test/Jamfile.v2 | 2
branches/release/libs/functional/hash/test/extra/check_float_funcs.cpp | 2
branches/release/libs/functional/hash/test/hash_complex_test.cpp | 2
branches/release/libs/functional/hash/test/hash_enum_test.cpp | 80 +++++++++++++++++-----------------
branches/release/libs/functional/hash/test/hash_float_test.hpp | 2
branches/release/libs/functional/hash/test/hash_number_test.cpp | 44 ++++++++++++++-----
branches/release/status/Jamfile.v2 | 2
12 files changed, 221 insertions(+), 65 deletions(-)
Deleted: branches/release/boost/functional/hash/detail/container_fwd_0x.hpp
==============================================================================
--- branches/release/boost/functional/hash/detail/container_fwd_0x.hpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
+++ (empty file)
@@ -1,29 +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)
-
-#if !defined(BOOST_DETAIL_CONTAINER_FWD_0X_HPP)
-#define BOOST_DETAIL_CONTAINER_FWD_0X_HPP
-
-#include <boost/detail/container_fwd.hpp>
-
-// std::array
-
-#if !defined(BOOST_NO_CXX11_HDR_ARRAY)
-# include <array>
-#endif
-
-// std::tuple
-
-#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
-# include <tuple>
-#endif
-
-// std::shared_ptr/std::unique_ptr
-
-#if !defined(BOOST_NO_CXX11_HDR_MEMORY)
-# include <memory>
-#endif
-
-#endif
Modified: branches/release/boost/functional/hash/detail/float_functions.hpp
==============================================================================
--- branches/release/boost/functional/hash/detail/float_functions.hpp (original)
+++ branches/release/boost/functional/hash/detail/float_functions.hpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -13,6 +13,94 @@
# pragma once
#endif
+// Set BOOST_HASH_CONFORMANT_FLOATS to 1 for libraries known to have
+// sufficiently good floating point support to not require any
+// workarounds.
+//
+// When set to 0, the library tries to automatically
+// use the best available implementation. This normally works well, but
+// breaks when ambiguities are created by odd namespacing of the functions.
+//
+// Note that if this is set to 0, the library should still take full
+// advantage of the platform's floating point support.
+
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__LIBCOMO__)
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
+// Rogue Wave library:
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(_LIBCPP_VERSION)
+// libc++
+# define BOOST_HASH_CONFORMANT_FLOATS 1
+#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
+// GNU libstdc++ 3
+# if defined(__GNUC__) && __GNUC__ >= 4
+# define BOOST_HASH_CONFORMANT_FLOATS 1
+# else
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+# endif
+#elif defined(__STL_CONFIG_H)
+// generic SGI STL
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__MSL_CPP__)
+// MSL standard lib:
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__IBMCPP__)
+// VACPP std lib (probably conformant for much earlier version).
+# if __IBMCPP__ >= 1210
+# define BOOST_HASH_CONFORMANT_FLOATS 1
+# else
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+# endif
+#elif defined(MSIPL_COMPILE_H)
+// Modena C++ standard library
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
+// Dinkumware Library (this has to appear after any possible replacement libraries):
+# if _CPPLIB_VER >= 405
+# define BOOST_HASH_CONFORMANT_FLOATS 1
+# else
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+# endif
+#else
+# define BOOST_HASH_CONFORMANT_FLOATS 0
+#endif
+
+#if BOOST_HASH_CONFORMANT_FLOATS
+
+// The standard library is known to be compliant, so don't use the
+// configuration mechanism.
+
+namespace boost {
+ namespace hash_detail {
+ template <typename Float>
+ struct call_ldexp {
+ typedef Float float_type;
+ inline Float operator()(Float x, int y) const {
+ return std::ldexp(x, y);
+ }
+ };
+
+ template <typename Float>
+ struct call_frexp {
+ typedef Float float_type;
+ inline Float operator()(Float x, int* y) const {
+ return std::frexp(x, y);
+ }
+ };
+
+ template <typename Float>
+ struct select_hash_type
+ {
+ typedef Float type;
+ };
+ }
+}
+
+#else // BOOST_HASH_CONFORMANT_FLOATS == 0
+
// The C++ standard requires that the C float functions are overloarded
// for float, double and long double in the std namespace, but some of the older
// library implementations don't support this. On some that don't, the C99
@@ -243,4 +331,6 @@
}
}
+#endif // BOOST_HASH_CONFORMANT_FLOATS
+
#endif
Modified: branches/release/boost/functional/hash/detail/hash_float.hpp
==============================================================================
--- branches/release/boost/functional/hash/detail/hash_float.hpp (original)
+++ branches/release/boost/functional/hash/detail/hash_float.hpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -210,8 +210,15 @@
template <class T>
inline std::size_t float_hash_value(T v)
{
+#if defined(fpclassify)
+ switch (fpclassify(v))
+#elif BOOST_HASH_CONFORMANT_FLOATS
+ switch (std::fpclassify(v))
+#else
using namespace std;
- switch (fpclassify(v)) {
+ switch (fpclassify(v))
+#endif
+ {
case FP_ZERO:
return 0;
case FP_INFINITE:
Modified: branches/release/boost/functional/hash/extensions.hpp
==============================================================================
--- branches/release/boost/functional/hash/extensions.hpp (original)
+++ branches/release/boost/functional/hash/extensions.hpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -14,12 +14,24 @@
#define BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP
#include <boost/functional/hash/hash.hpp>
-#include <boost/functional/hash/detail/container_fwd_0x.hpp>
+#include <boost/detail/container_fwd.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/static_assert.hpp>
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
+#if !defined(BOOST_NO_CXX11_HDR_ARRAY)
+# include <array>
+#endif
+
+#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
+# include <tuple>
+#endif
+
+#if !defined(BOOST_NO_CXX11_HDR_MEMORY)
+# include <memory>
+#endif
+
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
@@ -149,7 +161,7 @@
}
}
-#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
template <typename... T>
inline std::size_t hash_value(std::tuple<T...> const& v)
{
Modified: branches/release/boost/functional/hash/hash.hpp
==============================================================================
--- branches/release/boost/functional/hash/hash.hpp (original)
+++ branches/release/boost/functional/hash/hash.hpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -16,6 +16,7 @@
#include <string>
#include <boost/limits.hpp>
#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_integral.hpp>
#include <boost/utility/enable_if.hpp>
#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
@@ -40,8 +41,8 @@
struct enable_hash_value { typedef std::size_t type; };
template <typename T> struct basic_numbers {};
- template <typename T> struct long_numbers {};
- template <typename T> struct ulong_numbers {};
+ template <typename T> struct long_numbers;
+ template <typename T> struct ulong_numbers;
template <typename T> struct float_numbers {};
template <> struct basic_numbers<bool> :
@@ -70,6 +71,14 @@
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.
+ template <typename T> struct long_numbers2 {};
+ template <typename T> struct ulong_numbers2 {};
+ template <typename T> struct long_numbers : long_numbers2<T> {};
+ template <typename T> struct ulong_numbers : ulong_numbers2<T> {};
+
#if !defined(BOOST_NO_LONG_LONG)
template <> struct long_numbers<boost::long_long_type> :
boost::hash_detail::enable_hash_value {};
@@ -77,6 +86,13 @@
boost::hash_detail::enable_hash_value {};
#endif
+#if defined(BOOST_HAS_INT128)
+ template <> struct long_numbers2<boost::int128_type> :
+ boost::hash_detail::enable_hash_value {};
+ template <> struct ulong_numbers2<boost::uint128_type> :
+ boost::hash_detail::enable_hash_value {};
+#endif
+
template <> struct float_numbers<float> :
boost::hash_detail::enable_hash_value {};
template <> struct float_numbers<double> :
@@ -94,7 +110,7 @@
template <typename T>
typename boost::enable_if<boost::is_enum<T>, std::size_t>::type
- hash_value(T);
+ hash_value(T);
#if !BOOST_WORKAROUND(__DMC__, <= 0x848)
template <class T> std::size_t hash_value(T* const&);
@@ -187,9 +203,9 @@
template <typename T>
typename boost::enable_if<boost::is_enum<T>, std::size_t>::type
- hash_value(T v)
+ hash_value(T v)
{
- return static_cast<std::size_t>(v);
+ return static_cast<std::size_t>(v);
}
// Implementation by Alberto Barbati and Dave Harris.
@@ -423,6 +439,11 @@
BOOST_HASH_SPECIALIZE(boost::ulong_long_type)
#endif
+#if defined(BOOST_HAS_INT128)
+ BOOST_HASH_SPECIALIZE(boost::int128_type)
+ BOOST_HASH_SPECIALIZE(boost::uint128_type)
+#endif
+
#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX)
BOOST_HASH_SPECIALIZE(std::type_index)
#endif
Modified: branches/release/libs/functional/hash/doc/changes.qbk
==============================================================================
--- branches/release/libs/functional/hash/doc/changes.qbk (original)
+++ branches/release/libs/functional/hash/doc/changes.qbk 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -142,7 +142,13 @@
[h2 Boost 1.52.0]
* Restore `enum` support, which was accidentally removed in the last version.
+* Add support for `boost::int128_type` and `boost::uint128_type` where
+ available - currently only `__int128` and `unsigned __int128` on some
+ versions of gcc.
* New floating point hasher - will hash the binary representation on more
platforms, which should be faster.
+* On platforms that are known to have standard floating point, don't use the
+ automatic detection of floating point functions - which can break if there
+ are ambiguous overloads.
[endsect]
Modified: branches/release/libs/functional/hash/test/Jamfile.v2
==============================================================================
--- branches/release/libs/functional/hash/test/Jamfile.v2 (original)
+++ branches/release/libs/functional/hash/test/Jamfile.v2 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -12,7 +12,7 @@
<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>msvc:<warnings-as-errors>on
+ #<toolset>msvc:<warnings-as-errors>on
#<toolset>gcc:<warnings-as-errors>on
#<toolset>darwin:<warnings-as-errors>on
;
Modified: branches/release/libs/functional/hash/test/extra/check_float_funcs.cpp
==============================================================================
--- /trunk/libs/functional/hash/test/extra/check_float_funcs.cpp (original)
+++ branches/release/libs/functional/hash/test/extra/check_float_funcs.cpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -55,4 +55,4 @@
int (*fpc3)(long double) = std::fpclassify;
#endif
-}
\ No newline at end of file
+}
Modified: branches/release/libs/functional/hash/test/hash_complex_test.cpp
==============================================================================
--- branches/release/libs/functional/hash/test/hash_complex_test.cpp (original)
+++ branches/release/libs/functional/hash/test/hash_complex_test.cpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -35,7 +35,7 @@
#endif
#endif
-#if defined(__GNUC__)
+#if defined(__GNUC__) && !defined(BOOST_INTEL_CXX_VERSION)
#pragma GCC diagnostic ignored "-Wfloat-equal"
#endif
Modified: branches/release/libs/functional/hash/test/hash_enum_test.cpp
==============================================================================
--- branches/release/libs/functional/hash/test/hash_enum_test.cpp (original)
+++ branches/release/libs/functional/hash/test/hash_enum_test.cpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -15,49 +15,49 @@
#include "./compile_time.hpp"
namespace test {
- enum enum_override { enum_override1, enum_override2 };
- std::size_t hash_value(enum_override) { return 896532; }
+ enum enum_override { enum_override1, enum_override2 };
+ std::size_t hash_value(enum_override) { return 896532; }
- enum enum1 { enum1a };
- enum enum2 { enum2a, enum2b };
- enum enum3 { enum3a = 574, enum3b };
- enum enum4 { enum4a = -12574, enum4b };
+ enum enum1 { enum1a };
+ enum enum2 { enum2a, enum2b };
+ enum enum3 { enum3a = 574, enum3b };
+ enum enum4 { enum4a = -12574, enum4b };
}
int main() {
- compile_time_tests((test::enum1*) 0);
- compile_time_tests((test::enum2*) 0);
- compile_time_tests((test::enum3*) 0);
- compile_time_tests((test::enum4*) 0);
- compile_time_tests((test::enum_override*) 0);
-
- HASH_NAMESPACE::hash<test::enum1> hash1;
- HASH_NAMESPACE::hash<test::enum2> hash2;
- HASH_NAMESPACE::hash<test::enum3> hash3;
- HASH_NAMESPACE::hash<test::enum4> hash4;
-
- BOOST_TEST(hash1(test::enum1a) == hash1(test::enum1a));
-
- BOOST_TEST(hash2(test::enum2a) == hash2(test::enum2a));
- BOOST_TEST(hash2(test::enum2a) != hash2(test::enum2b));
- BOOST_TEST(hash2(test::enum2b) == hash2(test::enum2b));
-
- BOOST_TEST(hash3(test::enum3a) == hash3(test::enum3a));
- BOOST_TEST(hash3(test::enum3a) != hash3(test::enum3b));
- BOOST_TEST(hash3(test::enum3b) == hash3(test::enum3b));
-
- BOOST_TEST(hash4(test::enum4a) == hash4(test::enum4a));
- BOOST_TEST(hash4(test::enum4a) != hash4(test::enum4b));
- BOOST_TEST(hash4(test::enum4b) == hash4(test::enum4b));
-
- HASH_NAMESPACE::hash<test::enum_override> hash_override;
-
- BOOST_TEST(hash_override(test::enum_override1) ==
- hash_override(test::enum_override1));
- BOOST_TEST(hash_override(test::enum_override1) ==
- hash_override(test::enum_override2));
- BOOST_TEST(hash_override(test::enum_override1) ==
- hash_override(test::enum_override1));
+ compile_time_tests((test::enum1*) 0);
+ compile_time_tests((test::enum2*) 0);
+ compile_time_tests((test::enum3*) 0);
+ compile_time_tests((test::enum4*) 0);
+ compile_time_tests((test::enum_override*) 0);
+
+ HASH_NAMESPACE::hash<test::enum1> hash1;
+ HASH_NAMESPACE::hash<test::enum2> hash2;
+ HASH_NAMESPACE::hash<test::enum3> hash3;
+ HASH_NAMESPACE::hash<test::enum4> hash4;
+
+ BOOST_TEST(hash1(test::enum1a) == hash1(test::enum1a));
+
+ BOOST_TEST(hash2(test::enum2a) == hash2(test::enum2a));
+ BOOST_TEST(hash2(test::enum2a) != hash2(test::enum2b));
+ BOOST_TEST(hash2(test::enum2b) == hash2(test::enum2b));
+
+ BOOST_TEST(hash3(test::enum3a) == hash3(test::enum3a));
+ BOOST_TEST(hash3(test::enum3a) != hash3(test::enum3b));
+ BOOST_TEST(hash3(test::enum3b) == hash3(test::enum3b));
+
+ BOOST_TEST(hash4(test::enum4a) == hash4(test::enum4a));
+ BOOST_TEST(hash4(test::enum4a) != hash4(test::enum4b));
+ BOOST_TEST(hash4(test::enum4b) == hash4(test::enum4b));
+
+ HASH_NAMESPACE::hash<test::enum_override> hash_override;
+
+ BOOST_TEST(hash_override(test::enum_override1) ==
+ hash_override(test::enum_override1));
+ BOOST_TEST(hash_override(test::enum_override1) ==
+ hash_override(test::enum_override2));
+ BOOST_TEST(hash_override(test::enum_override1) ==
+ hash_override(test::enum_override1));
- return boost::report_errors();
+ return boost::report_errors();
}
Modified: branches/release/libs/functional/hash/test/hash_float_test.hpp
==============================================================================
--- branches/release/libs/functional/hash/test/hash_float_test.hpp (original)
+++ branches/release/libs/functional/hash/test/hash_float_test.hpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -30,7 +30,7 @@
#endif
#endif
-#if defined(__GNUC__)
+#if defined(__GNUC__) && !defined(BOOST_INTEL_CXX_VERSION)
#pragma GCC diagnostic ignored "-Wfloat-equal"
#endif
Modified: branches/release/libs/functional/hash/test/hash_number_test.cpp
==============================================================================
--- branches/release/libs/functional/hash/test/hash_number_test.cpp (original)
+++ branches/release/libs/functional/hash/test/hash_number_test.cpp 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -16,6 +16,7 @@
#include <boost/preprocessor/cat.hpp>
#include <boost/functional/hash/detail/limits.hpp>
+#include <boost/utility/enable_if.hpp>
#include "./compile_time.hpp"
@@ -26,11 +27,35 @@
#pragma warning(disable:4310) // cast truncates constant value
#endif
-#if defined(__GNUC__)
+#if defined(__GNUC__) && !defined(BOOST_INTEL_CXX_VERSION)
#pragma GCC diagnostic ignored "-Wfloat-equal"
#endif
template <class T>
+void numeric_extra_tests(typename
+ boost::enable_if_c<boost::hash_detail::limits<T>::is_integer,
+ void*>::type = 0)
+{
+ typedef boost::hash_detail::limits<T> limits;
+
+ if(limits::is_signed ||
+ limits::digits <= boost::hash_detail::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(10)) == (std::size_t)T(10u));
+ BOOST_TEST(HASH_NAMESPACE::hash_value(T(25)) == (std::size_t)T(25u));
+}
+
+template <class T>
+void numeric_extra_tests(typename
+ boost::disable_if_c<boost::hash_detail::limits<T>::is_integer,
+ void*>::type = 0)
+{
+}
+
+template <class T>
void numeric_test(T*)
{
typedef boost::hash_detail::limits<T> limits;
@@ -55,17 +80,7 @@
BOOST_TEST(x1(T(10)) == HASH_NAMESPACE::hash_value(T(10)));
BOOST_TEST(x1(T(25)) == HASH_NAMESPACE::hash_value(T(25)));
- if (limits::is_integer)
- {
- if(limits::is_signed ||
- limits::digits <= boost::hash_detail::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(10)) == (std::size_t)T(10u));
- BOOST_TEST(HASH_NAMESPACE::hash_value(T(25)) == (std::size_t)T(25u));
- }
+ numeric_extra_tests<T>();
#endif
}
@@ -160,6 +175,11 @@
NUMERIC_TEST_NO_LIMITS(boost::ulong_long_type, ulong_long)
#endif
+#if defined(BOOST_HAS_INT128)
+ NUMERIC_TEST_NO_LIMITS(boost::int128_type, int128)
+ NUMERIC_TEST_NO_LIMITS(boost::uint128_type, uint128)
+#endif
+
NUMERIC_TEST(float, float)
NUMERIC_TEST(double, double)
Modified: branches/release/status/Jamfile.v2
==============================================================================
--- branches/release/status/Jamfile.v2 (original)
+++ branches/release/status/Jamfile.v2 2012-12-13 17:34:18 EST (Thu, 13 Dec 2012)
@@ -79,7 +79,7 @@
functional/test # test-suite functional
functional/factory/test # test-suite functional/factory
functional/forward/test # test-suite functional/forward
- functional/hash/test # test-suite functional/hash
+ functional/hash/test/extra # test-suite functional/hash
functional/overloaded_function/test # test-suite func./overloaded_function
function_types/test # test-suite function_types
fusion/test # test-suite fusion
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk