📄 string_view.hpp
字号:
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()
{
STLSOFT_ASSERT(is_valid());
close_set_null_();
STLSOFT_ASSERT(is_valid());
}
// Attributes
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_typename_type_k basic_string_view<C, T, A>::size_type basic_string_view<C, T, A>::size() const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
return m_length;
}
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>::size_type basic_string_view<C, T, A>::max_size() stlsoft_throw_0()
{
return static_cast<size_type>(-1) / sizeof(char_type);
}
// size_type max_size() const;
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_typename_type_k basic_string_view<C, T, A>::size_type basic_string_view<C, T, A>::length() const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
return m_length;
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_typename_type_k basic_string_view<C, T, A>::size_type basic_string_view<C, T, A>::capacity() const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
return m_length;
}
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>::empty() const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
return 0 == size();
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_typename_type_k basic_string_view<C, T, A>::allocator_type basic_string_view<C, T, A>::get_allocator() const
{
return *this;
}
// Comparison
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>::equal(ss_typename_type_k basic_string_view<C, T, A>::class_type const &rhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
return (m_length == rhs.m_length) && ((m_base == rhs.m_base) || 0 == compare(rhs));
}
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>::equal(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 cchRhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
return (m_length == cchRhs) && ((m_base == rhs) || 0 == compare_(m_base, m_length, rhs, cchRhs));
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_sint_t basic_string_view<C, T, A>::compare( 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
, 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 cchRhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
if(!(pos < lhs_len))
{
pos = lhs_len;
}
else
{
lhs_len -= pos;
}
if(cch < lhs_len)
{
lhs_len = cch;
}
size_type rhs_len = (NULL == rhs) ? 0 : traits_type::length(rhs);
if(cchRhs < rhs_len)
{
rhs_len = cchRhs;
}
STLSOFT_ASSERT(is_valid());
return compare_(m_base + pos, lhs_len, rhs, rhs_len);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_sint_t basic_string_view<C, T, A>::compare( 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
, ss_typename_type_k basic_string_view<C, T, A>::value_type const *rhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
if(!(pos < lhs_len))
{
pos = lhs_len;
}
else
{
lhs_len -= pos;
}
if(cch < lhs_len)
{
lhs_len = cch;
}
size_type rhs_len = (NULL == rhs) ? 0 : traits_type::length(rhs);
STLSOFT_ASSERT(is_valid());
return compare_(m_base + pos, lhs_len, rhs, rhs_len);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_sint_t basic_string_view<C, T, A>::compare(ss_typename_type_k basic_string_view<C, T, A>::value_type const *rhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
size_type rhs_len = (NULL == rhs) ? 0 : traits_type::length(rhs);
return compare_(m_base, lhs_len, rhs, rhs_len);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_sint_t basic_string_view<C, T, A>::compare( 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
, ss_typename_type_k basic_string_view<C, T, A>::class_type const &rhs
, ss_typename_type_k basic_string_view<C, T, A>::size_type posRhs
, ss_typename_type_k basic_string_view<C, T, A>::size_type cchRhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
if(!(pos < lhs_len))
{
pos = lhs_len;
}
else
{
lhs_len -= pos;
}
if(cch < lhs_len)
{
lhs_len = cch;
}
size_type rhs_len = rhs.length();
if(!(posRhs < rhs_len))
{
posRhs = rhs_len;
}
else
{
rhs_len -= posRhs;
}
if(cchRhs < rhs_len)
{
rhs_len = cchRhs;
}
STLSOFT_ASSERT(is_valid());
return compare_(m_base + pos, lhs_len, rhs.m_base + posRhs, rhs_len);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_sint_t basic_string_view<C, T, A>::compare( 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
, ss_typename_type_k basic_string_view<C, T, A>::class_type const &rhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
if(!(pos < lhs_len))
{
pos = lhs_len;
}
else
{
lhs_len -= pos;
}
if(cch < lhs_len)
{
lhs_len = cch;
}
size_type rhs_len = rhs.length();
STLSOFT_ASSERT(is_valid());
return compare_(m_base + pos, lhs_len, rhs.m_base, rhs_len);
}
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_sint_t basic_string_view<C, T, A>::compare(ss_typename_type_k basic_string_view<C, T, A>::class_type const &rhs) const stlsoft_throw_0()
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
size_type rhs_len = rhs.length();
STLSOFT_ASSERT(is_valid());
return compare_(m_base, lhs_len, rhs.m_base, rhs_len);
}
// Accessors
#if 0
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_typename_type_k basic_string_view<C, T, A>::reference basic_string_view<C, T, A>::operator [](ss_typename_type_k basic_string_view<C, T, A>::size_type index)
{
STLSOFT_ASSERT(is_valid());
return m_base[index];
}
#endif /* 0 */
template< ss_typename_param_k C
, ss_typename_param_k T
, ss_typename_param_k A
>
inline ss_typename_type_k basic_string_view<C, T, A>::const_reference basic_string_view<C, T, A>::operator [](ss_typename_type_k basic_string_view<C, T, A>::size_type index) const
{
STLSOFT_MESSAGE_ASSERT("string_view index out of bounds", index <= size());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -