|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r50459 - in sandbox/filesystem-v3: boost/filesystem libs/filesystem/src
From: bdawes_at_[hidden]
Date: 2009-01-04 10:24:30
Author: bemandawes
Date: 2009-01-04 10:24:30 EST (Sun, 04 Jan 2009)
New Revision: 50459
URL: http://svn.boost.org/trac/boost/changeset/50459
Log:
filesystem.v3: get ready for POSIX
Text files modified:
sandbox/filesystem-v3/boost/filesystem/path.hpp | 152 +++++++++++++--------------------------
sandbox/filesystem-v3/libs/filesystem/src/path.cpp | 45 +++++++---
2 files changed, 81 insertions(+), 116 deletions(-)
Modified: sandbox/filesystem-v3/boost/filesystem/path.hpp
==============================================================================
--- sandbox/filesystem-v3/boost/filesystem/path.hpp (original)
+++ sandbox/filesystem-v3/boost/filesystem/path.hpp 2009-01-04 10:24:30 EST (Sun, 04 Jan 2009)
@@ -18,6 +18,7 @@
* Windows, POSIX, conversions for char16_t, char32_t for supporting compilers.
* Windows, POSIX, conversions for user-defined types.
+ * Fix inserter/extractor problems; see comments in commented out code below.
* Need an error category for codecvt errors. Seed path.cpp detail::append, etc.
* Add Alternate Data Stream test cases. See http://en.wikipedia.org/wiki/NTFS Features.
* test case: relational on paths differing only in trailing separator. rationale?
@@ -132,73 +133,6 @@
};
//------------------------------------------------------------------------------------//
- // implementation details //
- //------------------------------------------------------------------------------------//
-
- namespace detail
- {
-
-# ifdef BOOST_WINDOWS_API
-
- BOOST_FILESYSTEM_DECL
- void append( const char * begin,
- const char * end, // 0 for null terminated MBCS
- std::wstring & target, system::error_code & ec );
-
- BOOST_FILESYSTEM_DECL
- std::string convert_to_string( const std::wstring & src, system::error_code & ec );
-
-# else // BOOST_POSIX_API
-
- typedef std::string string_type;
- typedef string_type::value_type value_type;
- typedef string_type::size_type size_type;
-
- // See comment at equivalent location in Windows API detail above
-
- // ----- char[] to string -----
-
- inline void append( const char * begin,
- const char * end, // 0 for null terminated MBCS
- std::string & target,
- system::error_code & ec )
- {
- ec.clear();
- target.assign( begin, end ); // but what if this throws bad_alloc?
- }
-
- inline void append( const char * begin, std::string & target,
- system::error_code & ec )
- {
- ec.clear();
- target += begin; // but what if throws bad_alloc?
- }
-
-# ifndef BOOST_FILESYSTEM_NARROW_ONLY
-
- // ----- wchar_t[] to string -----
-
- inline void append( const wchar_t * begin, const wchar_t * end,
- std::string & target, system::error_code & ec );
-
- inline void append( const wchar_t * begin, std::string & target,
- system::error_code & ec )
- {
- append( begin, 0, target, ec );
- }
-
- // ----- convert ----
-
- BOOST_FILESYSTEM_DECL
- std::wstring convert_to_wstring( const std::string & src, system::error_code & ec );
-
-# endif
-
-# endif // BOOST_POSIX_API
-
-} // namespace detail
-
- //------------------------------------------------------------------------------------//
// //
// path_traits //
// //
@@ -211,14 +145,15 @@
namespace path_traits
{
-
- // path representation type
+
#ifdef BOOST_WINDOWS_API
- typedef std::wstring string_type;
+ typedef std::wstring string_type; // path internal representation type
#else
- typedef std::string string_type;
+ typedef std::string string_type;
#endif
+ typedef string_type::value_type value_type;
+
template< class I > struct is_iterator { static const bool value = false; };
template< class C > struct is_container { static const bool value = false; };
@@ -236,10 +171,39 @@
template< class String > // specialization required
String convert( const string_type & source, system::error_code & ec );
+} // namespace path_traits
+
//------------------------------------------------------------------------------------//
- // specializations //
+ // implementation details //
//------------------------------------------------------------------------------------//
+namespace detail
+{
+#ifdef BOOST_WINDOWS_API
+ typedef std::string extern_string_type;
+#else
+ typedef std::wstring extern_string_type;
+#endif
+
+ typedef extern_string_type::value_type extern_value_type;
+
+ BOOST_FILESYSTEM_DECL
+ void append( const extern_value_type * begin,
+ const extern_value_type * end, // 0 for null terminated MBCS
+ path_traits::string_type & target, system::error_code & ec );
+
+ BOOST_FILESYSTEM_DECL
+ extern_string_type convert_to_string( const path_traits::string_type & src,
+ system::error_code & ec );
+
+} // namespace detail
+
+ //------------------------------------------------------------------------------------//
+ // path_traits specializations //
+ //------------------------------------------------------------------------------------//
+
+namespace path_traits
+{
template<> struct is_iterator<const char *> { static const bool value = true; };
template<> struct is_iterator<char *> { static const bool value = true; };
template<> struct is_iterator<std::string::iterator> { static const bool value = true; };
@@ -257,7 +221,7 @@
const string_type::value_type * end, string_type & target, system::error_code & ec )
{
ec.clear();
- target.assign( begin, end ); // but what if throws bad_alloc?
+ target.assign( begin, end ); // TODO: what if throws bad_alloc?
}
template<>
@@ -265,40 +229,38 @@
string_type & target, system::error_code & ec )
{
ec.clear();
- target += begin; // but what if throws bad_alloc?
+ target += begin; // TODO: what if throws bad_alloc?
}
template<>
inline string_type convert<string_type>( const string_type & s, system::error_code & ec )
{
+ if ( &ec != &system::throws ) ec.clear();
return s;
}
-# ifdef BOOST_WINDOWS_API
-
template<>
- inline void append<char>( const char * begin, const char * end,
- std::wstring & target, system::error_code & ec )
+ inline void append<char>( const detail::extern_value_type * begin,
+ const detail::extern_value_type * end,
+ string_type & target, system::error_code & ec )
{
detail::append( begin, end, target, ec );
}
template<>
- inline void append<char>( const char * begin, std::wstring & target,
- system::error_code & ec )
+ inline void append<char>( const detail::extern_value_type * begin,
+ string_type & target, system::error_code & ec )
{
detail::append( begin, 0, target, ec );
}
template<>
- inline std::string convert<std::string>( const std::wstring & s,
+ inline detail::extern_string_type convert<std::string>( const string_type & s,
system::error_code & ec )
{
return detail::convert_to_string( s, ec );
}
-# endif
-
# ifdef BOOST_FILESYSTEM_CPP0X_CHAR_TYPES
...
# endif
@@ -545,25 +507,17 @@
// return formatted "as input"
-# ifdef BOOST_WINDOWS_API
-
- operator const std::string() const { return detail::convert_to_string( m_path, system::throws ); }
- operator const std::wstring&() const { return m_path; }
+ operator const string_type&() const { return m_path; }
+ operator const detail::extern_string_type() const
+ {
+ return detail::convert_to_string( m_path, system::throws );
+ }
# ifdef BOOST_FILESYSTEM_CPP0X_CHAR_TYPES
operator const std::u16string() const { return detail::convert_to_u16string( m_path, system::throws ); }
operator const std::u32string() const { return detail::convert_to_u32string( m_path, system::throws ); }
# endif
-# else // BOOST_POSIX_API
-
- operator const std::string&() const { return m_path; }
-# ifndef BOOST_FILESYSTEM_NARROW_ONLY
- operator const std::wstring() const { return detail::convert( m_path, system::throws ); }
-# endif
-
-# endif
-
// ----- observers -----
// For operating systems that format file paths differently than directory
@@ -586,17 +540,13 @@
const std::wstring & wstring() const { return m_path; }
const std::wstring & wstring( system::error_code & ec ) const { ec.clear(); return m_path; }
-# ifdef BOOST_FILESYSTEM_CPP0X_CHAR_TYPES
- ...
-# endif
-
# else // BOOST_POSIX_API
// return value is formatted "as input"
const std::string & string() const { return m_path; }
const std::string & string( system::error_code & ec ) const { ec.clear(); return m_path; }
# ifndef BOOST_FILESYSTEM_NARROW_ONLY
- const std::wstring wstring( system::error_code & ec = system::throws ) const { return detail::convert( m_path, ec ); }
+ const std::wstring wstring( system::error_code & ec = system::throws ) const { return detail::convert_to_string( m_path, ec ); }
# endif
# endif
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-01-04 10:24:30 EST (Sun, 04 Jan 2009)
@@ -149,9 +149,7 @@
return tmp;
}
-# else // BOOST_POSIX_API
- ...
-# endif // BOOST_POSIX_API
+# endif // BOOST_WINDOWS_PATH
// append_separator_if_needed_ -------------------------------------------//
@@ -581,6 +579,8 @@
namespace
{
+# ifdef BOOST_WINDOWS_API
+
//------------------------------------------------------------------------------------//
// //
// class windows_file_api_codecvt_facet //
@@ -659,6 +659,7 @@
*to_next = '\0';
return ok;
}
+# endif // BOOST_WINDOWS_API
//------------------------------------------------------------------------------------//
// locale helpers //
@@ -671,9 +672,14 @@
std::locale default_locale()
{
+# ifdef BOOST_WINDOWS_API
std::locale global_loc = std::locale();
std::locale loc( global_loc, new windows_file_api_codecvt_facet );
return loc;
+# else
+ // ISO C calls this "the locale-specific native environment":
+ return std::locale loc("");
+# endif
}
std::locale & path_locale()
@@ -736,6 +742,13 @@
namespace detail
{
+# ifdef BOOST_WINDOWS_API
+# define APPEND_DIRECTION in
+# define CONVERT_DIRECTION out
+# else
+# define APPEND_DIRECTION out
+# define CONVERT_DIRECTION in
+# endif
//------------------------------------------------------------------------------------//
// append //
@@ -743,15 +756,16 @@
// actual append done here to factor it out from messy buffer management code;
// this function just assumes the buffer is large enough.
- inline void do_append( const char * from, const char * from_end,
- wchar_t * to, wchar_t * to_end,
- wstring & target, error_code & ec )
+ inline void do_append(
+ const extern_value_type * from, const extern_value_type * from_end,
+ value_type * to, value_type * to_end,
+ string_type & target, error_code & ec )
{
std::mbstate_t state = std::mbstate_t(); // perhaps unneeded, but cuts bug reports
- const char * from_next;
- wchar_t * to_next;
+ const extern_value_type * from_next;
+ value_type * to_next;
- if ( wchar_t_codecvt_facet()->in( state, from, from_end, from_next,
+ if ( wchar_t_codecvt_facet()->APPEND_DIRECTION( state, from, from_end, from_next,
to, to_end, to_next ) != std::codecvt_base::ok )
{
assert( 0 && "append error handling not implemented yet" );
@@ -762,7 +776,8 @@
}
BOOST_FILESYSTEM_DECL
- void append( const char * begin, const char * end, wstring & target, error_code & ec )
+ void append( const extern_value_type * begin, const extern_value_type * end,
+ string_type & target, error_code & ec )
{
if ( !end )
end = begin + std::strlen(begin);
@@ -783,7 +798,7 @@
}
else
{
- wchar_t buf[default_codecvt_buf_size];
+ value_type buf[default_codecvt_buf_size];
do_append( begin, end, buf, buf+buf_size, target, ec );
}
}
@@ -801,7 +816,7 @@
const wchar_t * from_next;
char * to_next;
- if ( wchar_t_codecvt_facet()->out( state, from, from_end,
+ if ( wchar_t_codecvt_facet()->CONVERT_DIRECTION( state, from, from_end,
from_next, to, to_end, to_next ) != std::codecvt_base::ok )
{
assert( 0 && "convert error handling not implemented yet" );
@@ -812,7 +827,7 @@
}
BOOST_FILESYSTEM_DECL
- string convert_to_string( const wstring & src, error_code & ec )
+ extern_string_type convert_to_string( const string_type & src, error_code & ec )
{
if ( src.empty() )
{
@@ -830,13 +845,13 @@
// dynamically allocate a buffer only if source is unusually large
if ( buf_size > default_codecvt_buf_size )
{
- boost::scoped_array< char > buf( new char [buf_size] );
+ boost::scoped_array< char > buf( new extern_value_type [buf_size] );
return do_convert( src.c_str(), src.c_str()+src.size(),
buf.get(), buf.get()+buf_size, ec );
}
else
{
- char buf[default_codecvt_buf_size];
+ extern_value_type buf[default_codecvt_buf_size];
return do_convert( src.c_str(), src.c_str()+src.size(), buf, buf+buf_size, ec );
}
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk