$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r49818 - trunk/libs/spirit/phoenix/test/bind
From: steven_at_[hidden]
Date: 2008-11-17 14:43:41
Author: steven_watanabe
Date: 2008-11-17 14:43:41 EST (Mon, 17 Nov 2008)
New Revision: 49818
URL: http://svn.boost.org/trac/boost/changeset/49818
Log:
More thorough tests for using bind with member variables
Text files modified: 
   trunk/libs/spirit/phoenix/test/bind/bind_member_variable_tests.cpp |    74 ++++++++++++++++++++++++++++++++++----- 
   1 files changed, 64 insertions(+), 10 deletions(-)
Modified: trunk/libs/spirit/phoenix/test/bind/bind_member_variable_tests.cpp
==============================================================================
--- trunk/libs/spirit/phoenix/test/bind/bind_member_variable_tests.cpp	(original)
+++ trunk/libs/spirit/phoenix/test/bind/bind_member_variable_tests.cpp	2008-11-17 14:43:41 EST (Mon, 17 Nov 2008)
@@ -29,21 +29,75 @@
     };
 }
 
-int
-main()
+template<class T, class F>
+void write_test(F f) {
+    T x_;
+    bind(&T::m, f(x_))() = 122;
+    BOOST_TEST(x_.m == 122);
+    bind(&T::m, arg1)(f(x_)) = 123;
+    BOOST_TEST(x_.m == 123);
+}
+
+template<class T, class F>
+void read_test(F f) {
+    T x_;
+    x_.m = 123;
+
+    BOOST_TEST(bind(&T::m, f(x_))() == 123);
+    BOOST_TEST(bind(&T::m, arg1)(f(x_)) == 123);
+}
+
+struct identity
 {
+    template<class T>
+    T& operator()(T& t) const
     {
-        test::x x_;
-        bind(&test::x::m, x_)() = 123;
-        bind(&test::x::m, arg1)(x_) = 123;
-        BOOST_TEST(x_.m == 123);
+        return t;
     }
+};
+
+struct constify
+{
+    template<class T>
+    const T& operator()(const T& t) const
     {
-        test::xx x_= {0};
-        bind(&test::xx::m, val(x_))(); // does not compile
-        bind(&test::xx::m, ref(x_))() = 1;
-        bind(&test::xx::m, cref(x_))();
+        return t;
     }
+};
+
+struct add_pointer
+{
+    template<class T>
+    T* const operator()(T& t) const
+    {
+        return &t;
+    }
+};
+
+struct add_const_pointer
+{
+    template<class T>
+    const T* const operator()(const T& t) const
+    {
+        return &t;
+    }
+};
+
+int
+main()
+{
+    write_test<test::x>(identity());
+    write_test<test::x>(add_pointer());
+    write_test<test::xx>(identity());
+    write_test<test::xx>(add_pointer());
 
+    read_test<test::x>(identity());
+    //read_test<test::x>(constify()); // this fails because of capture by value.
+    read_test<test::x>(add_pointer());
+    read_test<test::x>(add_const_pointer());
+    read_test<test::xx>(identity());
+    read_test<test::xx>(constify());
+    read_test<test::xx>(add_pointer());
+    read_test<test::xx>(add_const_pointer());
     return boost::report_errors();
 }