imgtools/imglib/boostlibrary/boost/filesystem/fstream.hpp
changeset 607 378360dbbdba
parent 600 6d08f4a05d93
equal deleted inserted replaced
591:22486c9c7b15 607:378360dbbdba
       
     1 //  boost/filesystem/fstream.hpp  --------------------------------------------//
       
     2 
       
     3 //  Copyright Beman Dawes 2002.
       
     4 //  Use, modification, and distribution is subject to the Boost Software
       
     5 //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
       
     6 //  http://www.boost.org/LICENSE_1_0.txt)
       
     7 
       
     8 //  See library home page at http://www.boost.org/libs/filesystem
       
     9 
       
    10 //----------------------------------------------------------------------------// 
       
    11 
       
    12 #ifndef BOOST_FILESYSTEM_FSTREAM_HPP
       
    13 #define BOOST_FILESYSTEM_FSTREAM_HPP
       
    14 
       
    15 #include <boost/filesystem/operations.hpp> // for 8.3 hack (see below)
       
    16 #include <boost/utility/enable_if.hpp>
       
    17 #include <boost/detail/workaround.hpp>
       
    18 
       
    19 #include <iosfwd>
       
    20 #include <fstream>
       
    21 
       
    22 #include <boost/config/abi_prefix.hpp> // must be the last #include
       
    23 
       
    24 // NOTE: fstream.hpp for Boost 1.32.0 and earlier supplied workarounds for
       
    25 // various compiler problems. They have been removed to ease development of the
       
    26 // basic i18n functionality. Once the new interface is stable, the workarounds
       
    27 // will be reinstated for any compilers that otherwise can support the rest of
       
    28 // the library after internationalization.
       
    29 
       
    30 namespace boost
       
    31 {
       
    32   namespace filesystem
       
    33   {
       
    34     namespace detail
       
    35     {
       
    36 #   if defined(BOOST_WINDOWS_API) && !defined(BOOST_FILESYSTEM_NARROW_ONLY)
       
    37 #     if !defined(BOOST_DINKUMWARE_STDLIB) || BOOST_DINKUMWARE_STDLIB < 405
       
    38       // The 8.3 hack:
       
    39       // C++98 does not supply a wchar_t open, so try to get an equivalent
       
    40       // narrow char name based on the short, so-called 8.3, name.
       
    41       // Not needed for Dinkumware 405 and later as they do supply wchar_t open.
       
    42       BOOST_FILESYSTEM_DECL bool create_file_api( const std::wstring & ph,
       
    43         std::ios_base::openmode mode ); // true if succeeds
       
    44       BOOST_FILESYSTEM_DECL std::string narrow_path_api(
       
    45         const std::wstring & ph ); // return is empty if fails
       
    46 
       
    47       inline std::string path_proxy( const std::wstring & file_ph,
       
    48         std::ios_base::openmode mode )
       
    49       // Return a non-existant path if cannot supply narrow short path.
       
    50       // An empty path doesn't work because some Dinkumware versions
       
    51       // assert the path is non-empty.  
       
    52       {
       
    53         std::string narrow_ph;
       
    54         bool created_file( false );
       
    55         if ( !exists( file_ph )
       
    56           && (mode & std::ios_base::out) != 0
       
    57           && create_file_api( file_ph, mode ) )
       
    58         {
       
    59           created_file = true;
       
    60         }
       
    61         narrow_ph = narrow_path_api( file_ph );
       
    62         if ( narrow_ph.empty() )
       
    63         {
       
    64           if ( created_file ) remove_api( file_ph );
       
    65           narrow_ph = "\x01";
       
    66         }
       
    67         return narrow_ph;
       
    68       }
       
    69 #     else
       
    70       // Dinkumware 405 and later does supply wchar_t functions
       
    71       inline const std::wstring & path_proxy( const std::wstring & file_ph,
       
    72         std::ios_base::openmode )
       
    73         { return file_ph; }
       
    74 #     endif
       
    75 #   endif 
       
    76 
       
    77       inline const std::string & path_proxy( const std::string & file_ph,
       
    78         std::ios_base::openmode )
       
    79         { return file_ph; }
       
    80 
       
    81     } // namespace detail
       
    82 
       
    83     template < class charT, class traits = std::char_traits<charT> >
       
    84     class basic_filebuf : public std::basic_filebuf<charT,traits>
       
    85     {
       
    86     private: // disallow copying
       
    87       basic_filebuf( const basic_filebuf & );
       
    88       const basic_filebuf & operator=( const basic_filebuf & ); 
       
    89     public:
       
    90       basic_filebuf() {}
       
    91       virtual ~basic_filebuf() {}
       
    92 
       
    93 #   ifndef BOOST_FILESYSTEM_NARROW_ONLY
       
    94       template<class Path>
       
    95       typename boost::enable_if<is_basic_path<Path>,
       
    96         basic_filebuf<charT,traits> *>::type
       
    97       open( const Path & file_ph, std::ios_base::openmode mode );
       
    98 
       
    99       basic_filebuf<charT,traits> *
       
   100       open( const wpath & file_ph, std::ios_base::openmode mode );
       
   101 #   endif
       
   102 
       
   103 #   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   104       basic_filebuf<charT,traits> *
       
   105       open( const path & file_ph, std::ios_base::openmode mode );
       
   106 #   endif
       
   107     };
       
   108 
       
   109     template < class charT, class traits = std::char_traits<charT> >
       
   110     class basic_ifstream : public std::basic_ifstream<charT,traits>
       
   111     {
       
   112     private: // disallow copying
       
   113       basic_ifstream( const basic_ifstream & );
       
   114       const basic_ifstream & operator=( const basic_ifstream & ); 
       
   115     public:
       
   116       basic_ifstream() {}
       
   117 
       
   118       // use two signatures, rather than one signature with default second
       
   119       // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416)
       
   120 
       
   121 #   ifndef BOOST_FILESYSTEM_NARROW_ONLY
       
   122       template<class Path>
       
   123       explicit basic_ifstream( const Path & file_ph,
       
   124         typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
       
   125 
       
   126       template<class Path>
       
   127       basic_ifstream( const Path & file_ph, std::ios_base::openmode mode,
       
   128         typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
       
   129 
       
   130       template<class Path>
       
   131       typename boost::enable_if<is_basic_path<Path>, void>::type
       
   132       open( const Path & file_ph );
       
   133 
       
   134       template<class Path>
       
   135       typename boost::enable_if<is_basic_path<Path>, void>::type
       
   136       open( const Path & file_ph, std::ios_base::openmode mode );
       
   137 
       
   138       explicit basic_ifstream( const wpath & file_ph );
       
   139       basic_ifstream( const wpath & file_ph, std::ios_base::openmode mode );
       
   140       void open( const wpath & file_ph );
       
   141       void open( const wpath & file_ph, std::ios_base::openmode mode );
       
   142 #   endif
       
   143 
       
   144       explicit basic_ifstream( const path & file_ph );
       
   145       basic_ifstream( const path & file_ph, std::ios_base::openmode mode );
       
   146 #   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   147       void open( const path & file_ph );
       
   148       void open( const path & file_ph, std::ios_base::openmode mode );
       
   149 #   endif
       
   150       virtual ~basic_ifstream() {}
       
   151     };
       
   152 
       
   153     template < class charT, class traits = std::char_traits<charT> >
       
   154     class basic_ofstream : public std::basic_ofstream<charT,traits>
       
   155     {
       
   156     private: // disallow copying
       
   157       basic_ofstream( const basic_ofstream & );
       
   158       const basic_ofstream & operator=( const basic_ofstream & ); 
       
   159     public:
       
   160       basic_ofstream() {}
       
   161 
       
   162       // use two signatures, rather than one signature with default second
       
   163       // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416)
       
   164 
       
   165 #   ifndef BOOST_FILESYSTEM_NARROW_ONLY
       
   166 
       
   167       template<class Path>
       
   168       explicit basic_ofstream( const Path & file_ph,
       
   169         typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
       
   170       explicit basic_ofstream( const wpath & file_ph );
       
   171 
       
   172       template<class Path>
       
   173       basic_ofstream( const Path & file_ph, std::ios_base::openmode mode,
       
   174         typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
       
   175       basic_ofstream( const wpath & file_ph, std::ios_base::openmode mode );
       
   176 
       
   177       template<class Path>
       
   178       typename boost::enable_if<is_basic_path<Path>, void>::type
       
   179       open( const Path & file_ph );
       
   180       void open( const wpath & file_ph );
       
   181 
       
   182       template<class Path>
       
   183       typename boost::enable_if<is_basic_path<Path>, void>::type
       
   184       open( const Path & file_ph, std::ios_base::openmode mode );
       
   185       void open( const wpath & file_ph, std::ios_base::openmode mode );
       
   186 
       
   187 #   endif
       
   188 
       
   189       explicit basic_ofstream( const path & file_ph );
       
   190       basic_ofstream( const path & file_ph, std::ios_base::openmode mode );
       
   191 #   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   192       void open( const path & file_ph );
       
   193       void open( const path & file_ph, std::ios_base::openmode mode );
       
   194 #   endif
       
   195       virtual ~basic_ofstream() {}
       
   196     };
       
   197 
       
   198     template < class charT, class traits = std::char_traits<charT> >
       
   199     class basic_fstream : public std::basic_fstream<charT,traits>
       
   200     {
       
   201     private: // disallow copying
       
   202       basic_fstream( const basic_fstream & );
       
   203       const basic_fstream & operator=( const basic_fstream & ); 
       
   204     public:
       
   205       basic_fstream() {}
       
   206 
       
   207       // use two signatures, rather than one signature with default second
       
   208       // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416)
       
   209 
       
   210 #   ifndef BOOST_FILESYSTEM_NARROW_ONLY
       
   211 
       
   212       template<class Path>
       
   213       explicit basic_fstream( const Path & file_ph,
       
   214         typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
       
   215       explicit basic_fstream( const wpath & file_ph );
       
   216 
       
   217       template<class Path>
       
   218       basic_fstream( const Path & file_ph, std::ios_base::openmode mode,
       
   219         typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
       
   220       basic_fstream( const wpath & file_ph, std::ios_base::openmode mode );
       
   221 
       
   222       template<class Path>
       
   223       typename boost::enable_if<is_basic_path<Path>, void>::type
       
   224       open( const Path & file_ph );
       
   225       void open( const wpath & file_ph );
       
   226 
       
   227       template<class Path>
       
   228       typename boost::enable_if<is_basic_path<Path>, void>::type
       
   229       open( const Path & file_ph, std::ios_base::openmode mode );
       
   230       void open( const wpath & file_ph, std::ios_base::openmode mode );
       
   231 
       
   232 #   endif
       
   233 
       
   234       explicit basic_fstream( const path & file_ph );
       
   235       basic_fstream( const path & file_ph, std::ios_base::openmode mode );
       
   236 #   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   237       void open( const path & file_ph );
       
   238       void open( const path & file_ph, std::ios_base::openmode mode );
       
   239 #   endif
       
   240       virtual ~basic_fstream() {}
       
   241 
       
   242     };
       
   243  
       
   244     typedef basic_filebuf<char> filebuf;
       
   245     typedef basic_ifstream<char> ifstream;
       
   246     typedef basic_ofstream<char> ofstream;
       
   247     typedef basic_fstream<char> fstream;
       
   248 
       
   249 # ifndef BOOST_FILESYSTEM_NARROW_ONLY
       
   250     typedef basic_filebuf<wchar_t> wfilebuf;
       
   251     typedef basic_ifstream<wchar_t> wifstream;
       
   252     typedef basic_fstream<wchar_t> wfstream;
       
   253     typedef basic_ofstream<wchar_t> wofstream;
       
   254 # endif
       
   255     
       
   256 # ifndef BOOST_FILESYSTEM_NARROW_ONLY
       
   257 
       
   258 //  basic_filebuf definitions  -----------------------------------------------//
       
   259 
       
   260     template <class charT, class traits>
       
   261     template<class Path>
       
   262     typename boost::enable_if<is_basic_path<Path>,
       
   263       basic_filebuf<charT,traits> *>::type
       
   264     basic_filebuf<charT,traits>::open( const Path & file_ph,
       
   265       std::ios_base::openmode mode )
       
   266     {
       
   267       return (std::basic_filebuf<charT,traits>::open( detail::path_proxy(
       
   268         file_ph.external_file_string(), mode ).c_str(), mode )
       
   269           == 0) ? 0 : this;
       
   270     }
       
   271 
       
   272     template <class charT, class traits>
       
   273     basic_filebuf<charT,traits> *
       
   274     basic_filebuf<charT, traits>::open( const wpath & file_ph,
       
   275       std::ios_base::openmode mode )
       
   276     {
       
   277       return this->BOOST_NESTED_TEMPLATE open<wpath>( file_ph, mode );
       
   278     }
       
   279 
       
   280 //  basic_ifstream definitions  ----------------------------------------------//
       
   281 
       
   282     template <class charT, class traits> template<class Path>
       
   283     basic_ifstream<charT,traits>::basic_ifstream(const Path & file_ph,
       
   284       typename boost::enable_if<is_basic_path<Path> >::type* )
       
   285       : std::basic_ifstream<charT,traits>(
       
   286         detail::path_proxy( file_ph.external_file_string(),
       
   287           std::ios_base::in ).c_str(), std::ios_base::in ) {}
       
   288 
       
   289     template <class charT, class traits>
       
   290     basic_ifstream<charT,traits>::basic_ifstream( const wpath & file_ph )
       
   291       : std::basic_ifstream<charT,traits>(
       
   292         detail::path_proxy( file_ph.external_file_string(),
       
   293           std::ios_base::in ).c_str(), std::ios_base::in ) {}
       
   294     
       
   295     template <class charT, class traits> template<class Path>
       
   296     basic_ifstream<charT,traits>::basic_ifstream( const Path & file_ph,
       
   297       std::ios_base::openmode mode,
       
   298       typename boost::enable_if<is_basic_path<Path> >::type* )
       
   299       : std::basic_ifstream<charT,traits>(
       
   300         detail::path_proxy( file_ph.external_file_string(),
       
   301           mode ).c_str(), mode | std::ios_base::in ) {}
       
   302 
       
   303     template <class charT, class traits>
       
   304     basic_ifstream<charT,traits>::basic_ifstream( const wpath & file_ph,
       
   305       std::ios_base::openmode mode )
       
   306       : std::basic_ifstream<charT,traits>(
       
   307         detail::path_proxy( file_ph.external_file_string(),
       
   308           mode ).c_str(), mode | std::ios_base::in ) {}
       
   309 
       
   310     template <class charT, class traits> template<class Path>
       
   311     typename boost::enable_if<is_basic_path<Path>, void>::type
       
   312     basic_ifstream<charT,traits>::open( const Path & file_ph )
       
   313     {
       
   314       std::basic_ifstream<charT,traits>::open(
       
   315         detail::path_proxy( file_ph.external_file_string(),
       
   316           std::ios_base::in ).c_str(), std::ios_base::in );
       
   317     }
       
   318 
       
   319     template <class charT, class traits>
       
   320     void basic_ifstream<charT,traits>::open( const wpath & file_ph )
       
   321     {
       
   322       std::basic_ifstream<charT,traits>::open(
       
   323         detail::path_proxy( file_ph.external_file_string(),
       
   324           std::ios_base::in ).c_str(), std::ios_base::in );
       
   325     }
       
   326     
       
   327     template <class charT, class traits> template<class Path>
       
   328     typename boost::enable_if<is_basic_path<Path>, void>::type
       
   329     basic_ifstream<charT,traits>::open( const Path & file_ph,
       
   330       std::ios_base::openmode mode )
       
   331     {
       
   332       std::basic_ifstream<charT,traits>::open(
       
   333         detail::path_proxy( file_ph.external_file_string(),
       
   334           mode ).c_str(), mode | std::ios_base::in );
       
   335     }
       
   336     
       
   337     template <class charT, class traits>
       
   338     void basic_ifstream<charT,traits>::open( const wpath & file_ph,
       
   339       std::ios_base::openmode mode )
       
   340     {
       
   341       std::basic_ifstream<charT,traits>::open(
       
   342         detail::path_proxy( file_ph.external_file_string(),
       
   343           mode ).c_str(), mode | std::ios_base::in );
       
   344     }
       
   345 
       
   346 //  basic_ofstream definitions  ----------------------------------------------//
       
   347 
       
   348     template <class charT, class traits> template<class Path>
       
   349     basic_ofstream<charT,traits>::basic_ofstream(const Path & file_ph,
       
   350       typename boost::enable_if<is_basic_path<Path> >::type* )
       
   351       : std::basic_ofstream<charT,traits>(
       
   352         detail::path_proxy( file_ph.external_file_string(),
       
   353           std::ios_base::out ).c_str(), std::ios_base::out ) {}
       
   354 
       
   355     template <class charT, class traits>
       
   356     basic_ofstream<charT,traits>::basic_ofstream( const wpath & file_ph )
       
   357       : std::basic_ofstream<charT,traits>(
       
   358         detail::path_proxy( file_ph.external_file_string(),
       
   359           std::ios_base::out ).c_str(), std::ios_base::out ) {}
       
   360 
       
   361     template <class charT, class traits> template<class Path>
       
   362     basic_ofstream<charT,traits>::basic_ofstream( const Path & file_ph,
       
   363       std::ios_base::openmode mode,
       
   364       typename boost::enable_if<is_basic_path<Path> >::type* )
       
   365       : std::basic_ofstream<charT,traits>(
       
   366         detail::path_proxy( file_ph.external_file_string(),
       
   367           mode ).c_str(), mode | std::ios_base::out ) {}
       
   368 
       
   369     template <class charT, class traits>
       
   370     basic_ofstream<charT,traits>::basic_ofstream( const wpath & file_ph,
       
   371       std::ios_base::openmode mode )
       
   372       : std::basic_ofstream<charT,traits>(
       
   373         detail::path_proxy( file_ph.external_file_string(),
       
   374           mode ).c_str(), mode | std::ios_base::out ) {}
       
   375     
       
   376     template <class charT, class traits> template<class Path>
       
   377     typename boost::enable_if<is_basic_path<Path>, void>::type
       
   378     basic_ofstream<charT,traits>::open( const Path & file_ph )
       
   379     {
       
   380       std::basic_ofstream<charT,traits>::open(
       
   381         detail::path_proxy( file_ph.external_file_string(),
       
   382           std::ios_base::out ).c_str(), std::ios_base::out );
       
   383     }
       
   384     
       
   385     template <class charT, class traits>
       
   386     void basic_ofstream<charT,traits>::open( const wpath & file_ph )
       
   387     {
       
   388       std::basic_ofstream<charT,traits>::open(
       
   389         detail::path_proxy( file_ph.external_file_string(),
       
   390           std::ios_base::out ).c_str(), std::ios_base::out );
       
   391     }
       
   392     
       
   393     template <class charT, class traits> template<class Path>
       
   394     typename boost::enable_if<is_basic_path<Path>, void>::type
       
   395     basic_ofstream<charT,traits>::open( const Path & file_ph,
       
   396       std::ios_base::openmode mode )
       
   397     {
       
   398       std::basic_ofstream<charT,traits>::open(
       
   399         detail::path_proxy( file_ph.external_file_string(),
       
   400           mode ).c_str(), mode | std::ios_base::out );
       
   401     }
       
   402 
       
   403     template <class charT, class traits>
       
   404     void basic_ofstream<charT,traits>::open( const wpath & file_ph,
       
   405       std::ios_base::openmode mode )
       
   406     {
       
   407       std::basic_ofstream<charT,traits>::open(
       
   408         detail::path_proxy( file_ph.external_file_string(),
       
   409           mode ).c_str(), mode | std::ios_base::out );
       
   410     }
       
   411 
       
   412 //  basic_fstream definitions  -----------------------------------------------//
       
   413 
       
   414     template <class charT, class traits> template<class Path>
       
   415     basic_fstream<charT,traits>::basic_fstream(const Path & file_ph,
       
   416       typename boost::enable_if<is_basic_path<Path> >::type* )
       
   417       : std::basic_fstream<charT,traits>(
       
   418         detail::path_proxy( file_ph.external_file_string(),
       
   419           std::ios_base::in|std::ios_base::out ).c_str(),
       
   420           std::ios_base::in|std::ios_base::out ) {}
       
   421 
       
   422     template <class charT, class traits>
       
   423     basic_fstream<charT,traits>::basic_fstream( const wpath & file_ph )
       
   424       : std::basic_fstream<charT,traits>(
       
   425         detail::path_proxy( file_ph.external_file_string(),
       
   426           std::ios_base::in|std::ios_base::out ).c_str(),
       
   427           std::ios_base::in|std::ios_base::out ) {}
       
   428 
       
   429     template <class charT, class traits> template<class Path>
       
   430     basic_fstream<charT,traits>::basic_fstream( const Path & file_ph,
       
   431       std::ios_base::openmode mode,
       
   432       typename boost::enable_if<is_basic_path<Path> >::type* )
       
   433       : std::basic_fstream<charT,traits>(
       
   434         detail::path_proxy( file_ph.external_file_string(),
       
   435           mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ) {}
       
   436     
       
   437     template <class charT, class traits>
       
   438     basic_fstream<charT,traits>::basic_fstream( const wpath & file_ph,
       
   439       std::ios_base::openmode mode )
       
   440       : std::basic_fstream<charT,traits>(
       
   441         detail::path_proxy( file_ph.external_file_string(),
       
   442           mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ) {}
       
   443       
       
   444     template <class charT, class traits> template<class Path>
       
   445     typename boost::enable_if<is_basic_path<Path>, void>::type
       
   446     basic_fstream<charT,traits>::open( const Path & file_ph )
       
   447     {
       
   448       std::basic_fstream<charT,traits>::open(
       
   449         detail::path_proxy( file_ph.external_file_string(),
       
   450           std::ios_base::in|std::ios_base::out ).c_str(),
       
   451           std::ios_base::in|std::ios_base::out );
       
   452     }
       
   453 
       
   454     template <class charT, class traits>
       
   455     void basic_fstream<charT,traits>::open( const wpath & file_ph )
       
   456     {
       
   457       std::basic_fstream<charT,traits>::open(
       
   458         detail::path_proxy( file_ph.external_file_string(),
       
   459           std::ios_base::in|std::ios_base::out ).c_str(),
       
   460           std::ios_base::in|std::ios_base::out );
       
   461     }
       
   462     
       
   463     template <class charT, class traits> template<class Path>
       
   464     typename boost::enable_if<is_basic_path<Path>, void>::type
       
   465     basic_fstream<charT,traits>::open( const Path & file_ph,
       
   466       std::ios_base::openmode mode )
       
   467     {
       
   468       std::basic_fstream<charT,traits>::open(
       
   469         detail::path_proxy( file_ph.external_file_string(),
       
   470           mode ).c_str(), mode | std::ios_base::in | std::ios_base::out );
       
   471     }
       
   472 
       
   473     template <class charT, class traits>
       
   474     void basic_fstream<charT,traits>::open( const wpath & file_ph,
       
   475       std::ios_base::openmode mode )
       
   476     {
       
   477       std::basic_fstream<charT,traits>::open(
       
   478         detail::path_proxy( file_ph.external_file_string(),
       
   479           mode ).c_str(), mode | std::ios_base::in | std::ios_base::out );
       
   480     }
       
   481 
       
   482 # endif
       
   483 
       
   484 #  if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   485     template <class charT, class traits>
       
   486     basic_filebuf<charT,traits> *
       
   487     basic_filebuf<charT, traits>::open( const path & file_ph,
       
   488       std::ios_base::openmode mode )
       
   489     {
       
   490       return std::basic_filebuf<charT,traits>::open(
       
   491         file_ph.file_string().c_str(), mode ) == 0 ? 0 : this;
       
   492     }
       
   493 #  endif
       
   494 
       
   495     template <class charT, class traits>
       
   496     basic_ifstream<charT,traits>::basic_ifstream( const path & file_ph )
       
   497       : std::basic_ifstream<charT,traits>(
       
   498           file_ph.file_string().c_str(), std::ios_base::in ) {}
       
   499 
       
   500     template <class charT, class traits>
       
   501     basic_ifstream<charT,traits>::basic_ifstream( const path & file_ph,
       
   502       std::ios_base::openmode mode )
       
   503       : std::basic_ifstream<charT,traits>(
       
   504           file_ph.file_string().c_str(), mode ) {}
       
   505     
       
   506 #   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   507     template <class charT, class traits>
       
   508     void basic_ifstream<charT,traits>::open( const path & file_ph )
       
   509     {
       
   510       std::basic_ifstream<charT,traits>::open(
       
   511         file_ph.file_string().c_str(), std::ios_base::in );
       
   512     }
       
   513     
       
   514     template <class charT, class traits>
       
   515     void basic_ifstream<charT,traits>::open( const path & file_ph,
       
   516       std::ios_base::openmode mode )
       
   517     {
       
   518       std::basic_ifstream<charT,traits>::open(
       
   519         file_ph.file_string().c_str(), mode );
       
   520     }
       
   521 #   endif
       
   522 
       
   523     template <class charT, class traits>
       
   524     basic_ofstream<charT,traits>::basic_ofstream( const path & file_ph )
       
   525       : std::basic_ofstream<charT,traits>(
       
   526           file_ph.file_string().c_str(), std::ios_base::out ) {}
       
   527 
       
   528     template <class charT, class traits>
       
   529     basic_ofstream<charT,traits>::basic_ofstream( const path & file_ph,
       
   530       std::ios_base::openmode mode )
       
   531       : std::basic_ofstream<charT,traits>(
       
   532           file_ph.file_string().c_str(), mode ) {}
       
   533     
       
   534 #   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   535     template <class charT, class traits>
       
   536     void basic_ofstream<charT,traits>::open( const path & file_ph )
       
   537     {
       
   538       std::basic_ofstream<charT,traits>::open(
       
   539         file_ph.file_string().c_str(), std::ios_base::out );
       
   540     }
       
   541     
       
   542     template <class charT, class traits>
       
   543     void basic_ofstream<charT,traits>::open( const path & file_ph,
       
   544       std::ios_base::openmode mode )
       
   545     {
       
   546       std::basic_ofstream<charT,traits>::open(
       
   547         file_ph.file_string().c_str(), mode );
       
   548     }
       
   549 #   endif
       
   550 
       
   551     template <class charT, class traits>
       
   552     basic_fstream<charT,traits>::basic_fstream( const path & file_ph )
       
   553       : std::basic_fstream<charT,traits>(
       
   554           file_ph.file_string().c_str(),
       
   555           std::ios_base::in|std::ios_base::out ) {}
       
   556 
       
   557 
       
   558     template <class charT, class traits>
       
   559     basic_fstream<charT,traits>::basic_fstream( const path & file_ph,
       
   560       std::ios_base::openmode mode )
       
   561       : std::basic_fstream<charT,traits>(
       
   562           file_ph.file_string().c_str(), mode ) {}
       
   563 
       
   564 #   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
       
   565     template <class charT, class traits>
       
   566     void basic_fstream<charT,traits>::open( const path & file_ph )
       
   567     {
       
   568       std::basic_fstream<charT,traits>::open(
       
   569         file_ph.file_string().c_str(), std::ios_base::in|std::ios_base::out );
       
   570     }
       
   571 
       
   572     template <class charT, class traits>
       
   573     void basic_fstream<charT,traits>::open( const path & file_ph,
       
   574       std::ios_base::openmode mode )
       
   575     {
       
   576       std::basic_fstream<charT,traits>::open(
       
   577         file_ph.file_string().c_str(), mode );
       
   578     }
       
   579 #   endif
       
   580   } // namespace filesystem
       
   581 } // namespace boost
       
   582 
       
   583 #include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
       
   584 #endif  // BOOST_FILESYSTEM_FSTREAM_HPP