diff --git a/bind.html b/bind.html
index 83794be..36ea678 100644
--- a/bind.html
+++ b/bind.html
@@ -341,7 +341,7 @@ void render(image & target)
{
public:
- boost::function<void> onClick;
+ boost::function<void()> onClick;
};
class player
diff --git a/bind_visitor.cpp b/bind_visitor.cpp
index 3e79579..1ce7b53 100644
--- a/bind_visitor.cpp
+++ b/bind_visitor.cpp
@@ -31,32 +31,18 @@
#pragma warning(pop)
#endif
-// default implementation of visit_each
-
-namespace boost
-{
- template void visit_each(V & v, T const & t, long)
- {
- v(t, 0);
- }
-}
-
-// visitor
-
-int hash = 0;
+//
struct visitor
{
- template void operator()(boost::reference_wrapper const & r, int) const
+ template void operator()( boost::reference_wrapper const & r ) const
{
std::cout << "Reference to " << typeid(T).name() << " @ " << &r.get() << " (with value " << r.get() << ")\n";
- hash += r.get();
}
- template void operator()(T const &, long) const
+ template void operator()( T const & t ) const
{
- std::cout << "Value of type " << typeid(T).name() << '\n';
- ++hash;
+ std::cout << "Value of type " << typeid(T).name() << " (with value " << t << ")\n";
}
};
@@ -70,26 +56,10 @@ int f(int & i, int & j, int)
int x = 2;
int y = 7;
-int detect_errors(bool x)
-{
- if(x)
- {
- std::cerr << "no errors detected.\n";
- return 0;
- }
- else
- {
- std::cerr << "test failed.\n";
- return 1;
- }
-}
-
int main()
{
using namespace boost;
visitor v;
visit_each(v, bind(bind(f, ref(x), _1, 42), ref(y)), 0);
-
- return detect_errors(hash == 12);
}
diff --git a/test/Jamfile.v2 b/test/Jamfile.v2
index f8b7813..b88d49e 100644
--- a/test/Jamfile.v2
+++ b/test/Jamfile.v2
@@ -25,6 +25,8 @@ test-suite "bind"
[ compile bind_unary_addr.cpp ]
[ run bind_dm3_test.cpp ]
[ run bind_visit_test.cpp ]
+ [ run bind_placeholder_test.cpp ]
+ [ run bind_rvalue_test.cpp ]
[ run mem_fn_test.cpp ]
[ run mem_fn_void_test.cpp ]
[ run mem_fn_derived_test.cpp ]
diff --git a/test/bind_placeholder_test.cpp b/test/bind_placeholder_test.cpp
new file mode 100644
index 0000000..174dd82
--- /dev/null
+++ b/test/bind_placeholder_test.cpp
@@ -0,0 +1,83 @@
+#include
+
+#if defined( BOOST_MSVC )
+
+#pragma warning(disable: 4786) // identifier truncated in debug info
+#pragma warning(disable: 4710) // function not inlined
+#pragma warning(disable: 4711) // function selected for automatic inline expansion
+#pragma warning(disable: 4514) // unreferenced inline removed
+
+#endif
+
+// bind_placeholder_test.cpp - test custom placeholders
+//
+// Copyright (c) 2006 Peter Dimov
+//
+// 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
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+#pragma warning(push, 3)
+#endif
+
+#include
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+#pragma warning(pop)
+#endif
+
+#include
+
+//
+
+long f( long a, long b, long c, long d, long e, long f, long g, long h, long i )
+{
+ return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g + 10000000 * h + 100000000 * i;
+}
+
+template< int I > struct custom_placeholder
+{
+};
+
+namespace boost
+{
+
+template< int I > struct is_placeholder< custom_placeholder< I > >
+{
+ enum { value = I };
+};
+
+} // namespace boost
+
+int main()
+{
+ int const x1 = 1;
+ int const x2 = 2;
+ int const x3 = 3;
+ int const x4 = 4;
+ int const x5 = 5;
+ int const x6 = 6;
+ int const x7 = 7;
+ int const x8 = 8;
+ int const x9 = 9;
+
+ custom_placeholder<1> p1;
+ custom_placeholder<2> p2;
+ custom_placeholder<3> p3;
+ custom_placeholder<4> p4;
+ custom_placeholder<5> p5;
+ custom_placeholder<6> p6;
+ custom_placeholder<7> p7;
+ custom_placeholder<8> p8;
+ custom_placeholder<9> p9;
+
+ BOOST_TEST(
+ boost::bind( f, p1, p2, p3, p4, p5, p6, p7, p8, p9 )
+ ( x1, x2, x3, x4, x5, x6, x7, x8, x9 ) == 987654321L );
+
+ return boost::report_errors();
+}
diff --git a/test/bind_rvalue_test.cpp b/test/bind_rvalue_test.cpp
new file mode 100644
index 0000000..e0bd229
--- /dev/null
+++ b/test/bind_rvalue_test.cpp
@@ -0,0 +1,81 @@
+#include
+
+#if defined( BOOST_MSVC )
+
+#pragma warning(disable: 4786) // identifier truncated in debug info
+#pragma warning(disable: 4710) // function not inlined
+#pragma warning(disable: 4711) // function selected for automatic inline expansion
+#pragma warning(disable: 4514) // unreferenced inline removed
+
+#endif
+
+// bind_rvalue_test.cpp
+//
+// Copyright (c) 2006 Peter Dimov
+//
+// 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
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+#pragma warning(push, 3)
+#endif
+
+#include
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+#pragma warning(pop)
+#endif
+
+#include
+
+//
+
+int f( int x )
+{
+ return x;
+}
+
+int main()
+{
+ BOOST_TEST(
+ boost::bind( f, _1 )
+ ( 1 ) == 1 );
+
+ BOOST_TEST(
+ boost::bind( f, _2 )
+ ( 1, 2 ) == 2 );
+
+ BOOST_TEST(
+ boost::bind( f, _3 )
+ ( 1, 2, 3 ) == 3 );
+
+ BOOST_TEST(
+ boost::bind( f, _4 )
+ ( 1, 2, 3, 4 ) == 4 );
+
+ BOOST_TEST(
+ boost::bind( f, _5 )
+ ( 1, 2, 3, 4, 5 ) == 5 );
+
+ BOOST_TEST(
+ boost::bind( f, _6 )
+ ( 1, 2, 3, 4, 5, 6 ) == 6 );
+
+ BOOST_TEST(
+ boost::bind( f, _7 )
+ ( 1, 2, 3, 4, 5, 6, 7 ) == 7 );
+
+ BOOST_TEST(
+ boost::bind( f, _8 )
+ ( 1, 2, 3, 4, 5, 6, 7, 8 ) == 8 );
+
+ BOOST_TEST(
+ boost::bind( f, _9 )
+ ( 1, 2, 3, 4, 5, 6, 7, 8, 9 ) == 9 );
+
+ return boost::report_errors();
+}