📄 string_view.hpp
字号:
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) <= 0;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator <=(ss_typename_type_k basic_string_view<C, T, A>::char_type const* lhs, basic_string_view<C, T, A> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator <=(C const* lhs, basic_string_view<C, T, A> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) >= 0;
}
// operator >
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_bool_t operator >(basic_string_view<C, T, A> const& lhs, basic_string_view<C, T, A> const& rhs)
{
return lhs.compare(rhs) > 0;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator >(basic_string_view<C, T, A> const& lhs, ss_typename_type_k basic_string_view<C, T, A>::char_type const* rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator >(basic_string_view<C, T, A> const& lhs, C const* rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) > 0;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator >(ss_typename_type_k basic_string_view<C, T, A>::char_type const* lhs, basic_string_view<C, T, A> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator >(C const* lhs, basic_string_view<C, T, A> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) < 0;
}
// operator >=
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_bool_t operator >=(basic_string_view<C, T, A> const& lhs, basic_string_view<C, T, A> const& rhs)
{
return lhs.compare(rhs) >= 0;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator >=(basic_string_view<C, T, A> const& lhs, ss_typename_type_k basic_string_view<C, T, A>::char_type const* rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator >=(basic_string_view<C, T, A> const& lhs, C const* rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) >= 0;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator >=(ss_typename_type_k basic_string_view<C, T, A>::char_type const* lhs, basic_string_view<C, T, A> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator >=(C const* lhs, basic_string_view<C, T, A> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) <= 0;
}
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/* /////////////////////////////////////////////////////////////////////////
* IOStream compatibility
*/
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_string_view<C, T, A> const& str)
{
s.write(str.data(), static_cast<ss_streamoff_t>(str.length()));
return s;
}
/* /////////////////////////////////////////////////////////////////////////
* Unit-testing
*/
#ifdef STLSOFT_UNITTEST
# include "./unittest/string_view_unittest_.h"
#endif /* STLSOFT_UNITTEST */
/* /////////////////////////////////////////////////////////////////////////
* Implementation
*/
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
// Implementation
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline /* static */ ss_typename_type_k basic_string_view<C, T, A>::char_type const* basic_string_view<C, T, A>::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;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline /* static */ ss_sint_t basic_string_view<C, T, A>::compare_( ss_typename_type_k basic_string_view<C, T, A>::value_type const* lhs
, ss_typename_type_k basic_string_view<C, T, A>::size_type lhs_len
, ss_typename_type_k basic_string_view<C, T, A>::value_type const* rhs
, ss_typename_type_k basic_string_view<C, T, A>::size_type rhs_len)
{
size_type cmp_len = (lhs_len < rhs_len) ? lhs_len : rhs_len;
ss_int_t result = traits_type::compare(lhs, rhs, cmp_len);
if(0 == result)
{
result = static_cast<ss_int_t>(lhs_len) - static_cast<ss_int_t>(rhs_len);
}
return result;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline /* static */ void basic_string_view<C, T, A>::close_() stlsoft_throw_0()
{
STLSOFT_ASSERT(NULL != m_cstr);
allocator_type &ator = *this;
ator.deallocate(m_cstr, 1 + m_length);
#if defined(STLSOFT_COMPILER_IS_BORLAND)
STLSOFT_SUPPRESS_UNUSED(ator);
#endif /* compiler */
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline /* static */ void basic_string_view<C, T, A>::close_set_null_() stlsoft_throw_0()
{
if(NULL != m_cstr)
{
close_();
m_cstr = NULL;
}
}
/** \brief Invariant
*
* \ingroup group__library__string
*/
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_bool_t basic_string_view<C, T, A>::is_valid() const
{
// NOTE: Must not call any methods or ctors in this function!!
if( 0 == m_length &&
NULL != m_cstr)
{
return false; // If the slice is empty, there should be no m_cstr
}
if( 0 != m_length &&
NULL == m_base)
{
return false; // If the slice is non-empty, m_base should not be NULL
}
return true;
}
// Construction
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::basic_string_view()
: m_length(0)
, m_base(NULL)
, m_cstr(NULL)
{
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::basic_string_view(basic_string_view<C, T, A> const& rhs)
: m_length(rhs.m_length)
, m_base(rhs.m_base)
, m_cstr(NULL)
{
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::basic_string_view(basic_string_view<C, T, A> const& rhs, ss_typename_type_k basic_string_view<C, T, A>::size_type pos)
: m_length(rhs.m_length - pos)
, m_base(&rhs[pos]) // Use this so we get the debug-time invariant checking on the validity of pos
, m_cstr(NULL)
{
STLSOFT_ASSERT(pos <= rhs.m_length);
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::basic_string_view( basic_string_view<C, T, A> const& rhs
, ss_typename_type_k basic_string_view<C, T, A>::size_type pos
, ss_typename_type_k basic_string_view<C, T, A>::size_type cch)
: m_length(cch)
, m_base(&rhs[pos]) // Use this so we get the debug-time invariant checking on the validity of pos
, m_cstr(NULL)
{
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::basic_string_view(ss_typename_type_k basic_string_view<C, T, A>::char_type const* s)
: m_length(T::length(s))
, m_base(s)
, m_cstr(NULL)
{
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::basic_string_view( ss_typename_type_k basic_string_view<C, T, A>::char_type const* s
, ss_typename_type_k basic_string_view<C, T, A>::size_type cch)
: m_length(cch)
, m_base(s)
, m_cstr(NULL)
{
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::basic_string_view( ss_typename_type_k basic_string_view<C, T, A>::char_type const* first
, ss_typename_type_k basic_string_view<C, T, A>::char_type const* last)
: m_length(static_cast<size_type>(last - first))
, m_base(first)
, m_cstr(NULL)
{
STLSOFT_ASSERT(first <= last);
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A>::~basic_string_view() stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
if(NULL != m_cstr)
{
close_();
}
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline basic_string_view<C, T, A> &basic_string_view<C, T, A>::operator =(basic_string_view<C, T, A> const& rhs)
{
close_set_null_();
m_length = rhs.m_length;
m_base = rhs.m_base;
return *this;
}
// Operations
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline void basic_string_view<C, T, A>::swap(ss_typename_type_k basic_string_view<C, T, A>::class_type& rhs) stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
std::swap(m_length, rhs.m_length);
std::swap(m_base, rhs.m_base);
std::swap(m_cstr, rhs.m_cstr);
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline void basic_string_view<C, T, A>::clear() stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
close_set_null_();
m_length = 0;
m_base = NULL;
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline void basic_string_view<C, T, A>::refresh() stlsoft_throw_0()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -