diff --git a/doc/changes.qbk b/doc/changes.qbk
index c47bd56..3aa3dee 100644
--- a/doc/changes.qbk
+++ b/doc/changes.qbk
@@ -129,5 +129,7 @@
Avoid gcc's `-Wfloat-equal` warning.
* [@http://svn.boost.org/trac/boost/ticket/6806 Ticket 6806]:
Support `std::array` and `std::tuple` when available.
+* Add deprecation warning to the long deprecated
+ `boost/functional/detail/container_fwd.hpp`.
[endsect]
diff --git a/doc/ref.xml b/doc/ref.xml
index fa29fcd..d7c427c 100644
--- a/doc/ref.xml
+++ b/doc/ref.xml
@@ -55,6 +55,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
is defined. The specializations are still defined, so only the specializations
required by TR1 are defined.
+
+ Forward declared in
+ <boost/functional/hash_fwd.hpp>
+
Only throws if
@@ -451,6 +455,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
hash_value is called without
qualification, so that overloads can be found via ADL.
This is an extension to TR1
+
+ Forward declared in
+ <boost/functional/hash_fwd.hpp>
+
Only throws if hash_value(T) throws.
@@ -499,15 +507,14 @@ for(; first != last; ++first)
return seed;
- For the three arguments overload:
+
+ For the three arguments overload:
for(; first != last; ++first)
{
hash_combine(seed, *first);
}
-
-
@@ -516,6 +523,10 @@ for(; first != last; ++first)
container.
This is an extension to TR1
+
+ Forward declared in
+ <boost/functional/hash_fwd.hpp>
+
Only throws if hash_value(std::iterator_traits<It>::value_type)
diff --git a/doc/tutorial.qbk b/doc/tutorial.qbk
index 81c1b15..916ab93 100644
--- a/doc/tutorial.qbk
+++ b/doc/tutorial.qbk
@@ -198,5 +198,15 @@ To calculate the hash of an iterator range you can use [funcref boost::hash_rang
std::vector some_strings;
std::size_t hash = ``[funcref boost::hash_range]``(some_strings.begin(), some_strings.end());
-[endsect]
+Note that when writing template classes, you might not want to include the main
+hash header as it's quite an expensive include that brings in a lot of other
+headers, so instead you can include the ``
+header which forward declares [classref boost::hash],
+[funcref boost::hash_range] and [funcref boost::hash_combine]. You'll need to
+include the main header before instantiating [classref boost::hash]. When using
+a container that uses [classref boost::hash] it should do that for you, so your
+type will work fine with the boost hash containers. There's an example of this
+in [@boost:/libs/unordered/examples/template.hpp template.hpp] and
+[@boost:/libs/unordered/examples/template.cpp template.cpp].
+[endsect]
diff --git a/examples/Jamfile.v2 b/examples/Jamfile.v2
index dc5bdce..6291621 100644
--- a/examples/Jamfile.v2
+++ b/examples/Jamfile.v2
@@ -6,3 +6,4 @@
run books.cpp ;
run point.cpp ;
run portable.cpp ;
+run template.cpp ;
diff --git a/examples/template.cpp b/examples/template.cpp
new file mode 100644
index 0000000..d74f0a9
--- /dev/null
+++ b/examples/template.cpp
@@ -0,0 +1,18 @@
+
+// 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)
+
+#include "template.hpp"
+#include
+#include
+
+int main()
+{
+ typedef my_pair pair;
+ boost::unordered_set pair_set;
+ pair_set.emplace(10, 0.5f);
+
+ assert(pair_set.find(pair(10, 0.5f)) != pair_set.end());
+ assert(pair_set.find(pair(10, 0.6f)) == pair_set.end());
+}
diff --git a/examples/template.hpp b/examples/template.hpp
new file mode 100644
index 0000000..b630704
--- /dev/null
+++ b/examples/template.hpp
@@ -0,0 +1,36 @@
+
+// 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)
+
+// This is an example of how to write a hash function for a template
+// class.
+
+#include
+
+template
+class my_pair
+{
+ A value1;
+ B value2;
+public:
+ my_pair(A const& v1, B const& v2)
+ : value1(v1), value2(v2)
+ {}
+
+ bool operator==(my_pair const& other) const
+ {
+ return value1 == other.value1 &&
+ value2 == other.value2;
+ }
+
+ friend std::size_t hash_value(my_pair const& p)
+ {
+ std::size_t seed = 0;
+ boost::hash_combine(seed, p.value1);
+ boost::hash_combine(seed, p.value2);
+
+ return seed;
+ }
+};
+
diff --git a/include/boost/functional/detail/container_fwd.hpp b/include/boost/functional/detail/container_fwd.hpp
index 9a69d15..e2bf865 100644
--- a/include/boost/functional/detail/container_fwd.hpp
+++ b/include/boost/functional/detail/container_fwd.hpp
@@ -1,11 +1,11 @@
-// Copyright 2005-2008 Daniel James.
+// Copyright 2005-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)
// Forwarding header for container_fwd.hpp's new location.
-// This header is deprecated, I'll be adding a warning in a future release,
-// then converting it to an error and finally removing this header completely.
+// This header is deprecated, I'll change the warning to an error in a future
+// release, and then later remove the header completely.
#if !defined(BOOST_FUNCTIONAL_DETAIL_CONTAINER_FWD_HPP)
#define BOOST_FUNCTIONAL_DETAIL_CONTAINER_FWD_HPP
@@ -14,6 +14,14 @@
# pragma once
#endif
+#if defined(__EDG__)
+#elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+#pragma message("Warning: boost/functional/detail/container_fwd.hpp is deprecated, use boost/detail/container_fwd.hpp instead.")
+#elif defined(__GNUC__) || defined(__HP_aCC) || \
+ defined(__SUNPRO_CC) || defined(__IBMCPP__)
+#warning "boost/functional/detail/container_fwd.hpp is deprecated, use boost/detail/container_fwd.hpp instead."
+#endif
+
#include
#endif
diff --git a/test/Jamfile.v2 b/test/Jamfile.v2
index 2d1a527..77ac13f 100644
--- a/test/Jamfile.v2
+++ b/test/Jamfile.v2
@@ -50,6 +50,7 @@ test-suite functional/hash
[ compile-fail implicit_fail_test.cpp : BOOST_HASH_NO_IMPLICIT_CASTS ]
[ run hash_no_ext_macro_1.cpp : : : BOOST_HASH_NO_IMPLICIT_CASTS ]
[ run hash_no_ext_macro_2.cpp : : : BOOST_HASH_NO_IMPLICIT_CASTS ]
+ [ compile deprecated_container_fwd.cpp ]
;
test-suite functional/hash_implicit_casts
diff --git a/test/deprecated_container_fwd.cpp b/test/deprecated_container_fwd.cpp
new file mode 100644
index 0000000..1c6e12b
--- /dev/null
+++ b/test/deprecated_container_fwd.cpp
@@ -0,0 +1,14 @@
+
+// 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)
+
+#include
+
+typedef std::vector > int_vector;
+
+#include
+
+int main() {
+ int_vector x;
+}