?? path.hpp
字號:
class_type &concat_(class_type const &rhs);
static char_type const *next_slash_or_end(char_type const *p);
static char_type path_name_separator_alt();
// Members
private:
typedef basic_file_path_buffer< char_type
, allocator_type
> buffer_type;
struct part
{
enum Type
{
normal
, dot
, dotdot
};
size_type len;
char_type const *p;
Type type;
};
buffer_type m_buffer;
size_type m_len;
};
/* /////////////////////////////////////////////////////////////////////////
* Typedefs for commonly encountered types
*/
/// Instantiation of the basic_path template for the ANSI character type \c char
typedef basic_path<ws_char_a_t, filesystem_traits<ws_char_a_t> > path_a;
/// Instantiation of the basic_path template for the Unicode character type \c wchar_t
typedef basic_path<ws_char_w_t, filesystem_traits<ws_char_w_t> > path_w;
/// Instantiation of the basic_path template for the Win32 character type \c TCHAR
typedef basic_path<TCHAR, filesystem_traits<TCHAR> > path;
/* /////////////////////////////////////////////////////////////////////////
* Support for PlatformSTL redefinition by inheritance+namespace, for confused
* compilers (e.g. VC++ 6)
*/
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
template< ss_typename_param_k C
# ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
, ss_typename_param_k T = filesystem_traits<C>
, ss_typename_param_k A = processheap_allocator<C>
# else /* ? STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT */
, ss_typename_param_k T /* = filesystem_traits<C> */
, ss_typename_param_k A /* = processheap_allocator<C> */
# endif /* STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT */
>
class basic_path__
: public winstl_ns_qual(basic_path)<C, T, A>
{
private:
typedef winstl_ns_qual(basic_path)<C, T, A> parent_class_type;
typedef winstl_ns_qual(basic_path__)<C, T, A> class_type;
public:
typedef ss_typename_type_k parent_class_type::char_type char_type;
typedef ss_typename_type_k parent_class_type::traits_type traits_type;
typedef ss_typename_type_k parent_class_type::allocator_type allocator_type;
typedef ss_typename_type_k parent_class_type::size_type size_type;
public:
basic_path__()
: parent_class_type()
{}
ss_explicit_k basic_path__(char_type const *path)
: parent_class_type(path)
{}
# ifdef STLSOFT_CF_MEMBER_TEMPLATE_CTOR_SUPPORT
/// Constructs a path from \c path
template<ss_typename_param_k S>
ss_explicit_k basic_path__(S const &s)
: parent_class_type(s)
{}
# endif /* STLSOFT_CF_MEMBER_TEMPLATE_CTOR_SUPPORT */
basic_path__(char_type const *path, size_type cch)
: parent_class_type(path, cch)
{}
basic_path__(class_type const &rhs)
: parent_class_type(rhs)
{}
class_type &operator =(class_type const &rhs)
{
parent_class_type::operator =(rhs);
return *this;
}
class_type &operator =(char_type const *rhs)
{
parent_class_type::operator =(rhs);
return *this;
}
# ifdef STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
template<ss_typename_param_k S>
class_type &operator =(S const &s)
{
parent_class_type::operator =(s);
return *this;
}
# endif /* STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
};
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/* /////////////////////////////////////////////////////////////////////////
* Operators
*/
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_bool_t operator ==(basic_path<C, T, A> const &lhs, ss_typename_type_k basic_path<C, T, A>::char_type const *rhs)
{
return lhs.equal(rhs);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_bool_t operator !=(basic_path<C, T, A> const &lhs, ss_typename_type_k basic_path<C, T, A>::char_type const *rhs)
{
return !lhs.equal(rhs);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_bool_t operator ==(ss_typename_type_k basic_path<C, T, A>::char_type const *lhs, basic_path<C, T, A> const &rhs)
{
return rhs.equal(lhs);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_bool_t operator !=(ss_typename_type_k basic_path<C, T, A>::char_type const *lhs, basic_path<C, T, A> const &rhs)
{
return !rhs.equal(lhs);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_bool_t operator ==(basic_path<C, T, A> const &lhs, basic_path<C, T, A> const &rhs)
{
return lhs.equal(rhs);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_bool_t operator !=(basic_path<C, T, A> const &lhs, basic_path<C, T, A> const &rhs)
{
return !lhs.equal(rhs);
}
// operator /
/// \brief Concatenates \c rhs to the path \c lhs
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_path<C, T, A> operator /(basic_path<C, T, A> const &lhs, ss_typename_type_k basic_path<C, T, A>::char_type const *rhs)
{
return basic_path<C, T, A>(lhs) /= rhs;
}
/// \brief Concatenates \c rhs to the path \c lhs
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_path<C, T, A> operator /(ss_typename_type_k basic_path<C, T, A>::char_type const *lhs, basic_path<C, T, A> const &rhs)
{
return basic_path<C, T, A>(lhs) /= rhs;
}
/// \brief Concatenates \c rhs to the path \c lhs
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_path<C, T, A> operator /(basic_path<C, T, A> const &lhs, basic_path<C, T, A> const &rhs)
{
return basic_path<C, T, A>(lhs) /= rhs;
}
/* /////////////////////////////////////////////////////////////////////////
* Helper functions
*/
#if !defined(STLSOFT_COMPILER_IS_MSVC) || \
_MSC_VER >= 1100
/// This helper function makes a path variable without needing to
/// qualify the template parameter.
template<ss_typename_param_k C>
inline basic_path<C> make_path(C const *path)
{
return basic_path<C>(path);
}
#endif /* compiler */
/* /////////////////////////////////////////////////////////////////////////
* swapping
*/
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline void swap(basic_path<C, T, A> &lhs, basic_path<C, T, A> &rhs)
{
lhs.swap(rhs);
}
/* /////////////////////////////////////////////////////////////////////////
* Shims
*/
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline C const *c_str_ptr_null(basic_path<C, T, A> const &b)
{
return stlsoft_ns_qual(c_str_ptr_null)(b.c_str());
}
template< ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_char_a_t const *c_str_ptr_null_a(basic_path<ws_char_a_t, T, A> const &b)
{
return stlsoft_ns_qual(c_str_ptr_null_a)(b.c_str());
}
template< ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_char_w_t const *c_str_ptr_null_w(basic_path<ws_char_w_t, T, A> const &b)
{
return stlsoft_ns_qual(c_str_ptr_null_w)(b.c_str());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline C const *c_str_ptr(basic_path<C, T, A> const &b)
{
return b.c_str();
}
template< ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_char_a_t const *c_str_ptr_a(basic_path<ws_char_a_t, T, A> const &b)
{
return b.c_str();
}
template< ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_char_w_t const *c_str_ptr_w(basic_path<ws_char_w_t, T, A> const &b)
{
return b.c_str();
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline C const *c_str_data(basic_path<C, T, A> const &b)
{
return b.c_str();
}
template< ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_char_a_t const *c_str_data_a(basic_path<ws_char_a_t, T, A> const &b)
{
return b.c_str();
}
template< ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_char_w_t const *c_str_data_w(basic_path<ws_char_w_t, T, A> const &b)
{
return b.c_str();
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_size_t c_str_len(basic_path<C, T, A> const &b)
{
return stlsoft_ns_qual(c_str_len)(b.c_str());
}
#if 0
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ws_size_t c_str_size(basic_path<C, T, A> const &b)
{
return stlsoft_ns_qual(c_str_size)(b.c_str());
}
#endif /* 0 */
template< ss_typename_param_k S
, ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline S &operator <<(S & s, basic_path<C, T, A> const &b)
{
s << b.c_str();
return s;
}
////////////////////////////////////////////////////////////////////////////
// Unit-testing
#ifdef STLSOFT_UNITTEST
# include "./unittest/path_unittest_.h"
#endif /* STLSOFT_UNITTEST */
////////////////////////////////////////////////////////////////////////////
// Implementation
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline /* static */ ss_typename_param_k basic_path<C, T, A>::char_type const *basic_path<C, T, A>::next_slash_or_end(ss_typename_param_k basic_path<C, T, A>::char_type const *p)
{
for(; ; )
{
switch(*p)
{
case '/':
case '\\':
++p;
case '\0':
return p;
default:
++p;
break;
}
}
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline /* static */ ss_typename_param_k basic_path<C, T, A>::char_type basic_path<C, T, A>::path_name_separator_alt()
{
return '/';
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline void basic_path<C, T, A>::swap(basic_path<C, T, A> &rhs)
{
m_buffer.swap(rhs.m_buffer);
std::swap(m_len, rhs.m_len);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_typename_param_k basic_path<C, T, A>::class_type &basic_path<C, T, A>::concat_(ss_typename_param_k basic_path<C, T, A>::char_type const *rhs)
{
m_len = traits_type::str_len(traits_type::str_cat(&m_buffer[0], rhs));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -