📄 string_traits.hpp
字号:
#endif /* 0 */
/* C-style Unicode string */
STLSOFT_TEMPLATE_SPECIALISATION
struct string_traits<ss_char_w_t *>
{
typedef ss_char_w_t value_type;
typedef ss_char_w_t char_type;
typedef ss_size_t size_type;
typedef char_type const const_char_type;
typedef value_type const *string_type;
typedef value_type *pointer;
typedef value_type const *const_pointer;
enum { is_pointer = true };
enum { is_pointer_to_const = false };
enum { char_type_size = sizeof(char_type) };
static string_type empty_string()
{
// This character array is initialised to 0, which conveniently happens to
// be the empty string, by the module/application load, so it is
// guaranteed to be valid, and there are no threading/race conditions
static char_type s_empty[1];
STLSOFT_ASSERT(s_empty[0] == '\0'); // Paranoid check
return s_empty;
}
};
STLSOFT_TEMPLATE_SPECIALISATION
struct string_traits<ss_char_w_t const *>
{
typedef ss_char_w_t value_type;
typedef ss_char_w_t char_type;
typedef ss_size_t size_type;
typedef char_type const const_char_type;
typedef value_type const *string_type;
typedef value_type *pointer;
typedef value_type const *const_pointer;
enum { is_pointer = true };
enum { is_pointer_to_const = false };
enum { char_type_size = sizeof(char_type) };
static string_type empty_string()
{
// This character array is initialised to 0, which conveniently happens to
// be the empty string, by the module/application load, so it is
// guaranteed to be valid, and there are no threading/race conditions
static char_type s_empty[1];
STLSOFT_ASSERT(s_empty[0] == '\0'); // Paranoid check
return s_empty;
}
};
/* std::basic_string */
# ifndef _STLSOFT_STRING_TRAITS_NO_STD_STRING
# ifdef STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
template <ss_typename_param_k C>
struct string_traits<stlsoft_ns_qual_std(basic_string)<C> >
{
// NOTE: Originally, what is string_type_ was defined as value_type, but
// Borland objects to value_type::value_type.
typedef stlsoft_ns_qual_std(basic_string)<C> string_type_;
typedef ss_typename_type_k string_type_::value_type char_type;
typedef ss_typename_type_k string_type_::size_type size_type;
typedef char_type const const_char_type;
typedef string_type_ string_type;
typedef string_type_ value_type;
typedef ss_typename_type_k string_type::pointer pointer;
typedef ss_typename_type_k string_type::const_pointer const_pointer;
typedef ss_typename_type_k string_type::iterator iterator;
typedef ss_typename_type_k string_type::const_iterator const_iterator;
typedef ss_typename_type_k string_type::reverse_iterator reverse_iterator;
typedef ss_typename_type_k string_type::const_reverse_iterator const_reverse_iterator;
enum { is_pointer = false };
enum { is_pointer_to_const = false };
enum { char_type_size = sizeof(char_type) };
static string_type empty_string()
{
return string_type();
}
static string_type construct(string_type const &src, size_type pos, size_type len)
{
return string_type(src, pos, len);
}
# ifdef STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
template <ss_typename_param_k I>
static string_type &assign_inplace(string_type &str, I first, I last)
# else /* ? STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
static string_type &assign_inplace(string_type &str, const_iterator first, const_iterator last)
# endif /* STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
{
// std::basic_string cannot assign in-place (or rather not all implementations do so)
str.erase(last, str.end());
str.erase(str.begin(), first);
return str;
}
};
# else /* ? STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */
# if defined(STLSOFT_CF_std_NAMESPACE)
STLSOFT_TEMPLATE_SPECIALISATION
struct string_traits<stlsoft_ns_qual_std(basic_string)<ss_char_a_t> >
{
typedef stlsoft_ns_qual_std(basic_string)<ss_char_a_t> value_type;
typedef value_type::value_type char_type;
typedef value_type::size_type size_type;
typedef char_type const const_char_type;
typedef value_type string_type;
typedef string_type::pointer pointer;
typedef string_type::const_pointer const_pointer;
typedef string_type::iterator iterator;
typedef string_type::const_iterator const_iterator;
typedef string_type::reverse_iterator reverse_iterator;
typedef string_type::const_reverse_iterator const_reverse_iterator;
enum { is_pointer = false };
enum { is_pointer_to_const = false };
enum { char_type_size = sizeof(char_type) };
static string_type empty_string()
{
return string_type();
}
static string_type construct(string_type const &src, size_type pos, size_type len)
{
return string_type(src, pos, len);
}
# ifdef STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
template <ss_typename_param_k I>
static string_type &assign_inplace(string_type &str, I first, I last)
# else /* ? STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
static string_type &assign_inplace(string_type &str, const_iterator first, const_iterator last)
# endif /* STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
{
// std::basic_string cannot assign in-place (or rather not all implementations do so)
str.erase(last, str.end());
str.erase(str.begin(), first);
return str;
}
};
STLSOFT_TEMPLATE_SPECIALISATION
struct string_traits<stlsoft_ns_qual_std(basic_string)<ss_char_w_t> >
{
typedef stlsoft_ns_qual_std(basic_string)<ss_char_w_t> value_type;
typedef value_type::value_type char_type;
typedef value_type::size_type size_type;
typedef char_type const const_char_type;
typedef value_type string_type;
typedef string_type::pointer pointer;
typedef string_type::const_pointer const_pointer;
typedef string_type::iterator iterator;
typedef string_type::const_iterator const_iterator;
typedef string_type::reverse_iterator reverse_iterator;
typedef string_type::const_reverse_iterator const_reverse_iterator;
enum { is_pointer = false };
enum { is_pointer_to_const = false };
enum { char_type_size = sizeof(char_type) };
static string_type empty_string()
{
return string_type();
}
static string_type construct(string_type const &src, size_type pos, size_type len)
{
return string_type(src, pos, len);
}
# ifdef STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
template <ss_typename_param_k I>
static string_type &assign_inplace(string_type &str, I first, I last)
# else /* ? STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
static string_type &assign_inplace(string_type &str, const_iterator first, const_iterator last)
# endif /* STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
{
// std::basic_string cannot assign in-place (or rather not all implementations do so)
str.erase(last, str.end());
str.erase(str.begin(), first);
return str;
}
};
# endif /* STLSOFT_CF_std_NAMESPACE */
# endif /* STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */
# endif /* _STLSOFT_STRING_TRAITS_NO_STD_STRING */
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
////////////////////////////////////////////////////////////////////////////
// Unit-testing
#ifdef STLSOFT_UNITTEST
# include "./unittest/string_traits_unittest_.h"
#endif /* STLSOFT_UNITTEST */
/* ////////////////////////////////////////////////////////////////////// */
#ifndef _STLSOFT_NO_NAMESPACE
} // namespace stlsoft
#endif /* _STLSOFT_NO_NAMESPACE */
/* ////////////////////////////////////////////////////////////////////// */
#endif /* !STLSOFT_INCL_STLSOFT_STRING_HPP_STRING_TRAITS */
/* ////////////////////////////////////////////////////////////////////// */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -