$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r55979 - in sandbox/filesystem-v3: boost/filesystem libs/filesystem/doc libs/filesystem/src libs/filesystem/test libs/filesystem/test/msvc
From: bdawes_at_[hidden]
Date: 2009-09-02 14:29:40
Author: bemandawes
Date: 2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
New Revision: 55979
URL: http://svn.boost.org/trac/boost/changeset/55979
Log:
Apply all current fixes from trunk. Clear out more BOOST_FILESYSTEM_NARROW_ONLY #ifdef's. Refine path append semantics, tests, refactor implementation. More support for deprecated features. Retest on Linux.
Text files modified: 
   sandbox/filesystem-v3/boost/filesystem/config.hpp                         |    23 ++--                                    
   sandbox/filesystem-v3/boost/filesystem/operations.hpp                     |    66 ++++++------                            
   sandbox/filesystem-v3/boost/filesystem/path.hpp                           |   126 ++++++++++++++++--------                
   sandbox/filesystem-v3/boost/filesystem/path_traits.hpp                    |    22 +++                                     
   sandbox/filesystem-v3/libs/filesystem/doc/index.htm                       |    11 -                                       
   sandbox/filesystem-v3/libs/filesystem/doc/reference.html                  |   205 ++++++++++++++++++++++++++------------- 
   sandbox/filesystem-v3/libs/filesystem/src/operations.cpp                  |    72 +++++++------                           
   sandbox/filesystem-v3/libs/filesystem/src/path.cpp                        |    40 ++++++-                                 
   sandbox/filesystem-v3/libs/filesystem/src/portability.cpp                 |     4                                         
   sandbox/filesystem-v3/libs/filesystem/test/convenience_test.cpp           |     6 -                                       
   sandbox/filesystem-v3/libs/filesystem/test/deprecated_test.cpp            |    38 ++++++-                                 
   sandbox/filesystem-v3/libs/filesystem/test/msvc/filesystem-v3-sandbox.sln |    14 ++                                      
   sandbox/filesystem-v3/libs/filesystem/test/operations_test.cpp            |    23 ++++                                    
   sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp                  |   183 ++++++++++++++++++++++++-----------     
   sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp             |    23 ++--                                    
   15 files changed, 570 insertions(+), 286 deletions(-)
Modified: sandbox/filesystem-v3/boost/filesystem/config.hpp
==============================================================================
--- sandbox/filesystem-v3/boost/filesystem/config.hpp	(original)
+++ sandbox/filesystem-v3/boost/filesystem/config.hpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -25,6 +25,12 @@
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp> 
 
+//  BOOST_FILESYSTEM_DEPRECATED needed for source compiles -----------------------------//
+
+# ifdef BOOST_FILESYSTEM_SOURCE
+#   define BOOST_FILESYSTEM_DEPRECATED
+# endif
+
 //  determine platform  ----------------------------------------------------------------//
 
 //  BOOST_POSIX_API or BOOST_WINDOWS_API specify which API to use
@@ -32,15 +38,15 @@
 # if defined( BOOST_WINDOWS_API ) && defined( BOOST_POSIX_API )
 #   error both BOOST_WINDOWS_API and BOOST_POSIX_API are defined
 # elif !defined( BOOST_WINDOWS_API ) && !defined( BOOST_POSIX_API )
-#   if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && !defined(BOOST_NO_STD_WSTRING)
+#   if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
 #     define BOOST_WINDOWS_API
 #   else
 #     define BOOST_POSIX_API 
 #   endif
 # endif
 
-# if defined( BOOST_WINDOWS_API ) && defined( BOOST_NO_STD_WSTRING )
-#   error BOOST_WINDOWS_API can not be used when BOOST_NO_STD_WSTRING is defined
+# if defined( BOOST_NO_STD_WSTRING )
+#   error Boost.Filesystem V3 and later requires std::wstring support
 # endif
 
 //  BOOST_WINDOWS_PATH enables Windows path syntax recognition
@@ -49,19 +55,14 @@
 //  that isn't possible for v3 because BOOST_WINDOWS_PATH requires wstring support
 
 # if !defined(BOOST_POSIX_PATH) && (defined(_WIN32) || defined(__WIN32__) || defined(WIN32) \
-  || (defined(__CYGWIN__) && !defined(BOOST_NO_STD_WSTRING)))
+  || defined(__CYGWIN__))
 #   define BOOST_WINDOWS_PATH
 # endif
 
-//  narrow support only for badly broken compilers or libraries  -----------------------//
-
-# if defined(BOOST_NO_STD_WSTRING) || defined(BOOST_NO_SFINAE) || defined(BOOST_NO_STD_LOCALE) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
-#   define BOOST_FILESYSTEM_NARROW_ONLY
-# endif
-
 //  enable dynamic linking on Windows  -------------------------------------------------//
 
-#  if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)) && defined(__BORLANDC__) && defined(__WIN32__)
+#  if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)) \
+  && BOOST_WORKAROUND(__BORLANDC__, <0x610) && defined(__WIN32__)
 #    error Dynamic linking Boost.Filesystem does not work for Borland; use static linking instead
 #  endif
 
Modified: sandbox/filesystem-v3/boost/filesystem/operations.hpp
==============================================================================
--- sandbox/filesystem-v3/boost/filesystem/operations.hpp	(original)
+++ sandbox/filesystem-v3/boost/filesystem/operations.hpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -18,7 +18,6 @@
 *  Scoped enum workaround for file_type.
 *  Enable all BOOST_FILESYSTEM_NO_DEPRECATED code.
 *  Vista symlink_status support.
-*  Merge fixes from trunk
 *  rename and remove really need to be renamed. If users says "using namespace boost::filesystem"
    and some header included stdio, there is just too much chance of silent error.
 *  create_directories error handling.
@@ -37,6 +36,7 @@
 
 #include <boost/filesystem/path.hpp>
 
+#include <boost/detail/scoped_enum_emulation.hpp>
 #include <boost/system/error_code.hpp>
 #include <boost/system/system_error.hpp>
 #include <boost/shared_ptr.hpp>
@@ -109,11 +109,13 @@
   };
 
   inline bool status_known( file_status f ) { return f.type() != status_unknown; }
-  inline bool exists( file_status f )       { return f.type() != status_unknown && f.type() != file_not_found; }
+  inline bool exists( file_status f )       { return f.type() != status_unknown
+                                                && f.type() != file_not_found; }
   inline bool is_regular_file(file_status f){ return f.type() == regular_file; }
   inline bool is_directory( file_status f ) { return f.type() == directory_file; }
   inline bool is_symlink( file_status f )   { return f.type() == symlink_file; }
-  inline bool is_other( file_status f )     { return exists(f) && !is_regular_file(f) && !is_directory(f) && !is_symlink(f); }
+  inline bool is_other( file_status f )     { return exists(f) && !is_regular_file(f)
+                                                && !is_directory(f) && !is_symlink(f); }
 
 # ifndef BOOST_FILESYSTEM_NO_DEPRECATED
   inline bool is_regular( file_status f )   { return f.type() == regular_file; }
@@ -141,34 +143,21 @@
   file_status symlink_status( const path & p,
                       system::error_code & ec = throws() );
     
-  inline bool exists( const path & p, system::error_code & ec = throws() ) { return exists( status( p, ec ) ); }
-  inline bool is_directory( const path & p, system::error_code & ec = throws() )  { return is_directory( status( p, ec ) ); }
-  inline bool is_regular_file( const path & p, system::error_code & ec = throws() )  { return is_regular_file( status( p, ec ) ); }
-  inline bool is_other( const path & p, system::error_code & ec = throws() ) { return is_other( status( p, ec ) ); }
-  inline bool is_symlink( const path & p, system::error_code & ec = throws() ) { return is_symlink( symlink_status( p, ec ) ); }
+  inline bool exists( const path & p, system::error_code & ec = throws() )
+    { return exists( status( p, ec ) ); }
+  inline bool is_directory( const path & p, system::error_code & ec = throws() )
+    { return is_directory( status( p, ec ) ); }
+  inline bool is_regular_file( const path & p, system::error_code & ec = throws() )
+    { return is_regular_file( status( p, ec ) ); }
+  inline bool is_other( const path & p, system::error_code & ec = throws() )
+    { return is_other( status( p, ec ) ); }
+  inline bool is_symlink( const path & p, system::error_code & ec = throws() )
+    { return is_symlink( symlink_status( p, ec ) ); }
 
-#   ifndef BOOST_FILESYSTEM_NO_DEPRECATED
-  inline bool is_regular( const path & p, system::error_code & ec = throws() ) { return is_regular( status( p, ec ) ); }
-#   endif
-
-
-//    // VC++ 7.0 and earlier has a serious namespace bug that causes a clash
-//    // between boost::filesystem::is_empty and the unrelated type trait
-//    // boost::is_empty.
-//
-//# if !defined( BOOST_MSVC ) || BOOST_MSVC > 1300
-//    BOOST_FS_FUNC(bool) is_empty( const Path & ph )
-//# else
-//    BOOST_FS_FUNC(bool) _is_empty( const Path & ph )
-//# endif
-//    {
-//      detail::query_pair result(
-//        detail::is_empty_api( ph.external_file_string() ) );
-//      if ( result.first )
-//        boost::throw_exception( basic_filesystem_error<Path>(
-//          "boost::filesystem::is_empty", ph, result.first ) );
-//      return result.second;
-//    }
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+  inline bool is_regular( const path & p, system::error_code & ec = throws() )
+    { return is_regular( status( p, ec ) ); }
+# endif
 
   BOOST_FILESYSTEM_DECL
   bool is_empty( const path & p, system::error_code & ec = throws() );
@@ -199,10 +188,20 @@
   void copy_directory( const path & from, const path & to,
                        system::error_code & ec = throws() );
 
+  BOOST_SCOPED_ENUM_START(copy_option)
+    { fail_if_exists, overwrite_if_exists };
+  BOOST_SCOPED_ENUM_END
+
   BOOST_FILESYSTEM_DECL
   void copy_file( const path & from, const path & to,
+                  BOOST_SCOPED_ENUM(copy_option) option,  // See ticket #2925
                   system::error_code & ec = throws() );
 
+  inline
+  void copy_file( const path & from, const path & to,
+                  system::error_code & ec = throws() )
+    { copy_file( from, to, copy_option::fail_if_exists, ec ); }
+
   BOOST_FILESYSTEM_DECL
   void copy_symlink( const path & from, const path & to,
                      system::error_code & ec = throws() );
@@ -270,6 +269,11 @@
   BOOST_FILESYSTEM_DECL
   space_info space( const path & p, system::error_code & ec = throws() ); 
 
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    inline bool symbolic_link_exists( const path & ph )
+      { return is_symlink( symlink_status(ph) ); }
+# endif
+
   BOOST_FILESYSTEM_DECL
   path system_complete( const path & p, system::error_code & ec = throws() ); 
 
@@ -319,7 +323,7 @@
   file_status   symlink_status( system::error_code & ec = throws() ) const;
 
   //// conversion simplifies the most common use of directory_entry
-  // Removed; poor design + too likely to conflict with path v3 constructor templates
+  // Removed; poor design and too likely to conflict with path v3 constructor templates
   //operator const boost::filesystem::path &() const { return m_path; }
 
 //#   ifndef BOOST_FILESYSTEM_NO_DEPRECATED
Modified: sandbox/filesystem-v3/boost/filesystem/path.hpp
==============================================================================
--- sandbox/filesystem-v3/boost/filesystem/path.hpp	(original)
+++ sandbox/filesystem-v3/boost/filesystem/path.hpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -25,22 +25,16 @@
      reference.html#Path-decomposition-table needs rows for //, //netname, //netname/foo
      Make sure current trunk has passing tests for those cases, all decompositions.
      See test_decompositions() in path_unit_test.cpp
-   * Get the deprecated names working.
    * Document leading //: no longer treated specially.
    * Document behavior of path::replace_extension has change WRT argument w/o a dot.
-   * reference.html: operator /= is underspecified as to when a "/" is appended, and
-     whether a '/' or '\' is appended.
    * Provide the name check functions for more character types? Templatize?
-   * Why do preferred() and generic() return paths rather than const strings/string refs?
-     Either change or document rationale.
    * Use BOOST_DELETED, BOOST_DEFAULTED, where appropriate.
    * Add test for scoped_path_locale.
+   * Add codepage 936/950/etc test cases.
      
                          Design Questions
 
 
-   * Should path_locale use thread local storage?
-   * Will locale overloads be needed in practice?
    * Is it OK for single-element decomposition functions to return paths? Yes;
      keep the interface simple and usable in generic code at the expense of some
      notational convenience.
@@ -52,7 +46,6 @@
      No. KISS. basic_string<char> is special because it is the predominent
      use case. w (and other) flavors can be added later.
    * Should UDT's be supported? Yes. Easy to do and pretty harmless.
-   * Remove all support for environments that don't support wstring.
    * Should path iteration to a separator result in:
        -- the actual separator used
        -- the preferred separator
@@ -68,10 +61,8 @@
 #include <boost/system/error_code.hpp>
 #include <boost/system/system_error.hpp>
 #include <boost/iterator/iterator_facade.hpp>
-//#include <boost/utility/enable_if.hpp>
 #include <boost/throw_exception.hpp>
 #include <boost/shared_ptr.hpp>
-//#include <boost/type_traits/is_same.hpp>
 #include <boost/static_assert.hpp>
 #include <string>
 #include <cstring>
@@ -147,13 +138,10 @@
 
 # ifdef BOOST_WINDOWS_API
     typedef wchar_t                        value_type;
-    static const wchar_t preferred_separator = L'\\';
 # else 
     typedef char                           value_type;
-    static const char preferred_separator = '/';
 # endif
     typedef std::basic_string<value_type>  string_type;  
-    typedef string_type::size_type         size_type;
     typedef path_traits::codecvt_type      codecvt_type;
 
     //  ----- character encoding conversions -----
@@ -271,30 +259,13 @@
     //  if a separator is added, it is the preferred separator for the platform;
     //  slash for POSIX, backslash for Windows
 
-    path & operator/=( const path & p )
-    {
-      m_append_separator_if_needed();
-      m_path += p.m_path;
-      return *this;
-    }
+    path & operator/=( const path & p );
 
     template <class ContiguousIterator>
-    path & append( ContiguousIterator begin, ContiguousIterator end )
-    { 
-      m_append_separator_if_needed();
-      if ( begin != end )
-        path_traits::convert( &*begin, &*begin+std::distance(begin, end),
-          m_path, codecvt() );
-      return *this;
-    }
+    path & append( ContiguousIterator begin, ContiguousIterator end );
 
     template <class PathSource>
-    path & operator/=( PathSource const & range )
-    {
-      m_append_separator_if_needed();
-      path_traits::dispatch( range, m_path, codecvt() );
-      return *this;
-    }
+    path & operator/=( PathSource const & range );
 
     //  -----  modifiers  -----
 
@@ -305,18 +276,14 @@
 
 #   ifdef BOOST_WINDOWS_API
 
-    path & path::localize();  // change slash to backslash
+    path & localize();  // change slash to backslash
 
 #   else // BOOST_POSIX_API
 
-    path & path::localize() { return *this; }  // POSIX m_path already localized
+    path & localize() { return *this; }  // POSIX m_path already localized
 
 #   endif
 
-//# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
-//    path &  normalize()         { return m_normalize(); }
-//# endif
-
     //  -----  observers  -----
   
     //  For operating systems that format file paths differently than directory
@@ -379,7 +346,7 @@
 #   else // BOOST_POSIX_API
 
     const std::string &  string() const  { return m_path; }
-    const std::wstring   wstring() const;
+    const std::wstring   wstring() const { return native_wstring(); }
 
 #   endif
 
@@ -432,6 +399,43 @@
     iterator begin() const;
     iterator end() const;
 
+    //  -----  deprecated functions  -----
+
+# if defined(BOOST_FILESYSTEM_DEPRECATED) && defined(BOOST_FILESYSTEM_NO_DEPRECATED)
+#   error both BOOST_FILESYSTEM_DEPRECATED and BOOST_FILESYSTEM_NO_DEPRECATED are defined
+# endif
+
+# if !defined(BOOST_FILESYSTEM_NO_DEPRECATED)
+    //  recently deprecated functions supplied by default
+    path &  remove_leaf()            { return remove_filename(); }
+    path    leaf() const             { return filename(); }
+    path    branch_path() const      { return parent_path(); }
+    bool    has_leaf() const         { return !m_path.empty(); }
+    bool    has_branch_path() const  { return !parent_path().empty(); }
+# endif
+
+# if defined(BOOST_FILESYSTEM_DEPRECATED)
+    //  deprecated functions with enough signature or semantic changes that they are
+    //  not supplied by default 
+    const std::string file_string() const               { return native_string(); }
+    const std::string directory_string() const          { return native_string(); }
+    const std::string native_file_string() const        { return native_string(); }
+    const std::string native_directory_string() const   { return native_string(); }
+    const string_type external_file_string() const      { return native(); }
+    const string_type external_directory_string() const { return native(); }
+
+    //  older functions no longer supported
+    //typedef bool (*name_check)( const std::string & name );
+    //basic_path( const string_type & str, name_check ) { operator/=( str ); }
+    //basic_path( const typename string_type::value_type * s, name_check )
+    //  { operator/=( s );}
+    //static bool default_name_check_writable() { return false; } 
+    //static void default_name_check( name_check ) {}
+    //static name_check default_name_check() { return 0; }
+    //basic_path & canonize();
+    //basic_path & normalize();
+# endif
+
 //--------------------------------------------------------------------------------------//
 //                            class path private members                                //
 //--------------------------------------------------------------------------------------//
@@ -448,7 +452,12 @@
     string_type  m_path;  // Windows: as input; backslashes NOT converted to slashes,
                           // slashes NOT converted to backslashes
 
-    void m_append_separator_if_needed();
+    string_type::size_type m_append_separator_if_needed();
+    //  Returns: If separator is to be appended, m_path.size() before append. Otherwise 0.
+    //  Note: An append is never performed if size()==0, so a returned 0 is unambiguous.
+
+    void m_erase_redundant_separator( string_type::size_type sep_pos );
+    
     void m_portable();
 
     //path &  m_normalize();
@@ -469,6 +478,10 @@
 
   };  // class path
 
+# if defined(BOOST_FILESYSTEM_DEPRECATED)
+  typedef path wpath;
+# endif
+
   //------------------------------------------------------------------------------------//
   //                             class path::iterator                                   //
   //------------------------------------------------------------------------------------//
@@ -619,6 +632,37 @@
   BOOST_FILESYSTEM_DECL bool portable_directory_name( const std::string & name );
   BOOST_FILESYSTEM_DECL bool portable_file_name( const std::string & name );
   BOOST_FILESYSTEM_DECL bool native( const std::string & name );
+ 
+//--------------------------------------------------------------------------------------//
+//                     class path member template implementation                        //
+//--------------------------------------------------------------------------------------//
+
+  template <class ContiguousIterator>
+  path & path::append( ContiguousIterator begin, ContiguousIterator end )
+  { 
+    if ( begin == end )
+      return *this;
+    string_type::size_type sep_pos( m_append_separator_if_needed() );
+    if ( begin != end )
+      path_traits::convert( &*begin, &*begin+std::distance(begin, end),
+        m_path, codecvt() );
+    if ( sep_pos )
+      m_erase_redundant_separator( sep_pos );
+    return *this;
+  }
+
+  template <class PathSource>
+  path & path::operator/=( PathSource const & range )
+  {
+    if ( path_traits::empty( range ) )
+      return *this;
+    string_type::size_type sep_pos( m_append_separator_if_needed() );
+    path_traits::dispatch( range, m_path, codecvt() );
+    if ( sep_pos )
+      m_erase_redundant_separator( sep_pos );
+    return *this;
+  }
+
 
 }  // namespace filesystem
 }  // namespace boost
Modified: sandbox/filesystem-v3/boost/filesystem/path_traits.hpp
==============================================================================
--- sandbox/filesystem-v3/boost/filesystem/path_traits.hpp	(original)
+++ sandbox/filesystem-v3/boost/filesystem/path_traits.hpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -64,7 +64,24 @@
  
   typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type;
 
-  //  Pathable dispatchers
+  //  Pathable empty
+
+  template <class Container> inline
+    bool empty( const Container & c )
+      { return c.begin() == c.end(); }
+
+  template <class T> inline
+    bool empty( T * const & c_str )
+  {
+    BOOST_ASSERT( c_str );
+    return !*c_str;
+  }
+
+  template <typename T, size_t N> inline
+     bool empty( T (&array)[N] )
+       { return N <= 1; }
+
+  //  Pathable dispatch
 
   template <class Container, class U> inline
   void dispatch( const Container & c, U & to, const codecvt_type & cvt )
@@ -77,7 +94,8 @@
   template <class T, class U> inline
   void dispatch( T * const & c_str, U & to, const codecvt_type & cvt )
   {
-//    std::cout << "dispatch() const T *\n"; 
+//    std::cout << "dispatch() const T *\n";
+    BOOST_ASSERT( c_str );
     convert( c_str, to, cvt );
   }
   
Modified: sandbox/filesystem-v3/libs/filesystem/doc/index.htm
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/doc/index.htm	(original)
+++ sandbox/filesystem-v3/libs/filesystem/doc/index.htm	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -337,22 +337,17 @@
     <td valign="top"><code>BOOST_FILESYSTEM_DYN_LINK</code></td>
     <td valign="top">Defined if <code>BOOST_ALL_DYN_LINK</code> is defined, 
     otherwise not defined.</td>
-    <td valign="top">Boost.System library is dynamically linked. If not defined, 
+    <td valign="top">The Boost.Filesystem library is dynamically linked. If not defined, 
     static linking is assumed.</td>
   </tr>
   <tr>
     <td valign="top"><code>BOOST_FILESYSTEM_NO_LIB</code></td>
     <td valign="top">Defined if <code>BOOST_ALL_NO_LIB</code> is defined, 
     otherwise not defined.</td>
-    <td valign="top">Boost.System library does not use the Boost auto-link 
+    <td valign="top">Boost.Filesystem library does not use the Boost auto-link 
     facility.</td>
   </tr>
   <tr>
-    <td valign="top"><code>BOOST_FILESYSTEM_NARROW_ONLY</code></td>
-    <td valign="top">Not defined.</td>
-    <td valign="top">Removes features that require wchar_t support.</td>
-  </tr>
-  <tr>
     <td valign="top"><code>BOOST_FILESYSTEM_NO_DEPRECATED</code></td>
     <td valign="top">Not defined.</td>
     <td valign="top">Deprecated features are excluded.</td>
@@ -804,7 +799,7 @@
 
 <hr>
 <p>Revised
-<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->28 October, 2008<!--webbot bot="Timestamp" endspan i-checksum="39203" --></p>
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->01 September, 2009<!--webbot bot="Timestamp" endspan i-checksum="39345" --></p>
 
 <p>© Copyright Beman Dawes, 2002-2005</p>
 <p> Use, modification, and distribution are subject to the Boost Software 
Modified: sandbox/filesystem-v3/libs/filesystem/doc/reference.html
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/doc/reference.html	(original)
+++ sandbox/filesystem-v3/libs/filesystem/doc/reference.html	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -48,7 +48,7 @@
     Header <filesystem> synopsis</a><br>
     <a href="#Path-traits">Path traits</a><br>
     <a href="#Class-template-path">
-    Class template path</a><br>
+    Class path</a><br>
        
 <a href="#Pathname-formats">Pathname formats</a><br>
        
@@ -57,7 +57,7 @@
 <a href="#Input-conversion">Filename conversion</a><br>
        
 <a href="#path-requirements">Requirements</a> </td>
-    <td width="35%" valign="top"> Class template path (continued)<br>
+    <td width="35%" valign="top"> Class  path (continued)<br>
            
 <a href="#path-requirements">path constructors</a><br>
            
@@ -71,6 +71,8 @@
            
 <a href="#path-iterators">path iterators</a><br>
            
+    path deprecated functions<br>
+           
 <a href="#path-non-member-functions">path non-member functions</a><br>
            
 <a href="#path-inserter-extractor">path inserter and extractor</a><span style="background-color: #FFFFFF"><br>
@@ -343,12 +345,19 @@
         uintmax_t free;
         uintmax_t available;
       };
-</span>
-      //  status functions
-      file_status status(const path& p);
-      file_status status(const path& p, error_code& ec);
-      file_status symlink_status(const path& p);
-      file_status symlink_status(const path& p, error_code& ec);
+
+      BOOST_SCOPED_ENUM_START(<a name="copy_option">copy_option</a>)
+      {
+        fail_if_exists,
+        overwrite_if_exists
+      };
+      BOOST_SCOPED_ENUM_END
+
+</span>      //  status functions
+      file_status status(const path& p,
+                         system::error_code & ec = throws());
+      file_status symlink_status(const path& p,
+                                 system::error_code & ec = throws());
 
       //  predicate functions
       bool status_known( file_status s ); 
@@ -358,34 +367,56 @@
       bool is_symlink( file_status s );
       bool is_other( file_status s );
 
-      bool exists(const path& p);
-      bool is_directory(const path& p);
-      bool is_regular_file(const path& p);
-      bool is_other(const path& p);
-      bool is_symlink(const path& p);
-      bool is_empty(const path& p);
+      bool exists(const path& p,
+                  system::error_code & ec = throws());
+      bool is_directory(const path& p,
+                        system::error_code & ec = throws());
+      bool is_regular_file(const path& p,
+                           system::error_code & ec = throws());
+      bool is_other(const path& p,
+                    system::error_code & ec = throws());
+      bool is_symlink(const path& p,
+                      system::error_code & ec = throws());
+      bool is_empty(const path& p,
+                    system::error_code & ec = throws());
 
-      bool equivalent(const path& p1, const path& p2);
+      bool equivalent(const path& p1, const path& p2, system::error_code & ec = throws());
 
       //  attribute functions
-      path current_path();
-      void current_path(const path& p);
-      const path& initial_path();
-      <span style="background-color: #FFFFFF; ">uintmax_t</span> file_size(const path& p);
-<span style="background-color: #FFFFFF">      space_info space(const path& p);</span><span style="background-color: #FFFF00">
-</span>      std::time_t last_write_time(const path& p);
-      void last_write_time(const path& p, const std::time_t new_time);
+      path         current_path(system::error_code & ec = throws());
+      void         current_path(const path& p,
+                                system::error_code & ec = throws());
+      const path&  initial_path(system::error_code & ec = throws());
+      <span style="background-color: #FFFFFF; ">uintmax_t</span>    file_size(const path& p,
+                             system::error_code & ec = throws());
+<span style="background-color: #FFFFFF">      space_info   space(const path& p</span>,
+                         system::error_code & ec = throws()<span style="background-color: #FFFFFF">);</span><span style="background-color: #FFFF00">
+</span>      std::time_t  last_write_time(const path& p,
+                                   system::error_code & ec = throws());
+      void         last_write_time(const path& p, const std::time_t new_time,
+                                   system::error_code & ec = throws());
 
       //  operations functions
-      bool create_directory(const path& p);
-      void create_hard_link(const path& old, const path& new_link);
-<span style="background-color: #FFFFFF">      void create_symlink(const path& old, const path& new_link);
-</span>      bool remove_path(const path& p);
-      void rename_path(const path& old, const path& new_p);
-      void copy_file(const path& from, const path& to);
-      path system_complete(const path& p);
-      path complete(const path& p, const path base=initial_path());
-
+      bool create_directory(const path& p,
+                            system::error_code & ec = throws());
+      void create_hard_link(const path& old, const path& new_link,
+                            system::error_code & ec = throws());
+<span style="background-color: #FFFFFF">      void create_symlink(const path& old, const path& new_link</span>,
+                          system::error_code & ec = throws()<span style="background-color: #FFFFFF">);
+</span>      bool <span style="background-color: #FFFF00">remove_path</span>(const path& p,
+                       system::error_code & ec = throws());
+      void <span style="background-color: #FFFF00">rename_path</span>(const path& old, const path& new_p,
+                       system::error_code & ec = throws());
+      void copy_file( const path & from, const path & to,
+                      BOOST_SCOPED_ENUM(copy_option) option,
+                      system::error_code & ec = throws() );
+      void copy_file( const path & from, const path & to,
+                      system::error_code & ec = throws() )
+      path system_complete(const path& p,
+                           system::error_code & ec = throws());
+<span style="background-color: #FFFF00">      path </span><span style="background-color: #FFFF00">complete(const</span><span style="background-color: #FFFF00"> path& p,
+                    const path base=</span><span style="background-color: #FFFF00">initial_path</span><span style="background-color: #FFFF00">());
+</span>
       //  convenience functions
       bool create_directories(const path& p);
       typename Path::string_type extension(const path& p);
@@ -505,14 +536,8 @@
       public:
         typedef <b><i>see below</i></b>                     value_type;  // char for POSIX, wchar_t for Windows
         typedef std::basic_string<value_type> string_type;
-        typedef string_type::size_type        size_type;
         typedef path_traits::codecvt_type     codecvt_type;
 
-        static const value_type generic_separator = <b><i>see below</i></b>;    // '/' for POSIX
-                                                                  // L'/' for Windows
-        static const value_type preferred_separator = <b><i>see below</i></b>;  // '/' for POSIX
-                                                                  // L'\\' for Windows
-
         // constructors/destructor
         path();
         path(const path& p);
@@ -836,8 +861,14 @@
   <p><i>Postconditions:</i> <code>native()</code> contains:</p>
   <ul>
     <li>the original contents of <code>native()</code>, </li>
-    <li>followed by a <code>native_separator</code>, unless an added separator 
-    would be redundant or would change an incomplete path to a complete path,</li>
+    <li>followed by an added native separator, unless:<ul>
+    <li>an added separator 
+    would be redundant, or</li>
+    <li>would change an incomplete path to a complete path, or</li>
+    <li><code>p.empty()</code>, or</li>
+    <li><code>*p.native().cbegin()</code> is a separator,</li>
+  </ul>
+    </li>
     <li>followed by <code>p.native()</code>.</li>
   </ul>
 </blockquote>
@@ -849,8 +880,14 @@
   <p><i>Postconditions:</i> <code>native()</code> contains:</p>
   <ul>
     <li>the original contents of <code>native()</code>, </li>
-    <li>followed by a <code>native_separator</code>, unless an added separator 
-    would be redundant or would change an incomplete path to a complete path,</li>
+    <li>followed by an added native separator, unless:<ul>
+    <li>an added separator 
+    would be redundant, or</li>
+    <li>would change an incomplete path to a complete path, or</li>
+    <li><code>source</code> is empty, or</li>
+    <li><code>source</code> begins with a separator,</li>
+  </ul>
+    </li>
     <li>followed by a copy of [<code>begin</code>,<code>end</code>) or <code>source</code>, converted to the 
   format and encoding required by the host operating system (<a href="#Input-conversion">Input 
   conversion</a>).</li>
@@ -950,7 +987,7 @@
 <p><i>[Note:</i> For Windows implementations, no conversion is required; the 
 implementation will simply return <code>native()</code>. <i>-- end note]</i></p>
 </blockquote>
-<pre><b><i>const-string</i></b> generic_string() const;</pre>
+<pre><b><i>const-string</i></b> string() const;</pre>
 <blockquote>
 <p><b><i><code>const-string</code></i></b> is permitted to be <code>const 
 std::string</code> or <code>const std::string&</code>.</p>
@@ -958,7 +995,7 @@
 representation</a> of the contents of <code>native()</code>. If <code>value_type</code> 
 is not <code>char</code>, the encoding is converted by <code>codecvt()</code>.</p>
 </blockquote>
-<pre><b><i>const-wstring</i></b> generic_wstring() const;</pre>
+<pre><b><i>const-wstring</i></b> wstring() const;</pre>
 <blockquote>
 <p><b><i><code>const-wstring</code></i></b> is permitted to be <code>const 
 std::wstring</code> or <code>const std::wstring&</code>.</p>
@@ -1083,6 +1120,35 @@
 <blockquote>
   <p><i>Returns:</i> The end iterator.</p>
 </blockquote>
+<h4> <code><font size="4">class <a name="path-deprecated-functions">path</a></font></code><a name="path-deprecated-functions"> 
+deprecated functions</a></h4>
+<p> <span style="background-color: #FFFF00">index.htm</span><span style="background-color: #FFFF00"> 
+also has a section (see macros) partially duplicating this material. Change to 
+reference this.</span></p>
+<p> Several member functions from previous versions of <code>class path</code> 
+have been deprecated, either because they have been renamed or because the 
+functionality is no longer desirable or has become obsolete.</p>
+<p> Deprecated functions available by default; will be suppressed if <code>
+BOOST_FILESYSTEM_NO_DEPRECATED</code> is defined:</p>
+<blockquote>
+  <pre>path&  remove_leaf()           { return remove_filename(); }
+path   leaf() const            { return filename(); }
+path   branch_path() const     { return parent_path(); }
+bool   has_leaf() const        { return !m_path.empty(); }
+bool   has_branch_path() const { return !parent_path().empty(); }</pre>
+</blockquote>
+<p> Deprecated functions not available by default; will be supplied if <code>
+BOOST_FILESYSTEM_DEPRECATED</code> is defined:</p>
+<blockquote>
+  <pre>const std::string  file_string() const               { return native_string(); }
+const std::string  directory_string() const          { return native_string(); }
+const std::string  native_file_string() const        { return native_string(); }
+const std::string  native_directory_string() const   { return native_string(); }
+const string_type  external_file_string() const      { return native(); }
+const string_type  external_directory_string() const { return native(); }</pre>
+</blockquote>
+<p>Functions no longer available:</p>
+<p><span style="background-color: #FFFF00">TBS</span></p>
 <h4> <a name="path-non-member-functions">
 <span style="background-color: #FFFFFF">path non-member functions</span></a></h4>
 <pre><span style="background-color: #FFFFFF">template<class String, class Traits>
@@ -2040,10 +2106,8 @@
   directory_iterator<Path>(p) == directory_iterator<Path>()<br>
          : file_size(p) == 0;</code></p>
 </blockquote>
-<pre><code>template <class path, class path> bool <a name="equivalent">equivalent</a>(const path& p1, const path& p2);</code></pre>
+<pre><code>bool <a name="equivalent">equivalent</a>(const path& p1, const path& p2);</code></pre>
 <blockquote>
-  <p><i>Requires:</i> <code>path::external_string_type</code> and <code>
-  path::external_string_type</code> are the same type. </p>
   <p><i>Effects:</i> Determines <code>file_status s1</code> and <code>s2</code>, 
   as if by <code>status(p1)</code> and  <code>status(p2)</code>, 
   respectively.</p>
@@ -2088,7 +2152,7 @@
   encouraged to call it immediately on entrance to <code>main()</code> so that 
   they will work correctly with such partial implementations. <i>--end note</i>]</p>
 </blockquote>
-<pre>Path current_path();</pre>
+<pre>path current_path();</pre>
 <blockquote>
   <p><i>Returns:</i> The current path, as if by <i>POSIX</i>
   <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getcwd.html">
@@ -2116,7 +2180,7 @@
   obtained as if by <i>POSIX</i> <code>
   <a href="http://www.opengroup.org/onlinepubs/000095399/functions/stat.html">stat()</a></code>.</p>
 </blockquote>
-<pre><span style="background-color: #FFFFFF"><a name="space">template</a> <class Path> space_info space(const path& p);</span></pre>
+<pre><span style="background-color: #FFFFFF">space_info space(const path& p);</span></pre>
 <blockquote>
   <p><span style="background-color: #FFFFFF"><i>Returns:</i> A <code>space_info</code> 
   object. The value of the <code>space_info</code> object is determined as if by 
@@ -2162,8 +2226,7 @@
   <p><i>Returns:</i> True if a new directory was created, otherwise false.</p>
   <p><i>Postcondition:</i> <code>is_directory(dp)</code></p>
 </blockquote>
-<pre><span style="background-color: #FFFFFF">template <class path, class path>
-  error_code create_hard_link(const path& to_p, const path& from_p, error_code& ec);</span></pre>
+<pre><span style="background-color: #FFFFFF">void create_hard_link(const path& to_p, const path& from_p, error_code& ec);</span></pre>
 <blockquote>
   <p><i><span style="background-color: #FFFFFF">Requires:</span></i><span style="background-color: #FFFFFF">
   </span> <code><span style="background-color: #FFFFFF">path::external_string_type</span></code><span style="background-color: #FFFFFF"> and
@@ -2174,9 +2237,6 @@
   </span> <code>
   <a href="http://www.opengroup.org/onlinepubs/000095399/functions/link.html">
   <span style="background-color: #FFFFFF">link()</span></a></code><span style="background-color: #FFFFFF">.</span></p>
-  <p><i><span style="background-color: #FFFFFF">Returns:</span></i><span style="background-color: #FFFFFF"> If the 
-  postcondition cannot be established, a system error code 
-  indicating the reason for the failure, otherwise 0.</span></p>
   <p><i><span style="background-color: #FFFFFF">Postcondition:</span></i></p>
   <ul>
     <li><span style="background-color: #FFFFFF"> </span><code><span style="background-color: #FFFFFF">exists(to_p) && exists(from_p) && equivalent(to_p, 
@@ -2195,8 +2255,7 @@
   for example. Thus hard links should be avoided if wide portability is 
   a concern. </span> <i><span style="background-color: #FFFFFF">-- end note</span></i><span style="background-color: #FFFFFF">]</span></p>
   </blockquote>
-<pre><span style="background-color: #FFFFFF">template <class path, class path>
-  void create_hard_link(const path& to_p, const path& from_p);</span></pre>
+<pre><span style="background-color: #FFFFFF">void create_hard_link(const path& to_p, const path& from_p);</span></pre>
 <blockquote>
   <p><i><span style="background-color: #FFFFFF">Requires:</span></i><span style="background-color: #FFFFFF">
   </span> <code><span style="background-color: #FFFFFF">path::external_string_type</span></code><span style="background-color: #FFFFFF"> and
@@ -2208,8 +2267,7 @@
   </span> <code>basic_filesystem_error<path, path></code><span style="background-color: #FFFFFF"> 
   if <code>ec</code> is not zero.</span></p>
   </blockquote>
-<pre><span style="background-color: #FFFFFF">template <class path, class path>
-  error_code create_symlink(const path& to_p, const path& from_p, error_code& ec);</span></pre>
+<pre><span style="background-color: #FFFFFF">void create_symlink(const path& to_p, const path& from_p, error_code& ec);</span></pre>
 <blockquote>
   <p><i><span style="background-color: #FFFFFF">Requires:</span></i><span style="background-color: #FFFFFF">
   </span> <code><span style="background-color: #FFFFFF">path::external_string_type</span></code><span style="background-color: #FFFFFF"> and
@@ -2232,8 +2290,7 @@
   them only for regular files. Thus symbolic links should be avoided if code portability is 
   a concern. </span> <i><span style="background-color: #FFFFFF">-- end note</span></i><span style="background-color: #FFFFFF">]</span></p>
   </blockquote>
-<pre><span style="background-color: #FFFFFF">template <class path, class path>
-  void create_symlink(const path& to_p, const path& from_p);</span></pre>
+<pre><span style="background-color: #FFFFFF">void create_symlink(const path& to_p, const path& from_p);</span></pre>
 <blockquote>
   <p><i><span style="background-color: #FFFFFF">Requires:</span></i><span style="background-color: #FFFFFF">
   </span> <code><span style="background-color: #FFFFFF">path::external_string_type</span></code><span style="background-color: #FFFFFF"> and
@@ -2295,17 +2352,25 @@
   existing file, it is removed. A symbolic link is itself renamed, rather than 
   the file it resolves to being renamed. <i>-- end note</i>]</p>
 </blockquote>
-<pre>template <class path, class path> void copy_file(const path& from_fp, const path& to_fp);</pre>
+<pre>void copy_file(const path & from, const path & to,
+               BOOST_SCOPED_ENUM(copy_option) option,
+               system::error_code & ec = throws());</pre>
 <blockquote>
-  <p><i>Requires:</i> <code>path::external_string_type</code> and <code>
-  path::external_string_type</code> are the same type. </p>
-  <p><i>Effects:</i> The contents and attributes of the file <code>from_fp</code> 
-  resolves to are copied to the file <code>to_fp</code> resolves to.</p>
+  <p><i>Effects:</i> The contents and attributes of the file <code>from</code> 
+  resolves to are copied to the file <code>to</code> resolves to.</p>
   <p><i>Throws:</i> <code>basic_filesystem_error<Path></code> if <code>
-  from_fp.empty() || to_fp.empty() ||!exists(from_fp) || !is_regular_file(from_fp) 
-  || exists(to_fp)</code></p>
+  from.empty() || to.empty() ||!exists(from) || !is_regular_file(from) || 
+  (option==copy_option::fail_if_exists 
+  && exists(to))</code></p>
+</blockquote>
+<pre>void copy_file(const path & from, const path & to,
+               system::error_code & ec = throws());</pre>
+<blockquote>
+  <p><i>Effects:</i><code>copy_file(from, to, 
+  copy_option::fail_if_exists, ec)</code>.</p>
+  
 </blockquote>
-<pre>Path complete(const path& p, const path base=initial_path<Path>());</pre>
+<pre>path complete(const path& p, const path& base=initial_path());</pre>
 <blockquote>
   <p><i>Effects:</i> Composes a complete path from <code>p</code> and <code>base</code>, 
   using the following rules:</p>
@@ -2344,7 +2409,7 @@
   is expected by program users. <i>-- 
   end note</i>]</p>
 </blockquote>
-<pre>Path system_complete(const path& p);</pre>
+<pre>path system_complete(const path& p);</pre>
 <blockquote>
   <p><i>Effects:</i> Composes a complete path from <code>p</code>, using the 
   same rules used by the operating system to resolve a path passed as the 
@@ -3118,11 +3183,11 @@
   </tr>
 </table>
 <hr>
-<p>© Copyright Beman Dawes, 2002, 2006, 2007</p>
+<p>© Copyright Beman Dawes, 2002, 2006, 2007, 2009</p>
 <p>Distributed under the Boost Software License, Version 1.0. See
 <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
 <p>Revised
-<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->23 August 2009<!--webbot bot="Timestamp" endspan i-checksum="31532" --></p>
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->02 September 2009<!--webbot bot="Timestamp" endspan i-checksum="39498" --></p>
 
 </body>
 
Modified: sandbox/filesystem-v3/libs/filesystem/src/operations.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/src/operations.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/src/operations.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -54,10 +54,7 @@
 using boost::throw_exception;
 using boost::throws;
 using std::string;
-
-# ifndef BOOST_FILESYSTEM_NARROW_ONLY
-    using std::wstring;
-# endif
+using std::wstring;
 
 # if defined(BOOST_WINDOWS_API)
 
@@ -137,7 +134,7 @@
 #   define BOOST_DELETE_FILE(P) (::unlink( P ) == 0)
 #   define BOOST_COPY_DIRECTORY(F,T) (!(::stat( from.c_str(), &from_stat ) != 0\
          || ::mkdir( to.c_str(),from_stat.st_mode ) != 0))
-#   define BOOST_COPY_FILE(F,T) copy_file_api(F, T)
+#   define BOOST_COPY_FILE(F,T,FailIfExistsBool) copy_file_api(F, T, FailIfExistsBool)
 #   define BOOST_MOVE_FILE(F,T) (::rename(F, T) == 0)
 
 #   define BOOST_ERROR_NOT_SUPPORTED ENOSYS
@@ -153,7 +150,7 @@
 #   define BOOST_REMOVE_DIRECTORY(P) (::RemoveDirectoryW(P) != 0)
 #   define BOOST_DELETE_FILE(P) (::DeleteFileW(P) != 0)
 #   define BOOST_COPY_DIRECTORY(F,T) (::CreateDirectoryExW( F, T, 0 ) != 0)
-#   define BOOST_COPY_FILE(F,T) (::CopyFileW( F, T, /*fail_if_exists=*/true ) != 0)
+#   define BOOST_COPY_FILE(F,T,FailIfExistsBool) (::CopyFileW(F, T, FailIfExistsBool) != 0)
 #   define BOOST_MOVE_FILE(F,T) (::MoveFileW( F, T ) != 0)
 #   define BOOST_READ_SYMLINK(P,T)
 
@@ -424,23 +421,32 @@
 
 # else
 
-  bool // true if ok occurred
+  bool // true if ok
   copy_file_api( const std::string & from_p,
-    const std::string & to_p )
+    const std::string & to_p, bool fail_if_exists )
   {
     const std::size_t buf_sz = 32768;
     boost::scoped_array<char> buf( new char [buf_sz] );
-    int infile=0, outfile=0;  // init quiets compiler warning
+    int infile=-1, outfile=-1;  // -1 means not open
+
+    // bug fixed: code previously did a stat() on the from_file first, but that
+    // introduced a gratuitous race condition; the stat() is now done after the open()
+
+    if ( (infile = ::open( from_p.c_str(), O_RDONLY )) < 0 )
+      { return false; }
+
     struct stat from_stat;
+    if ( ::stat( from_p.c_str(), &from_stat ) != 0 )
+      { return false; }
 
-    if ( ::stat( from_p.c_str(), &from_stat ) != 0
-      || (infile = ::open( from_p.c_str(),
-                          O_RDONLY )) < 0
-      || (outfile = ::open( to_p.c_str(),
-                            O_WRONLY | O_CREAT | O_EXCL,
-                            from_stat.st_mode )) < 0 )
-    { //  error
-      if ( infile >= 0 ) ::close( infile );
+    int oflag = O_CREAT | O_WRONLY;
+    if ( fail_if_exists ) oflag |= O_EXCL;
+    if (  (outfile = ::open( to_p.c_str(), oflag, from_stat.st_mode )) < 0 )
+    {
+      int open_errno = errno;
+      BOOST_ASSERT( infile >= 0 );
+      ::close( infile );
+      errno = open_errno;
       return false;
     }
 
@@ -466,7 +472,7 @@
     if ( ::close( infile) < 0 ) sz_read = -1;
     if ( ::close( outfile) < 0 ) sz_read = -1;
 
-    return sz_read >= 0;  // true if ok
+    return sz_read >= 0;
   }
 
 #endif
@@ -529,18 +535,17 @@
   BOOST_FILESYSTEM_DECL
   path complete( const path & p, const path & base )
   {
-    BOOST_ASSERT( base.is_complete()
-      && (p.is_complete() || !p.has_root_name())
-      && "boost::filesystem::complete() precondition not met" );
-#   ifdef BOOST_WINDOWS_PATH
-    if (p.empty() || p.is_complete())
+    if ( p.empty() || base.empty() )
       return p;
-    return !p.has_root_name() && p.has_root_directory()
+    if ( p.has_root_name() )
+    {
+      return p.has_root_directory()
+        ? p
+        : p.root_name() / base.root_directory() / base.relative_path() / p.relative_path();
+    }
+    return p.has_root_directory()
       ? base.root_name() / p
       : base / p;
-#   else
-    return (p.empty() || p.is_complete()) ? p : base / p;
-#   endif
   }
 
   BOOST_FILESYSTEM_DECL
@@ -559,7 +564,7 @@
     }
     else if( is_regular_file( s ) )
     {
-      copy_file( from, to, ec );
+      copy_file( from, to, copy_option::fail_if_exists, ec );
     }
     else
     {
@@ -581,10 +586,13 @@
   }
 
   BOOST_FILESYSTEM_DECL
-  void copy_file( const path & from, const path & to, error_code & ec )
-  {
-    error( !BOOST_COPY_FILE( from.c_str(), to.c_str() ),
-      from, to, ec, "boost::filesystem::copy_file" );
+  void copy_file( const path & from, const path & to,
+                  BOOST_SCOPED_ENUM(copy_option) option,
+                  error_code & ec )
+  {
+    error( !BOOST_COPY_FILE( from.c_str(), to.c_str(),
+      option == copy_option::fail_if_exists ),
+        from, to, ec, "boost::filesystem::copy_file" );
   }
 
   BOOST_FILESYSTEM_DECL
Modified: sandbox/filesystem-v3/libs/filesystem/src/path.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/src/path.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/src/path.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -55,9 +55,9 @@
   //                        miscellaneous class path helpers                            //
   //------------------------------------------------------------------------------------//
 
-  typedef path::size_type    size_type;
-  typedef path::string_type  string_type;
-  typedef path::value_type   value_type;
+  typedef path::value_type        value_type;
+  typedef path::string_type       string_type;
+  typedef string_type::size_type  size_type;
 
   const std::size_t default_codecvt_buf_size = BOOST_FILESYSTEM_CODECVT_BUF_SIZE;
 
@@ -128,6 +128,16 @@
 namespace filesystem
 {
 
+  path & path::operator/=( const path & p )
+  {
+    if ( p.empty() )
+      return *this;
+    if ( !is_separator( *p.m_path.begin() ) )
+      m_append_separator_if_needed();
+    m_path += p.m_path;
+    return *this;
+  }
+
 # ifdef BOOST_WINDOWS_PATH
 
   const std::string  path::native_string() const
@@ -176,9 +186,9 @@
 
 # endif  // BOOST_WINDOWS_PATH
 
-  //  m_append_separator_if_needed  -----------------------------------------//
+  //  m_append_separator_if_needed  ----------------------------------------------------//
 
-  void path::m_append_separator_if_needed()
+  path::string_type::size_type path::m_append_separator_if_needed()
   {
     if ( !m_path.empty() &&
 #   ifdef BOOST_WINDOWS_PATH
@@ -186,11 +196,27 @@
 #   endif
       !is_separator( *(m_path.end()-1) ) )
     {
+      string_type::size_type tmp( m_path.size() );
       m_path += preferred_separator;
+      return tmp;
     }
+    return 0;
+  }
+
+  //  m_erase_redundant_separator  -----------------------------------------------------//
+
+  void path::m_erase_redundant_separator( string_type::size_type sep_pos )
+  {
+    if ( sep_pos                         // a separator was added
+      && sep_pos < m_path.size()         // and something was appended
+      && (m_path[sep_pos+1] == separator // and it was also separator
+#   ifdef BOOST_WINDOWS_PATH
+       || m_path[sep_pos+1] == preferred_separator  // or preferred_separator
+#   endif
+       )) { m_path.erase( sep_pos, 1 ); } // erase the added separator
   }
 
-  //  decomposition  ---------------------------------------------------------//
+  //  decomposition  -------------------------------------------------------------------//
 
   path  path::root_path() const
   { 
@@ -560,7 +586,7 @@
   {
     iterator itr;
     itr.m_path_ptr = this;
-    path::size_type element_size;
+    size_type element_size;
     first_element( m_path, itr.m_pos, element_size );
     itr.m_element = m_path.substr( itr.m_pos, element_size );
     if ( itr.m_element.m_path == preferred_separator_string )
Modified: sandbox/filesystem-v3/libs/filesystem/src/portability.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/src/portability.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/src/portability.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -56,7 +56,9 @@
 #   else
     BOOST_FILESYSTEM_DECL bool native( const std::string & name )
     {
-      return name.find('/') == std::string::npos;
+      return  name.size() != 0
+        && name[0] != ' '
+        && name.find('/') == std::string::npos;
     }
 #   endif
 
Modified: sandbox/filesystem-v3/libs/filesystem/test/convenience_test.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/convenience_test.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/test/convenience_test.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -23,12 +23,6 @@
 #include <fstream>
 #include <iostream>
 
-#ifndef BOOST_FILESYSTEM_NARROW_ONLY
-# define BOOST_FS_IS_EMPTY fs::is_empty
-#else
-# define BOOST_FS_IS_EMPTY fs::_is_empty
-#endif
-
 namespace
 {
   template< typename F >
Modified: sandbox/filesystem-v3/libs/filesystem/test/deprecated_test.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/deprecated_test.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/test/deprecated_test.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -8,9 +8,11 @@
 
 //  Library home page: http://www.boost.org/libs/filesystem
 
-//  This test verifies that various deprecated names still compile. This is
+//  This test verifies that various deprecated names still work. This is
 //  important to preserve existing code that uses the old names.
 
+#define BOOST_FILESYSTEM_DEPRECATED
+
 #include <boost/filesystem.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
@@ -30,7 +32,7 @@
 
     ++::boost::detail::test_errors();
 
-    std::cout << '(' << line << ") source.string(): \"" << source.string()
+    std::cout << '(' << line << ") source.native_string(): \"" << source.native_string()
               << "\" != expected: \"" << expected
               << "\"" << std::endl;
   }
@@ -141,7 +143,7 @@
   //  }
   //}
 
-  //  Compile-only tests. Not intended to be executed.
+  //  Compile-only tests not intended to be executed -----------------------------------//
 
   void compile_only()
   {
@@ -154,10 +156,30 @@
     p.directory_string();
   }
 
+  //  rename_test ----------------------------------------------------------------------//
+
+  void rename_test()
+  {
+    fs::path p( "foo/bar/blah" );
+
+    BOOST_TEST_EQ( path("foo/bar/blah").remove_leaf(), "foo/bar" );
+    BOOST_TEST_EQ( p.leaf(), "blah" );
+    BOOST_TEST_EQ( p.branch_path(), "foo/bar" );
+    BOOST_TEST( p.has_leaf() );
+    BOOST_TEST( p.has_branch_path() );
+
+    if ( platform == "Windows" )
+    {
+      BOOST_TEST_EQ( path("foo\\bar\\blah").remove_leaf(), "foo\\bar" );
+      p = "foo\\bar\\blah";
+      BOOST_TEST_EQ( p.branch_path(), "foo\\bar" );
+    }
+  }
+
 } // unnamed namespace
 
 
-//----------------------------------------------------------------------------//
+//--------------------------------------------------------------------------------------//
 
 int main( int /*argc*/, char * /*argv*/[] )
 {
@@ -169,19 +191,21 @@
                : "POSIX";
   std::cout << "Platform is " << platform << '\n';
 
-  path::default_name_check( fs::no_check );
+  //path::default_name_check( fs::no_check );
 
   fs::directory_entry de( "foo/bar" );
 
   de.replace_leaf( "", fs::file_status(), fs::file_status() );
 
-  de.leaf();
-  de.string();
+  //de.leaf();
+  //de.string();
 
   fs::path ng( " no-way, Jose" );
   BOOST_TEST( !fs::is_regular( ng ) );  // verify deprecated name still works
   BOOST_TEST( !fs::symbolic_link_exists( "nosuchfileordirectory" ) );
 
+  rename_test();
+
   //check_normalize();
  
 // extension() tests ---------------------------------------------------------//
Modified: sandbox/filesystem-v3/libs/filesystem/test/msvc/filesystem-v3-sandbox.sln
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/msvc/filesystem-v3-sandbox.sln	(original)
+++ sandbox/filesystem-v3/libs/filesystem/test/msvc/filesystem-v3-sandbox.sln	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -27,6 +27,10 @@
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fstream_test", "fstream_test\fstream_test.vcproj", "{A9939CD7-BE1C-4334-947C-4C320D49B3CA}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "deprecated_test", "deprecated_test\deprecated_test.vcproj", "{D73BC50F-956E-4A44-BF9F-A8BB80DF0000}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F94CCADD-A90B-480C-A304-C19D015D36B1} = {F94CCADD-A90B-480C-A304-C19D015D36B1}
+		{FFD738F7-96F0-445C-81EA-551665EF53D1} = {FFD738F7-96F0-445C-81EA-551665EF53D1}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "proof_of_concept", "proof_of_concept\proof_of_concept.vcproj", "{440316C4-E19E-41DE-92A6-B78B3900E97F}"
 EndProject
@@ -36,6 +40,12 @@
                 {FFD738F7-96F0-445C-81EA-551665EF53D1} = {FFD738F7-96F0-445C-81EA-551665EF53D1}
         EndProjectSection
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "complete_func_combos", "complete_func_combos\complete_func_combos.vcproj", "{B0725661-C439-484E-BD67-E367AC78C60A}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F94CCADD-A90B-480C-A304-C19D015D36B1} = {F94CCADD-A90B-480C-A304-C19D015D36B1}
+		{FFD738F7-96F0-445C-81EA-551665EF53D1} = {FFD738F7-96F0-445C-81EA-551665EF53D1}
+	EndProjectSection
+EndProject
 Global
         GlobalSection(SolutionConfigurationPlatforms) = preSolution
                 Debug|Win32 = Debug|Win32
@@ -89,6 +99,10 @@
                 {6B8EC880-702E-418A-BC63-CA46C6CC7B27}.Debug|Win32.Build.0 = Debug|Win32
                 {6B8EC880-702E-418A-BC63-CA46C6CC7B27}.Release|Win32.ActiveCfg = Release|Win32
                 {6B8EC880-702E-418A-BC63-CA46C6CC7B27}.Release|Win32.Build.0 = Release|Win32
+		{B0725661-C439-484E-BD67-E367AC78C60A}.Debug|Win32.ActiveCfg = Debug|Win32
+		{B0725661-C439-484E-BD67-E367AC78C60A}.Debug|Win32.Build.0 = Debug|Win32
+		{B0725661-C439-484E-BD67-E367AC78C60A}.Release|Win32.ActiveCfg = Release|Win32
+		{B0725661-C439-484E-BD67-E367AC78C60A}.Release|Win32.Build.0 = Release|Win32
         EndGlobalSection
         GlobalSection(SolutionProperties) = preSolution
                 HideSolutionNode = FALSE
Modified: sandbox/filesystem-v3/libs/filesystem/test/operations_test.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/operations_test.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/test/operations_test.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -952,12 +952,33 @@
 
   // copy_file() tests
   std::cout << "begin copy_file test..." << std::endl;
+  BOOST_TEST( fs::exists( file_ph ) );
+  fs::remove( d1 / "f2" );  // remove possible residue from prior testing
+  BOOST_TEST( fs::exists( d1 ) );
+  BOOST_TEST( !fs::exists( d1 / "f2" ) );
+  std::cout << " copy " << file_ph << " to " << d1 / "f2" << std::endl;
   fs::copy_file( file_ph, d1 / "f2" );
-  std::cout << "copying complete" << std::endl;
+  std::cout << " copy complete" << std::endl;
   BOOST_TEST( fs::exists( file_ph ) );
   BOOST_TEST( fs::exists( d1 / "f2" ) );
   BOOST_TEST( !fs::is_directory( d1 / "f2" ) );
   verify_file( d1 / "f2", "foobar1" );
+
+  bool copy_ex_ok = false;
+  try { fs::copy_file( file_ph, d1 / "f2" ); }
+  catch ( const fs::filesystem_error & ) { copy_ex_ok = true; }
+  BOOST_TEST( copy_ex_ok );
+
+  copy_ex_ok = false;
+  try { fs::copy_file( file_ph, d1 / "f2", fs::copy_option::fail_if_exists ); }
+  catch ( const fs::filesystem_error & ) { copy_ex_ok = true; }
+  BOOST_TEST( copy_ex_ok );
+
+  copy_ex_ok = true;
+  try { fs::copy_file( file_ph, d1 / "f2", fs::copy_option::overwrite_if_exists ); }
+  catch ( const fs::filesystem_error & ) { copy_ex_ok = false; }
+  BOOST_TEST( copy_ex_ok );
+
   std::cout << "copy_file test complete" << std::endl;
 
   rename_tests();
Modified: sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -27,8 +27,6 @@
 
 namespace fs = boost::filesystem;
 using boost::filesystem::path;
-using boost::next;
-using boost::prior;
 
 #include <boost/detail/lightweight_test.hpp>
 
@@ -43,14 +41,15 @@
   void check( const fs::path & source,
               const std::string & expected, const char* file, int line )
   {
-    if ( source.native_string()== expected ) return;
+    if ( source.native_string() == expected )
+      return;
 
     std::cout << file
-              << '(' << line << "): source.native_string(): \"" << source.native_string()
+              << '(' << line << "): source: \"" << source
               << "\" != expected: \"" << expected
               << "\"" << std::endl;
 
-    BOOST_ERROR(0);  // increment error count
+    ++::boost::detail::test_errors();
   }
 
   void check_equal( const fs::path & source,
@@ -60,7 +59,7 @@
 
     ++::boost::detail::test_errors();
 
-    std::cout << file << '(' << line << "): source: \"" << source.string()
+    std::cout << file << '(' << line << "): source: \"" << source
               << "\" != expected: \"" << expected
               << "\"" << std::endl;
   }
@@ -142,18 +141,18 @@
 
     itr_ck = "foo";
     BOOST_TEST( *itr_ck.begin() == std::string( "foo" ) );
-    BOOST_TEST( next( itr_ck.begin() ) == itr_ck.end() );
-    BOOST_TEST( *prior( itr_ck.end() ) == std::string( "foo" ) );
-    BOOST_TEST( prior( itr_ck.end() ) == itr_ck.begin() );
+    BOOST_TEST( boost::next( itr_ck.begin() ) == itr_ck.end() );
+    BOOST_TEST( *boost::prior( itr_ck.end() ) == std::string( "foo" ) );
+    BOOST_TEST( boost::prior( itr_ck.end() ) == itr_ck.begin() );
 
     itr_ck = path( "/foo" );
     BOOST_TEST( *itr_ck.begin() == std::string( "/" ) );
-    BOOST_TEST( *next( itr_ck.begin() ) == std::string( "foo" ) );
-    BOOST_TEST( next(next( itr_ck.begin() )) == itr_ck.end() );
-    BOOST_TEST( next( itr_ck.begin() ) == prior( itr_ck.end() ) );
-    BOOST_TEST( *prior( itr_ck.end() ) == std::string( "foo" ) );
-    BOOST_TEST( *prior(prior( itr_ck.end() )) == std::string( "/" ) );
-    BOOST_TEST( prior(prior( itr_ck.end() )) == itr_ck.begin() );
+    BOOST_TEST( *boost::next( itr_ck.begin() ) == std::string( "foo" ) );
+    BOOST_TEST( boost::next(boost::next( itr_ck.begin() )) == itr_ck.end() );
+    BOOST_TEST( boost::next( itr_ck.begin() ) == boost::prior( itr_ck.end() ) );
+    BOOST_TEST( *boost::prior( itr_ck.end() ) == std::string( "foo" ) );
+    BOOST_TEST( *boost::prior(boost::prior( itr_ck.end() )) == std::string( "/" ) );
+    BOOST_TEST( boost::prior(boost::prior( itr_ck.end() )) == itr_ck.begin() );
 
     itr_ck = "/foo/bar";
     itr = itr_ck.begin();
@@ -406,7 +405,7 @@
       BOOST_TEST( (b / as).native_string() == "b\\a" );
       BOOST_TEST( (b / acs).native_string() == "b\\a" );
       PATH_CHECK( path("a") / "b", "a\\b" );
-      PATH_CHECK( path("..") / "", "..\\" );
+      PATH_CHECK( path("..") / "", ".." );
       PATH_CHECK( path("foo") / path("bar"), "foo\\bar" ); // path arg
       PATH_CHECK( path("foo") / "bar", "foo\\bar" );       // const char * arg
       PATH_CHECK( path("foo") / path("woo/bar").filename(), "foo\\bar" ); // const std::string & arg
@@ -531,17 +530,6 @@
     BOOST_TEST( path("a/b") < path("a.b") );
 
     // make sure the derivative operators also work
-    BOOST_TEST( a == a2 );
-    BOOST_TEST( as == a2 );
-    BOOST_TEST( acs == a2 );
-    BOOST_TEST( a == as2 );
-    BOOST_TEST( a == acs2 );
-
-    BOOST_TEST( a != b );
-    BOOST_TEST( as != b );
-    BOOST_TEST( acs != b );
-    BOOST_TEST( a != bs );
-    BOOST_TEST( a != bcs );
 
     BOOST_TEST( b > a );
     BOOST_TEST( b > as );
@@ -578,6 +566,30 @@
     BOOST_TEST( acs2 >= a );
     BOOST_TEST( a2 >= as );
     BOOST_TEST( a2 >= acs );
+
+    //  operator == and != are implemented separately, so test separately
+
+    path p1( "fe/fi/fo/fum" );
+    path p2( p1 );
+    path p3( "fe/fi/fo/fumm" );
+    BOOST_TEST( p1.string() != p3.string() );
+
+    // check each overload
+    BOOST_TEST( p1 != p3 );
+    BOOST_TEST( p1 != p3.string() );
+    BOOST_TEST( p1 != p3.string().c_str() );
+    BOOST_TEST( p1.string() != p3 );
+    BOOST_TEST( p1.string().c_str() != p3 );
+
+    p3 = p2;
+    BOOST_TEST( p1.string() == p3.string() );
+
+    // check each overload
+    BOOST_TEST( p1 == p3 );
+    BOOST_TEST( p1 == p3.string() );
+    BOOST_TEST( p1 == p3.string().c_str() );
+    BOOST_TEST( p1.string() == p3 );
+    BOOST_TEST( p1.string().c_str() == p3 );
   }
 
   //  query_and_decomposition_tests  -----------------------------------------//
@@ -1168,25 +1180,103 @@
 
   //  append_tests  --------------------------------------------------------------------//
 
+  void append_test_aux( const path & p, const std::string & s, const std::string & expect )
+  {
+    PATH_CHECK( p / path(s), expect );
+    PATH_CHECK( p / s.c_str(), expect );
+    PATH_CHECK( p / s, expect );
+    path x(p);
+    x.append( s.begin(), s.end() );
+    PATH_CHECK( x, expect );
+  }
+
   void append_tests()
   {
     std::cout << "append_tests..." << std::endl;
 
+    // There are many control paths to be exercised, since empty paths and arguments,
+    // paths with trailing separators, arguments with leading separators, with or without
+    // other characters being present, are all separate cases that need to be tested.
+    // Furthermore, some of the code to be tested is specific to argument categories,
+    // so that results in further permutations to be tested.
+
+    //// code to generate test cases
+    //// 
+    //// expected results must be checked by hand
+    //// "foo\bar" expected result must be edited by hand and moved for Windows/POSIX
+    ////
+    //const char * x[]    = { "", "/", "foo", "foo/" };
+    //const char * y[] = { "", "/", "bar", "/bar" };
+
+    //for ( int i = 0; i < sizeof(x)/sizeof(char*); ++i )
+    //  for ( int j = 0; j < sizeof(y)/sizeof(char*); ++j )
+    //  {
+    //    std::cout << "\n    PATH_CHECK( path(\"" << x[i] << "\") / \"" << y[j] << "\", \"" 
+    //              << path(x[i]) / y[j] << "\" );\n";
+    //    std::cout << "    append_test_aux( \"" << x[i] << "\", \"" << y[j] << "\", \""
+    //              << path(x[i]) / y[j] << "\");\n";
+    //  }
+
+    PATH_CHECK( path("") / "", "" );
+    append_test_aux( "", "", "");
+
+    PATH_CHECK( path("") / "/", "/" );
+    append_test_aux( "", "/", "/");
+
+    PATH_CHECK( path("") / "bar", "bar" );
+    append_test_aux( "", "bar", "bar");
+
+    PATH_CHECK( path("") / "/bar", "/bar" );
+    append_test_aux( "", "/bar", "/bar");
+
+    PATH_CHECK( path("/") / "", "/" );
+    append_test_aux( "/", "", "/");
+
+    PATH_CHECK( path("/") / "/", "//" );
+    append_test_aux( "/", "/", "//");
+
+    PATH_CHECK( path("/") / "bar", "/bar" );
+    append_test_aux( "/", "bar", "/bar");
+
+    PATH_CHECK( path("/") / "/bar", "//bar" );
+    append_test_aux( "/", "/bar", "//bar");
+
+    PATH_CHECK( path("foo") / "", "foo" );
+    append_test_aux( "foo", "", "foo");
+
+    PATH_CHECK( path("foo") / "/", "foo/" );
+    append_test_aux( "foo", "/", "foo/");
+
+    PATH_CHECK( path("foo") / "/bar", "foo/bar" );
+    append_test_aux( "foo", "/bar", "foo/bar");
+
+    PATH_CHECK( path("foo/") / "", "foo/" );
+    append_test_aux( "foo/", "", "foo/");
+
+    PATH_CHECK( path("foo/") / "/", "foo//" );
+    append_test_aux( "foo/", "/", "foo//");
+
+    PATH_CHECK( path("foo/") / "bar", "foo/bar" );
+    append_test_aux( "foo/", "bar", "foo/bar");
+
+    PATH_CHECK( path("foo/") / "/bar", "foo//bar" );
+    append_test_aux( "foo/", "/bar", "foo//bar");
+
     if ( platform == "Windows" )
     {
+      PATH_CHECK( path("foo") / "bar", "foo\\bar" );
+      append_test_aux( "foo", "bar", "foo\\bar");
+
+      // hand created test case specific to Windows
+      PATH_CHECK( path("c:") / "bar", "c:bar" );
+      append_test_aux( "c:", "bar", "c:bar" );
     }
     else
     {
+      PATH_CHECK( path("foo") / "bar", "foo/bar" );
+      append_test_aux( "foo", "bar", "foo/bar");
     }
 
-
-    PATH_CHECK( path("") / "foo", "foo" );
-    PATH_CHECK( path("") / "foo/", "foo/" );
-    PATH_CHECK( path( "/" ) / "", "/" );
-    PATH_CHECK( path("") / "/foo", "/foo" );
-    PATH_CHECK( path("foo") / "", "foo\\" );
-    PATH_CHECK( path("/foo") / "", "/foo\\" );
-
   }
 
   //  name_function_tests  -------------------------------------------------------------//
@@ -1379,8 +1469,6 @@
 
   std::string s1( "//:somestring" );  // this used to be treated specially
 
-# ifndef BOOST_NO_MEMBER_TEMPLATES
-
   // check the path member templates
   p5.assign( s1.begin(), s1.end() );
 
@@ -1388,25 +1476,6 @@
   p5 = s1;
   PATH_CHECK( p5, "//:somestring" );
 
-  char c0 = 'a';
-  p5.assign( &c0, &c0 );
-  PATH_CHECK( p5, "" );
-  p5 /= "";
-  PATH_CHECK( p5, "" );
-  p5 /= "foo/bar";
-  PATH_CHECK( p5, "foo/bar" );
-  p5 /= "";
-  PATH_CHECK( p5, "foo/bar\\" );
-  p5.append( &c0, &c0 );
-  PATH_CHECK( p5, "foo/bar\\" );
-  p5 /= "";
-  PATH_CHECK( p5, "foo/bar\\" );
-  char bf[]= "bar/foo";
-  p5.assign( bf, bf + sizeof(bf) - 1 ); 
-  PATH_CHECK( p5, bf );
-  p5.append( bf, bf + sizeof(bf) - 1 ); 
-  PATH_CHECK( p5, "bar/foo\\bar/foo" );
-
   // this code, courtesy of David Whetstone, detects a now fixed bug that
   // derefereced the end iterator (assuming debug build with checked itors)
   std::vector<char> v1;
@@ -1416,8 +1485,6 @@
   p5.assign( s1.begin(), s1.begin() + 1 );
   PATH_CHECK( p5, "/" );
 
-# endif
-
   BOOST_TEST( p1 != p4 );
   BOOST_TEST( p1.string() == p2.string() );
   BOOST_TEST( p1.string() == p3.string() );
Modified: sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp	(original)
+++ sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp	2009-09-02 14:29:37 EDT (Wed, 02 Sep 2009)
@@ -54,7 +54,8 @@
     ++::boost::detail::test_errors();
 
     std::cout << file;
-    std::wcout << L'(' << line << L"): source.wstring(): \"" << source.wstring()
+    std::wcout << L'(' << line << L"): source.native_wstring(): \""
+               << source.native_wstring()
                << L"\" != expected: \"" << expected
                << L"\"\n" ;
   }
@@ -189,19 +190,19 @@
 
     x = "/foo";
     x /= path("");                                      // empty path
-    PATH_IS(x, BOOST_FS_FOO);
+    PATH_IS(x, L"/foo");
 
     x = "/foo";
     x /= path("/");                                     // slash path
-    PATH_IS(x, BOOST_FS_FOO L"/");
+    PATH_IS(x, L"/foo/");
 
     x = "/foo";
     x /= path("/boo");                                  // slash path
-    PATH_IS(x, BOOST_FS_FOO L"/boo");
+    PATH_IS(x, L"/foo/boo");
 
     x = "/foo";
-    x /= x;                                             // self-assignment
-    PATH_IS(x, BOOST_FS_FOO BOOST_FS_FOO  );
+    x /= x;                                             // self-append
+    PATH_IS(x, L"/foo/foo");
 
     x = "/foo";
     x /= path("yet another path");                      // another path
@@ -275,14 +276,14 @@
 
     CHECK( string( p.c_str() ) == "abc\\def/ghi" );
 
+    CHECK( p.native_string() == "abc\\def/ghi" );
+    CHECK( p.native_wstring() == L"abc\\def/ghi" );
+
     CHECK( p.string() == "abc\\def/ghi" );
     CHECK( p.wstring() == L"abc\\def/ghi" );
 
-    CHECK( p.generic().string() == "abc\\def/ghi" );
-    CHECK( p.generic().wstring() == L"abc\\def/ghi" );
-
-    CHECK( p.preferred().string() == "abc\\def/ghi" );
-    CHECK( p.preferred().wstring() == L"abc\\def/ghi" );
+    //CHECK( p.preferred().string() == "abc\\def/ghi" );
+    //CHECK( p.preferred().wstring() == L"abc\\def/ghi" );
 
 # endif 
   }