$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r82869 - in trunk: boost/coroutine/detail libs/coroutine/doc libs/coroutine/test
From: oliver.kowalke_at_[hidden]
Date: 2013-02-14 07:29:52
Author: olli
Date: 2013-02-14 07:29:51 EST (Thu, 14 Feb 2013)
New Revision: 82869
URL: http://svn.boost.org/trac/boost/changeset/82869
Log:
coroutine: fix for bug #8024 - create const_iterator from coroutine
Text files modified: 
   trunk/boost/coroutine/detail/coroutine_op.hpp |    14 ++++----                                
   trunk/libs/coroutine/doc/Jamfile.v2           |     6 ---                                     
   trunk/libs/coroutine/test/test_coroutine.cpp  |    63 +++++++++++++++++++++++++++++++++------ 
   3 files changed, 59 insertions(+), 24 deletions(-)
Modified: trunk/boost/coroutine/detail/coroutine_op.hpp
==============================================================================
--- trunk/boost/coroutine/detail/coroutine_op.hpp	(original)
+++ trunk/boost/coroutine/detail/coroutine_op.hpp	2013-02-14 07:29:51 EST (Thu, 14 Feb 2013)
@@ -123,11 +123,11 @@
         { return const_cast< optional< Result > & >( val_).get_ptr(); }
     };
 
-    class const_iterator : public std::iterator< std::input_iterator_tag, typename remove_reference< const Result >::type >
+    class const_iterator : public std::iterator< std::input_iterator_tag, const typename remove_reference< Result >::type >
     {
     private:
-        D                       *   dp_;
-        optional< const Result >    val_;
+        D                   *   dp_;
+        optional< Result >      val_;
 
         void fetch_()
         {
@@ -152,15 +152,15 @@
         }
 
     public:
-        typedef typename iterator::pointer      pointer_t;
-        typedef typename iterator::reference    reference_t;
+        typedef typename const_iterator::pointer      pointer_t;
+        typedef typename const_iterator::reference    reference_t;
 
         const_iterator() :
             dp_( 0), val_()
         {}
 
-        explicit const_iterator( D * dp) :
-            dp_( dp), val_()
+        explicit const_iterator( D const* dp) :
+            dp_( const_cast< D * >( dp) ), val_()
         { fetch_(); }
 
         const_iterator( const_iterator const& other) :
Modified: trunk/libs/coroutine/doc/Jamfile.v2
==============================================================================
--- trunk/libs/coroutine/doc/Jamfile.v2	(original)
+++ trunk/libs/coroutine/doc/Jamfile.v2	2013-02-14 07:29:51 EST (Thu, 14 Feb 2013)
@@ -9,9 +9,6 @@
 import quickbook ;
 import modules ;
 
-path-constant images_location : html ;
-path-constant here : . ;
-
 boostbook coro
     :
         coro.qbk
@@ -29,7 +26,4 @@
         <xsl:param>toc.max.depth=3
         # How far down we go with TOC's
         <xsl:param>generate.section.toc.level=10
-        <format>pdf:<xsl:param>img.src.path=$(images_location)/
     ;
-
-
Modified: trunk/libs/coroutine/test/test_coroutine.cpp
==============================================================================
--- trunk/libs/coroutine/test/test_coroutine.cpp	(original)
+++ trunk/libs/coroutine/test/test_coroutine.cpp	2013-02-14 07:29:51 EST (Thu, 14 Feb 2013)
@@ -42,6 +42,7 @@
 typedef coro::coroutine< int*(int*) > coro_ptr;
 typedef coro::coroutine< int const&(int const&) > coro_ref;
 typedef coro::coroutine< boost::tuple<int&,int&>(int&,int&) > coro_tuple;
+typedef coro::coroutine< const int *() > coro_const_int_ptr_void;
 
 struct X : private boost::noncopyable
 {
@@ -200,6 +201,12 @@
     }
 }
 
+void f19( coro_const_int_ptr_void::caller_type & self, std::vector< const int * > & vec)
+{
+    BOOST_FOREACH( const int * ptr, vec)
+    { self( ptr); }
+}
+
 void test_move()
 {
     {
@@ -410,16 +417,51 @@
 
 void test_output_iterator()
 {
-    std::vector< int > vec;
-    coro_int_void coro( f16);
-    BOOST_FOREACH( int i, coro)
-    { vec.push_back( i); }
-    BOOST_CHECK_EQUAL( ( std::size_t)5, vec.size() );
-    BOOST_CHECK_EQUAL( ( int)1, vec[0] );
-    BOOST_CHECK_EQUAL( ( int)2, vec[1] );
-    BOOST_CHECK_EQUAL( ( int)3, vec[2] );
-    BOOST_CHECK_EQUAL( ( int)4, vec[3] );
-    BOOST_CHECK_EQUAL( ( int)5, vec[4] );
+    {
+        std::vector< int > vec;
+        coro_int_void coro( f16);
+        BOOST_FOREACH( int i, coro)
+        { vec.push_back( i); }
+        BOOST_CHECK_EQUAL( ( std::size_t)5, vec.size() );
+        BOOST_CHECK_EQUAL( ( int)1, vec[0] );
+        BOOST_CHECK_EQUAL( ( int)2, vec[1] );
+        BOOST_CHECK_EQUAL( ( int)3, vec[2] );
+        BOOST_CHECK_EQUAL( ( int)4, vec[3] );
+        BOOST_CHECK_EQUAL( ( int)5, vec[4] );
+    }
+    {
+        std::vector< int > vec;
+        coro_int_void coro( f16);
+        coro_int_void::iterator e = boost::end( coro);
+        for (
+            coro_int_void::iterator i = boost::begin( coro);
+            i != e; ++i)
+        { vec.push_back( * i); }
+        BOOST_CHECK_EQUAL( ( std::size_t)5, vec.size() );
+        BOOST_CHECK_EQUAL( ( int)1, vec[0] );
+        BOOST_CHECK_EQUAL( ( int)2, vec[1] );
+        BOOST_CHECK_EQUAL( ( int)3, vec[2] );
+        BOOST_CHECK_EQUAL( ( int)4, vec[3] );
+        BOOST_CHECK_EQUAL( ( int)5, vec[4] );
+    }
+    {
+        int i1 = 1, i2 = 2, i3 = 3;
+        std::vector< const int* > vec_in;
+        vec_in.push_back( & i1);
+        vec_in.push_back( & i2);
+        vec_in.push_back( & i3);
+        std::vector< const int* > vec_out;
+        coro_const_int_ptr_void coro( boost::bind( f19, _1, boost::ref( vec_in) ) );
+        coro_const_int_ptr_void::const_iterator e = boost::const_end( coro);
+        for (
+            coro_const_int_ptr_void::const_iterator i = boost::const_begin( coro);
+            i != e; ++i)
+        { vec_out.push_back( * i); }
+        BOOST_CHECK_EQUAL( ( std::size_t)3, vec_out.size() );
+        BOOST_CHECK_EQUAL( & i1, vec_out[0] );
+        BOOST_CHECK_EQUAL( & i2, vec_out[1] );
+        BOOST_CHECK_EQUAL( & i3, vec_out[2] );
+    }
 }
 
 void test_input_iterator()
@@ -465,7 +507,6 @@
     BOOST_CHECK( ! coro);
 }
 
-
 boost::unit_test::test_suite * init_unit_test_suite( int, char* [])
 {
     boost::unit_test::test_suite * test =