📄 static_string.hpp
字号:
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_sint_t basic_static_string<C, CCH, T>::compare(ss_typename_type_k basic_static_string<C, CCH, T>::value_type const* s) const
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
size_type rhs_len = (s == 0) ? 0 : traits_type::length(s);
STLSOFT_ASSERT(is_valid());
return compare_(m_buffer, lhs_len, s, rhs_len);
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_sint_t basic_static_string<C, CCH, T>::compare(ss_typename_type_k basic_static_string<C, CCH, T>::size_type pos, ss_typename_type_k basic_static_string<C, CCH, T>::size_type n, ss_typename_type_k basic_static_string<C, CCH, T>::class_type const& rhs, ss_typename_type_k basic_static_string<C, CCH, T>::size_type posRhs, ss_typename_type_k basic_static_string<C, CCH, T>::size_type cchRhs) const
{
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_buffer + pos, lhs_len, rhs.m_buffer + posRhs, rhs_len);
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_sint_t basic_static_string<C, CCH, T>::compare(ss_typename_type_k basic_static_string<C, CCH, T>::size_type pos, ss_typename_type_k basic_static_string<C, CCH, T>::size_type n, ss_typename_type_k basic_static_string<C, CCH, T>::class_type const& rhs) const
{
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_buffer + pos, lhs_len, rhs.m_buffer, rhs_len);
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_sint_t basic_static_string<C, CCH, T>::compare(ss_typename_type_k basic_static_string<C, CCH, T>::class_type const& rhs) const
{
STLSOFT_ASSERT(is_valid());
size_type lhs_len = length();
size_type rhs_len = rhs.length();
STLSOFT_ASSERT(is_valid());
#ifdef _DEBUG
//printf("Comparing (\"%*s\",%d; \"%*s\",%d)\n", lhs_len, &m_buffer[0], lhs_len, rhs_len, &rhs.m_buffer[0], rhs_len);
#endif /* _DEBUG */
return compare_(&m_buffer[0], lhs_len, &rhs.m_buffer[0], rhs_len);
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline void basic_static_string<C, CCH, T>::resize( ss_typename_type_k basic_static_string<C, CCH, T>::size_type n
, ss_typename_type_k basic_static_string<C, CCH, T>::value_type ch /* = value_type() */)
{
STLSOFT_MESSAGE_ASSERT("resize request too large for static_string", !(max_size() < n));
STLSOFT_ASSERT(is_valid());
size_type const len = length();
if(len != n)
{
if(len < n)
{
traits_type::assign(m_buffer + len, n - len, ch);
}
m_length = n;
m_buffer[n] = 0;
}
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline void basic_static_string<C, CCH, T>::clear()
{
STLSOFT_ASSERT(is_valid());
m_length = static_cast<ss_size_t>(-1);
m_buffer[0] = 0;
STLSOFT_ASSERT(is_valid());
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::reference basic_static_string<C, CCH, T>::operator [](ss_typename_type_k basic_static_string<C, CCH, T>::size_type index)
{
STLSOFT_MESSAGE_ASSERT("index access out of range in static_string", index < size());
STLSOFT_ASSERT(is_valid());
return m_buffer[index];
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::const_reference basic_static_string<C, CCH, T>::operator [](ss_typename_type_k basic_static_string<C, CCH, T>::size_type index) const
{
STLSOFT_MESSAGE_ASSERT("index access out of range in static_string", index < size() + 1); // Valid to return (const) reference to nul-terminator
STLSOFT_ASSERT(is_valid());
return m_buffer[index];
}
#ifdef STLSOFT_CF_EXCEPTION_SUPPORT
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::reference basic_static_string<C, CCH, T>::at(ss_typename_type_k basic_static_string<C, CCH, T>::size_type index)
{
STLSOFT_ASSERT(is_valid());
if(index >= size())
{
STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("index out of range"));
}
STLSOFT_ASSERT(is_valid());
return m_buffer[index];
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::const_reference basic_static_string<C, CCH, T>::at(ss_typename_type_k basic_static_string<C, CCH, T>::size_type index) const
{
STLSOFT_ASSERT(is_valid());
if(index > size())
{
STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("index out of range"));
}
STLSOFT_ASSERT(is_valid());
return m_buffer[index];
}
#endif /* !STLSOFT_CF_EXCEPTION_SUPPORT */
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::value_type const* basic_static_string<C, CCH, T>::c_str() const
{
STLSOFT_ASSERT(is_valid());
return m_buffer;
}
// Appending
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::class_type &basic_static_string<C, CCH, T>::append( ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* s
, ss_typename_type_k basic_static_string<C, CCH, T>::size_type n)
{
STLSOFT_MESSAGE_ASSERT("resize request too large for static_string", !(max_size() < n + length()));
STLSOFT_ASSERT(is_valid());
if(0 != n)
{
traits_type::copy(m_buffer + m_length, s, n);
m_length += n;
m_buffer[m_length] = 0;
}
STLSOFT_ASSERT(is_valid());
return *this;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::class_type &basic_static_string<C, CCH, T>::append(ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* s)
{
STLSOFT_ASSERT(is_valid());
return append(s, (NULL == s) ? 0 : traits_type::length(s));
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::class_type &basic_static_string<C, CCH, T>::append( ss_typename_type_k basic_static_string<C, CCH, T>::class_type const& rhs
, ss_typename_type_k basic_static_string<C, CCH, T>::size_type pos
, ss_typename_type_k basic_static_string<C, CCH, T>::size_type cch)
{
STLSOFT_ASSERT(is_valid());
char_type const* s = rhs.m_buffer;
size_type len = rhs.length();
if(len < pos)
{
pos = len;
}
if(len - pos < cch)
{
cch = len - pos;
}
if(NULL != s)
{
s += pos;
}
else
{
cch = 0;
}
STLSOFT_ASSERT(is_valid());
return append(s, cch);
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::class_type &basic_static_string<C, CCH, T>::append(ss_typename_type_k basic_static_string<C, CCH, T>::class_type const& s)
{
STLSOFT_ASSERT(is_valid());
return append(s.m_buffer, s.length());
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::class_type &basic_static_string<C, CCH, T>::append( ss_typename_type_k basic_static_string<C, CCH, T>::size_type n
, ss_typename_type_k basic_static_string<C, CCH, T>::char_type ch)
{
STLSOFT_MESSAGE_ASSERT("resize request too large for static_string", !(max_size() < n + length()));
//printf("append(pre): *this(%*s)\n", m_length, &m_buffer[0]);
STLSOFT_ASSERT(is_valid());
if(0 != n)
{
traits_type::assign(m_buffer + m_length, n, ch);
m_length += n;
m_buffer[m_length] = 0;
}
//printf("append(post): *this(%*s)\n", m_length, &m_buffer[0]);
STLSOFT_ASSERT(is_valid());
return *this;
}
#if !defined(STLSOFT_CF_MEMBER_TEMPLATE_RANGE_METHOD_SUPPORT)
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::class_type &basic_static_string<C, CCH, T>::append( ss_typename_type_k basic_static_string<C, CCH, T>::const_iterator first
, ss_typename_type_k basic_static_string<C, CCH, T>::const_iterator last)
{
STLSOFT_ASSERT(is_valid());
// We have to use this strange appearing form, because of Visual C++ .NET's
// disgusting STL swill. Sigh!
return append(&(*first), last - first);
}
#endif /* STLSOFT_CF_MEMBER_TEMPLATE_RANGE_METHOD_SUPPORT */
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_typename_type_k basic_static_string<C, CCH, T>::class_type &basic_static_string<C, CCH, T>::operator +=(ss_typename_type_k basic_static_string<C, CCH, T>::char_type ch)
{
STLSOFT_ASSERT(is_valid());
return append(1, ch);
}
template< ss_typename_param_k C
, ss_size_t CCH
,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -