📄 path.hpp
字号:
typedef iterator const_iterator;
iterator begin() const;
iterator end() const;
private:
// Note: This is an implementation for POSIX and Windows, where there
// are only minor differences between generic and native path grammars.
// Private members might be quite different in other implementations,
// particularly where there were wide differences between portable and
// native path formats, or between file_string() and
// directory_string() formats, or simply that the implementation
// was willing expend additional memory to achieve greater speed for
// some operations at the expense of other operations.
string_type m_path; // invariant: portable path grammar
// on Windows, backslashes converted to slashes
# ifdef BOOST_CYGWIN_PATH
bool m_cygwin_root; // if present, m_path[0] was slash. note: initialization
// done by append
# endif
void m_append_separator_if_needed();
void m_append( value_type value ); // converts Windows alt_separator
// Was qualified; como433beta8 reports:
// warning #427-D: qualified name is not allowed in member declaration
friend class iterator;
friend class boost::BOOST_FILESYSTEM_NAMESPACE::detail::iterator_helper<path_type>;
// Deprecated features ease transition for existing code. Don't use these
// in new code.
# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
public:
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 );}
string_type native_file_string() const { return file_string(); }
string_type native_directory_string() const { return directory_string(); }
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
};
// basic_path non-member functions ---------------------------------------//
template< class String, class Traits >
inline void swap( basic_path<String, Traits> & lhs,
basic_path<String, Traits> & rhs ) { lhs.swap( rhs ); }
template< class String, class Traits >
bool operator<( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs )
{
return std::lexicographical_compare(
lhs.begin(), lhs.end(), rhs.begin(), rhs.end() );
}
template< class String, class Traits >
bool operator<( const typename basic_path<String, Traits>::string_type::value_type * lhs,
const basic_path<String, Traits> & rhs )
{
basic_path<String, Traits> tmp( lhs );
return std::lexicographical_compare(
tmp.begin(), tmp.end(), rhs.begin(), rhs.end() );
}
template< class String, class Traits >
bool operator<( const typename basic_path<String, Traits>::string_type & lhs,
const basic_path<String, Traits> & rhs )
{
basic_path<String, Traits> tmp( lhs );
return std::lexicographical_compare(
tmp.begin(), tmp.end(), rhs.begin(), rhs.end() );
}
template< class String, class Traits >
bool operator<( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type::value_type * rhs )
{
basic_path<String, Traits> tmp( rhs );
return std::lexicographical_compare(
lhs.begin(), lhs.end(), tmp.begin(), tmp.end() );
}
template< class String, class Traits >
bool operator<( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type & rhs )
{
basic_path<String, Traits> tmp( rhs );
return std::lexicographical_compare(
lhs.begin(), lhs.end(), tmp.begin(), tmp.end() );
}
template< class String, class Traits >
inline bool operator==( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs )
{
return !(lhs < rhs) && !(rhs < lhs);
}
template< class String, class Traits >
inline bool operator==( const typename basic_path<String, Traits>::string_type::value_type * lhs,
const basic_path<String, Traits> & rhs )
{
basic_path<String, Traits> tmp( lhs );
return !(tmp < rhs) && !(rhs < tmp);
}
template< class String, class Traits >
inline bool operator==( const typename basic_path<String, Traits>::string_type & lhs,
const basic_path<String, Traits> & rhs )
{
basic_path<String, Traits> tmp( lhs );
return !(tmp < rhs) && !(rhs < tmp);
}
template< class String, class Traits >
inline bool operator==( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type::value_type * rhs )
{
basic_path<String, Traits> tmp( rhs );
return !(lhs < tmp) && !(tmp < lhs);
}
template< class String, class Traits >
inline bool operator==( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type & rhs )
{
basic_path<String, Traits> tmp( rhs );
return !(lhs < tmp) && !(tmp < lhs);
}
template< class String, class Traits >
inline bool operator!=( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs ) { return !(lhs == rhs); }
template< class String, class Traits >
inline bool operator!=( const typename basic_path<String, Traits>::string_type::value_type * lhs,
const basic_path<String, Traits> & rhs ) { return !(basic_path<String, Traits>(lhs) == rhs); }
template< class String, class Traits >
inline bool operator!=( const typename basic_path<String, Traits>::string_type & lhs,
const basic_path<String, Traits> & rhs ) { return !(basic_path<String, Traits>(lhs) == rhs); }
template< class String, class Traits >
inline bool operator!=( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type::value_type * rhs )
{ return !(lhs == basic_path<String, Traits>(rhs)); }
template< class String, class Traits >
inline bool operator!=( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type & rhs )
{ return !(lhs == basic_path<String, Traits>(rhs)); }
template< class String, class Traits >
inline bool operator>( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs ) { return rhs < lhs; }
template< class String, class Traits >
inline bool operator>( const typename basic_path<String, Traits>::string_type::value_type * lhs,
const basic_path<String, Traits> & rhs ) { return rhs < basic_path<String, Traits>(lhs); }
template< class String, class Traits >
inline bool operator>( const typename basic_path<String, Traits>::string_type & lhs,
const basic_path<String, Traits> & rhs ) { return rhs < basic_path<String, Traits>(lhs); }
template< class String, class Traits >
inline bool operator>( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type::value_type * rhs )
{ return basic_path<String, Traits>(rhs) < lhs; }
template< class String, class Traits >
inline bool operator>( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type & rhs )
{ return basic_path<String, Traits>(rhs) < lhs; }
template< class String, class Traits >
inline bool operator<=( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs ) { return !(rhs < lhs); }
template< class String, class Traits >
inline bool operator<=( const typename basic_path<String, Traits>::string_type::value_type * lhs,
const basic_path<String, Traits> & rhs ) { return !(rhs < basic_path<String, Traits>(lhs)); }
template< class String, class Traits >
inline bool operator<=( const typename basic_path<String, Traits>::string_type & lhs,
const basic_path<String, Traits> & rhs ) { return !(rhs < basic_path<String, Traits>(lhs)); }
template< class String, class Traits >
inline bool operator<=( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type::value_type * rhs )
{ return !(basic_path<String, Traits>(rhs) < lhs); }
template< class String, class Traits >
inline bool operator<=( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type & rhs )
{ return !(basic_path<String, Traits>(rhs) < lhs); }
template< class String, class Traits >
inline bool operator>=( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs ) { return !(lhs < rhs); }
template< class String, class Traits >
inline bool operator>=( const typename basic_path<String, Traits>::string_type::value_type * lhs,
const basic_path<String, Traits> & rhs ) { return !(lhs < basic_path<String, Traits>(rhs)); }
template< class String, class Traits >
inline bool operator>=( const typename basic_path<String, Traits>::string_type & lhs,
const basic_path<String, Traits> & rhs ) { return !(lhs < basic_path<String, Traits>(rhs)); }
template< class String, class Traits >
inline bool operator>=( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type::value_type * rhs )
{ return !(basic_path<String, Traits>(lhs) < rhs); }
template< class String, class Traits >
inline bool operator>=( const basic_path<String, Traits> & lhs,
const typename basic_path<String, Traits>::string_type & rhs )
{ return !(basic_path<String, Traits>(lhs) < rhs); }
// operator /
template< class String, class Traits >
inline basic_path<String, Traits> operator/(
const basic_path<String, Traits> & lhs,
const basic_path<String, Traits> & rhs )
{ return basic_path<String, Traits>( lhs ) /= rhs; }
template< class String, class Traits >
inline basic_path<String, Traits> operator/(
const basic_path<String, Traits> & lhs,
const typename String::value_type * rhs )
{ return basic_path<String, Traits>( lhs ) /=
basic_path<String, Traits>( rhs ); }
template< class String, class Traits >
inline basic_path<String, Traits> operator/(
const basic_path<String, Traits> & lhs, const String & rhs )
{ return basic_path<String, Traits>( lhs ) /=
basic_path<String, Traits>( rhs ); }
template< class String, class Traits >
inline basic_path<String, Traits> operator/(
const typename String::value_type * lhs,
const basic_path<String, Traits> & rhs )
{ return basic_path<String, Traits>( lhs ) /= rhs; }
template< class String, class Traits >
inline basic_path<String, Traits> operator/(
const String & lhs, const basic_path<String, Traits> & rhs )
{ return basic_path<String, Traits>( lhs ) /= rhs; }
// inserters and extractors --------------------------------------------//
// bypass VC++ 7.0 and earlier, and broken Borland compilers
# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
template< class Path >
std::basic_ostream< typename Path::string_type::value_type,
typename Path::string_type::traits_type > &
operator<<
( std::basic_ostream< typename Path::string_type::value_type,
typename Path::string_type::traits_type >& os, const Path & ph )
{
os << ph.string();
return os;
}
template< class Path >
std::basic_istream< typename Path::string_type::value_type,
typename Path::string_type::traits_type > &
operator>>
( std::basic_istream< typename Path::string_type::value_type,
typename Path::string_type::traits_type >& is, Path & ph )
{
typename Path::string_type str;
is >> str;
ph = str;
return is;
}
# elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
template< class String, class Traits >
std::basic_ostream< BOOST_DEDUCED_TYPENAME String::value_type,
BOOST_DEDUCED_TYPENAME String::traits_type > &
operator<<
( std::basic_ostream< BOOST_DEDUCED_TYPENAME String::value_type,
BOOST_DEDUCED_TYPENAME String::traits_type >& os,
const basic_path< String, Traits > & ph )
{
os << ph.string();
return os;
}
template< class String, class Traits >
std::basic_istream< BOOST_DEDUCED_TYPENAME String::value_type,
BOOST_DEDUCED_TYPENAME String::traits_type > &
operator>>
( std::basic_istream< BOOST_DEDUCED_TYPENAME String::value_type,
BOOST_DEDUCED_TYPENAME String::traits_type> & is,
basic_path< String, Traits > & ph )
{
String str;
is >> str;
ph = str;
return is;
}
# endif
// path::name_checks -----------------------------------------------------//
BOOST_FILESYSTEM_DECL bool portable_posix_name( const std::string & name );
BOOST_FILESYSTEM_DECL bool windows_name( const std::string & name );
BOOST_FILESYSTEM_DECL bool portable_name( const std::string & name );
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 );
inline bool no_check( const std::string & )
{ return true; }
// implementation -----------------------------------------------------------//
namespace detail
{
// is_separator helper ------------------------------------------------//
template<class Path>
inline bool is_separator( typename Path::string_type::value_type c )
{
return c == slash<Path>::value
# ifdef BOOST_WINDOWS_PATH
|| c == path_alt_separator<Path>::value
# endif
;
}
// leaf_pos helper ----------------------------------------------------//
template<class String, class Traits>
typename String::size_type leaf_pos(
const String & str, // precondition: portable generic path grammar
typename String::size_type end_pos ) // end_pos is past-the-end position
// return 0 if str itself is leaf (or empty)
{
typedef typename
boost::BOOST_FILESYSTEM_NAMESPACE::basic_path<String, Traits> path_type;
// case: "//"
if ( end_pos == 2
&& str[0] == slash<path_type>::value
&& str[1] == slash<path_type>::value ) return 0;
// case: ends in "/"
if ( end_pos && str[end_pos-1] == slash<path_type>::value )
return end_pos-1;
// set pos to start of last element
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -