$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r79451 - in trunk: boost/filesystem libs/filesystem/doc libs/filesystem/doc/src libs/filesystem/test
From: bdawes_at_[hidden]
Date: 2012-07-12 09:53:18
Author: bemandawes
Date: 2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
New Revision: 79451
URL: http://svn.boost.org/trac/boost/changeset/79451
Log:
Add BOOST_FOREACH support. Correct C++11 range-based for statement enabler signatures. Improve test coverage. Clears feature requests #5896 and #6521.
Added:
   trunk/libs/filesystem/doc/src/hoist.bat   (contents, props changed)
Text files modified: 
   trunk/boost/filesystem/operations.hpp               |    67 +++++++++++++++++++++++++++++++++++---- 
   trunk/libs/filesystem/doc/reference.html            |    49 +++++++++++++++++++---------            
   trunk/libs/filesystem/doc/release_history.html      |    12 +++++-                                  
   trunk/libs/filesystem/doc/src/build.bat             |     3 +                                       
   trunk/libs/filesystem/doc/src/source.html           |    49 +++++++++++++++++++---------            
   trunk/libs/filesystem/test/Jamfile.v2               |     2                                         
   trunk/libs/filesystem/test/operations_unit_test.cpp |    31 +++++++++++++++--                       
   7 files changed, 164 insertions(+), 49 deletions(-)
Modified: trunk/boost/filesystem/operations.hpp
==============================================================================
--- trunk/boost/filesystem/operations.hpp	(original)
+++ trunk/boost/filesystem/operations.hpp	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -33,8 +33,9 @@
 #include <boost/type_traits/is_same.hpp>
 #include <boost/iterator.hpp>
 #include <boost/cstdint.hpp>
+#include <boost/range/mutable_iterator.hpp>
+#include <boost/range/const_iterator.hpp>
 #include <boost/assert.hpp>
-
 #include <string>
 #include <utility> // for pair
 #include <ctime>
@@ -721,14 +722,37 @@
       { return m_imp == rhs.m_imp; }
   };
 
-  //  enable range-base for statement use
+  //  enable C++11 range-base for statement use  ---------------------------------------//
 
+  //  begin() and end() are only used by a range-based for statement in the context of
+  //  auto - thus the top-level const is stripped - so returning const is harmless and
+  //  emphasizes begin() is just a pass through.
   inline
-  directory_iterator& begin(directory_iterator& iter)  {return iter;}
-
+  const directory_iterator& begin(const directory_iterator& iter)  {return iter;}
   inline
   directory_iterator end(const directory_iterator&)  {return directory_iterator();}
 
+  //  enable BOOST_FOREACH  ------------------------------------------------------------//
+
+  inline
+  directory_iterator& range_begin(directory_iterator& iter) {return iter;}
+  inline
+  directory_iterator range_begin(const directory_iterator& iter) {return iter;}
+  inline
+  directory_iterator range_end(const directory_iterator&) {return directory_iterator();}
+  }  // namespace filesystem
+
+  //  namespace boost template specializations
+  template<>
+  struct range_mutable_iterator<boost::filesystem::directory_iterator>
+    { typedef boost::filesystem::directory_iterator type; };
+  template<>
+  struct range_const_iterator <boost::filesystem::directory_iterator>
+    { typedef boost::filesystem::directory_iterator type; };
+
+namespace filesystem
+{
+
 //--------------------------------------------------------------------------------------//
 //                                                                                      //
 //                      recursive_directory_iterator helpers                            //
@@ -975,14 +999,41 @@
 
   };
 
-  //  enable range-base for statement use
+  //  enable C++11 range-base for statement use  ---------------------------------------//
 
+  //  begin() and end() are only used by a range-based for statement in the context of
+  //  auto - thus the top-level const is stripped - so returning const is harmless and
+  //  emphasizes begin() is just a pass through.
   inline
-  recursive_directory_iterator& begin(recursive_directory_iterator& iter)  {return iter;}
-
+  const recursive_directory_iterator& begin(const recursive_directory_iterator& iter)
+                                                                            {return iter;}
   inline
   recursive_directory_iterator end(const recursive_directory_iterator&)
-                                                 {return recursive_directory_iterator();}
+                                                  {return recursive_directory_iterator();}
+
+  //  enable BOOST_FOREACH  ------------------------------------------------------------//
+
+  inline
+  recursive_directory_iterator& range_begin(recursive_directory_iterator& iter)
+                                                                            {return iter;}
+  inline
+  recursive_directory_iterator range_begin(const recursive_directory_iterator& iter)
+                                                                            {return iter;}
+  inline
+  recursive_directory_iterator range_end(const recursive_directory_iterator&)
+                                                  {return recursive_directory_iterator();}
+  }  // namespace filesystem
+
+  //  namespace boost template specializations
+  template<>
+  struct range_mutable_iterator<boost::filesystem::recursive_directory_iterator>
+                        { typedef boost::filesystem::recursive_directory_iterator type; };
+  template<>
+  struct range_const_iterator <boost::filesystem::recursive_directory_iterator>
+                        { typedef boost::filesystem::recursive_directory_iterator type; };
+
+namespace filesystem
+{
 
 # if !defined(BOOST_FILESYSTEM_NO_DEPRECATED)
   typedef recursive_directory_iterator wrecursive_directory_iterator;
Modified: trunk/libs/filesystem/doc/reference.html
==============================================================================
--- trunk/libs/filesystem/doc/reference.html	(original)
+++ trunk/libs/filesystem/doc/reference.html	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -134,7 +134,12 @@
 <a href="#Class-directory_iterator">Class  <code>directory_iterator</code></a><br>
     <a href="#directory_iterator-members"><code>directory_iterator</code> 
     members</a><br>
+  <code> directory_iterator</code><a href="#directory_iterator-members"> 
+    non-member functions</a><br>
 <a href="#Class-recursive_directory_iterator">Class <code>recursive_directory_iterator</code></a><br>
+    <code>  <a href="#recursive_directory_iterator-non-member-functions">
+    recursive_directory_iterator</a></code><br>
+        non-member functions<br>
     <a href="#Operational-functions">
     Operational functions</a><br>
     <code>     absolute<br>
@@ -152,11 +157,11 @@
      equivalent<br>
      file_size<br>
      hard_link_count<br>
-         initial_path<br>
-      is_directory<br>
-     is_empty</code></td>
+         initial_path</code></td>
     <td width="34%" valign="top">
-    <code>     is_other<br>
+    <code>     is_directory<br>
+     is_empty<br>
+     is_other<br>
      is_regular_file<br>
      is_symlink<br>
      last_write_time<br>
@@ -402,14 +407,26 @@
 
     class directory_iterator;
 
-    inline directory_iterator& begin(directory_iterator& iter);
-    inline directory_iterator end(const directory_iterator&);
+    // enable c++11 range-based for statements
+    const directory_iterator& begin(const directory_iterator& iter);
+    directory_iterator end(const directory_iterator&);
+
+    // enable BOOST_FOREACH
+    directory_iterator& range_begin(directory_iterator& iter);
+    directory_iterator range_begin(const directory_iterator& iter);
+    directory_iterator range_end(const directory_iterator&);
 
     class recursive_directory_iterator;
 
-    inline recursive_directory_iterator& begin(recursive_directory_iterator& iter);
-    inline recursive_directory_iterator end(const recursive_directory_iterator&);
-
+    // enable c++11 range-based for statements
+    const recursive_directory_iterator& begin(const recursive_directory_iterator& iter);
+    recursive_directory_iterator end(const recursive_directory_iterator&);
+
+    // enable BOOST_FOREACH
+    recursive_directory_iterator& range_begin(recursive_directory_iterator& iter);
+    recursive_directory_iterator range_begin(const recursive_directory_iterator& iter);
+    recursive_directory_iterator range_end(const recursive_directory_iterator&);
+ 
     enum <a name="file_type" href="#Enum-file_type">file_type</a>
     {
       status_error, file_not_found, regular_file, directory_file,
@@ -2045,12 +2062,12 @@
 <p><i>Throws:</i> As specified in Error reporting.</p>
 
 </blockquote>
-<h3><code>directory_iterator</code> non-member functions</h3>
-<pre>inline directory_iterator& begin(directory_iterator& iter);</pre>
+<h3><a name="directory_iterator-non-member-functions"><code>directory_iterator</code> non-member functions</a></h3>
+<pre>const directory_iterator& begin(const directory_iterator& iter);</pre>
 <blockquote>
   <p><i>Returns: </i><code>iter</code>.</p>
 </blockquote>
-<pre>inline directory_iterator end(const directory_iterator&);</pre>
+<pre>directory_iterator end(const directory_iterator&);</pre>
 <blockquote>
   <p><i>Returns: </i><code>directory_iterator()</code>.</p>
 </blockquote>
@@ -2191,14 +2208,14 @@
   <p>[<i>Note:</i> <code>no_push()</code> is used to prevent 
   unwanted recursion into a directory. <i>--end note</i>]</p>
 </blockquote>
-<h3><code>recursive_directory_iterator</code> non-member functions</h3>
-<pre>inline recursive_directory_iterator& begin(recursive_directory_iterator& iter);</pre>
+<h3><a name="recursive_directory_iterator-non-member-functions"><code>recursive_directory_iterator</code> non-member functions</a></h3>
+<pre>const recursive_directory_iterator& begin(const recursive_directory_iterator& iter);</pre>
 <blockquote>
   <p><i>Returns: </i><code>iter</code>.</p>
 </blockquote>
-<pre>inline recursive_directory_iterator end(const recursive_directory_iterator&);</pre>
+<pre>recursive_directory_iterator end(const recursive_directory_iterator&);</pre>
 <blockquote>
-  <p><i>Returns: </i>recursive_<code>directory_iterator()</code>.</p>
+  <p><i>Returns: </i><code>recursive_directory_iterator()</code>.</p>
 </blockquote>
 <h3><a name="Operational-functions">Operational functions</a></h3>
 <p>Operational functions query or modify files, including directories, in external 
Modified: trunk/libs/filesystem/doc/release_history.html
==============================================================================
--- trunk/libs/filesystem/doc/release_history.html	(original)
+++ trunk/libs/filesystem/doc/release_history.html	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -39,8 +39,14 @@
 <h2>1.51.0</h2>
 <ul>
   <li>Add begin() and end() non-member functions for directory_iterator and 
-  recursive_directory_iterator so that C++11 range-based for statements now 
-  work.</li>
+  recursive_directory_iterator so that C++11 range-based for statements  work. 
+  Suggested by feature requests
+  #5896 and
+  #6521, using the
+  #5896 approach.</li>
+  <li>Add range_begin() and range_end() non-member functions for directory_iterator and 
+  recursive_directory_iterator so that 
+  BOOST_FOREACH works.</li>
 </ul>
 
 <h2>1.50.0</h2>
@@ -170,7 +176,7 @@
 </ul>
 <hr>
 <p>Revised
-<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->10 July, 2012<!--webbot bot="Timestamp" endspan i-checksum="21085" --></p>
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->12 July, 2012<!--webbot bot="Timestamp" endspan i-checksum="21089" --></p>
 <p>© Copyright Beman Dawes, 2011</p>
 <p> Use, modification, and distribution are subject to the Boost Software 
 License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt">
Modified: trunk/libs/filesystem/doc/src/build.bat
==============================================================================
--- trunk/libs/filesystem/doc/src/build.bat	(original)
+++ trunk/libs/filesystem/doc/src/build.bat	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -1,5 +1,8 @@
 @echo off
+rem Copyright Beman Dawes 2012
+rem Distributed under the Boost Software License, Version 1.0.
 del tr2.html 2>nul
 mmp TARGET=TR2 source.html tr2.html
 del reference.html 2>nul
 mmp TARGET=BOOST source.html reference.html
+echo run "hoist" to hoist reference.html to doc directory
Added: trunk/libs/filesystem/doc/src/hoist.bat
==============================================================================
--- (empty file)
+++ trunk/libs/filesystem/doc/src/hoist.bat	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -0,0 +1,5 @@
+@echo off
+rem Copyright Beman Dawes 2012
+rem Distributed under the Boost Software License, Version 1.0.
+copy /y reference.html ..
+echo reference.html copied to ..
Modified: trunk/libs/filesystem/doc/src/source.html
==============================================================================
--- trunk/libs/filesystem/doc/src/source.html	(original)
+++ trunk/libs/filesystem/doc/src/source.html	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -103,7 +103,12 @@
 <a href="#Class-directory_iterator">Class  <code>directory_iterator</code></a><br>
     <a href="#directory_iterator-members"><code>directory_iterator</code> 
     members</a><br>
+  <code> directory_iterator</code><a href="#directory_iterator-members"> 
+    non-member functions</a><br>
 <a href="#Class-recursive_directory_iterator">Class <code>recursive_directory_iterator</code></a><br>
+    <code>  <a href="#recursive_directory_iterator-non-member-functions">
+    recursive_directory_iterator</a></code><br>
+        non-member functions<br>
     <a href="#Operational-functions">
     Operational functions</a><br>
     <code>     absolute<br>
@@ -121,11 +126,11 @@
      equivalent<br>
      file_size<br>
      hard_link_count<br>
-         initial_path<br>
-      is_directory<br>
-     is_empty</code></td>
+         initial_path</code></td>
     <td width="34%" valign="top">
-    <code>     is_other<br>
+    <code>     is_directory<br>
+     is_empty<br>
+     is_other<br>
      is_regular_file<br>
      is_symlink<br>
      last_write_time<br>
@@ -364,14 +369,26 @@
 
     class directory_iterator;
 
-    inline directory_iterator& begin(directory_iterator& iter);
-    inline directory_iterator end(const directory_iterator&);
+    // enable c++11 range-based for statements
+    const directory_iterator& begin(const directory_iterator& iter);
+    directory_iterator end(const directory_iterator&);
+
+    // enable BOOST_FOREACH
+    directory_iterator& range_begin(directory_iterator& iter);
+    directory_iterator range_begin(const directory_iterator& iter);
+    directory_iterator range_end(const directory_iterator&);
 
     class recursive_directory_iterator;
 
-    inline recursive_directory_iterator& begin(recursive_directory_iterator& iter);
-    inline recursive_directory_iterator end(const recursive_directory_iterator&);
-
+    // enable c++11 range-based for statements
+    const recursive_directory_iterator& begin(const recursive_directory_iterator& iter);
+    recursive_directory_iterator end(const recursive_directory_iterator&);
+
+    // enable BOOST_FOREACH
+    recursive_directory_iterator& range_begin(recursive_directory_iterator& iter);
+    recursive_directory_iterator range_begin(const recursive_directory_iterator& iter);
+    recursive_directory_iterator range_end(const recursive_directory_iterator&);
+ 
     enum <a name="file_type" href="#Enum-file_type">file_type</a>
     {
       status_error, file_not_found, regular_file, directory_file,
@@ -1989,12 +2006,12 @@
 <p><i>Throws:</i> As specified in Error reporting.</p>
 
 </blockquote>
-<h3><code>directory_iterator</code> non-member functions</h3>
-<pre>inline directory_iterator& begin(directory_iterator& iter);</pre>
+<h3><a name="directory_iterator-non-member-functions"><code>directory_iterator</code> non-member functions</a></h3>
+<pre>const directory_iterator& begin(const directory_iterator& iter);</pre>
 <blockquote>
   <p><i>Returns: </i><code>iter</code>.</p>
 </blockquote>
-<pre>inline directory_iterator end(const directory_iterator&);</pre>
+<pre>directory_iterator end(const directory_iterator&);</pre>
 <blockquote>
   <p><i>Returns: </i><code>directory_iterator()</code>.</p>
 </blockquote>
@@ -2131,14 +2148,14 @@
   <p>[<i>Note:</i> <code>no_push()</code> is used to prevent 
   unwanted recursion into a directory. <i>--end note</i>]</p>
 </blockquote>
-<h3><code>recursive_directory_iterator</code> non-member functions</h3>
-<pre>inline recursive_directory_iterator& begin(recursive_directory_iterator& iter);</pre>
+<h3><a name="recursive_directory_iterator-non-member-functions"><code>recursive_directory_iterator</code> non-member functions</a></h3>
+<pre>const recursive_directory_iterator& begin(const recursive_directory_iterator& iter);</pre>
 <blockquote>
   <p><i>Returns: </i><code>iter</code>.</p>
 </blockquote>
-<pre>inline recursive_directory_iterator end(const recursive_directory_iterator&);</pre>
+<pre>recursive_directory_iterator end(const recursive_directory_iterator&);</pre>
 <blockquote>
-  <p><i>Returns: </i>recursive_<code>directory_iterator()</code>.</p>
+  <p><i>Returns: </i><code>recursive_directory_iterator()</code>.</p>
 </blockquote>
 <h3><a name="Operational-functions">Operational functions</a></h3>
 <p>Operational functions query or modify files, including directories, in external 
Modified: trunk/libs/filesystem/test/Jamfile.v2
==============================================================================
--- trunk/libs/filesystem/test/Jamfile.v2	(original)
+++ trunk/libs/filesystem/test/Jamfile.v2	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -24,7 +24,7 @@
        [ run locale_info.cpp  : : : <test-info>always_show_run_output ]
        [ run operations_test.cpp :  :  : <link>shared <test-info>always_show_run_output ]
        [ run operations_test.cpp :  :  : <link>static : operations_test_static ]
-       [ run operations_unit_test.cpp :  :  : <link>shared ]
+       [ run operations_unit_test.cpp :  :  : <link>shared <test-info>always_show_run_output ]
        [ run path_test.cpp :  :  : <link>shared ]                  
        [ run path_test.cpp :  :  : <link>static : path_test_static ]                  
        [ run path_unit_test.cpp :  :  : <link>shared ]                  
Modified: trunk/libs/filesystem/test/operations_unit_test.cpp
==============================================================================
--- trunk/libs/filesystem/test/operations_unit_test.cpp	(original)
+++ trunk/libs/filesystem/test/operations_unit_test.cpp	2012-07-12 09:53:17 EDT (Thu, 12 Jul 2012)
@@ -155,14 +155,22 @@
 #ifndef BOOST_NO_CXX11_RANGE_BASED_FOR
     for (directory_entry& x : directory_iterator("."))
     {
+      CHECK(!x.path().empty());
        //cout << "  " << x.path() << "\n";
     }
+    const directory_iterator dir_itr(".");
+    for (directory_entry& x : dir_itr)
+    {
+      CHECK(!x.path().empty());
+      //cout << "  " << x.path() << "\n";
+    }
 #endif
 
-    //BOOST_FOREACH(directory_entry& x, directory_iterator("."))
-    //{
-    //  cout << "  " << x.path() << "\n";
-    //}
+    BOOST_FOREACH(directory_entry& x, directory_iterator("."))
+    {
+      CHECK(!x.path().empty());
+      //cout << "  " << x.path() << "\n";
+    }
 
     cout << "directory_iterator_test complete" << endl;
   }
@@ -208,10 +216,23 @@
 #ifndef BOOST_NO_CXX11_RANGE_BASED_FOR
     for (directory_entry& x : recursive_directory_iterator(".."))
     {
-       cout << "  " << x.path() << "\n";
+      CHECK(!x.path().empty());
+      //cout << "  " << x.path() << "\n";
+    }
+    const recursive_directory_iterator dir_itr("..");
+    for (directory_entry& x : dir_itr)
+    {
+      CHECK(!x.path().empty());
+      //cout << "  " << x.path() << "\n";
     }
 #endif
 
+    BOOST_FOREACH(directory_entry& x, recursive_directory_iterator(".."))
+    {
+      CHECK(!x.path().empty());
+      //cout << "  " << x.path() << "\n";
+    }
+
     cout << "recursive_directory_iterator_test complete" << endl;
   }