COMPASSi/trunk/code/inc/DataManager/XmlSerialization/xsd/cxx/ro-string.txx

132 lines
2.8 KiB
Plaintext
Raw Permalink Normal View History

2025-06-25 15:06:42 +08:00
// file : xsd/cxx/ro-string.txx
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
namespace xsd
{
namespace cxx
{
template <typename C>
typename ro_string<C>::size_type ro_string<C>::
find (C c, size_type pos) const
{
size_type r (npos);
if (pos < size_)
{
if (const C* p = traits_type::find(data_ + pos, size_ - pos, c))
r = p - data_;
}
return r;
}
template<typename C>
typename ro_string<C>::size_type
trim_left (ro_string<C>& s)
{
typename ro_string<C>::size_type size (s.size ());
if (size != 0)
{
const C* f (s.data ());
const C* l (f + size);
const C* of (f);
while (f < l &&
(*f == C (0x20) || *f == C (0x0A) ||
*f == C (0x0D) || *f == C (0x09)))
++f;
if (f != of)
{
size = f <= l ? l - f : 0;
s.assign ((f <= l ? f : 0), size);
}
}
return size;
}
template<typename C>
typename ro_string<C>::size_type
trim_right (ro_string<C>& s)
{
typename ro_string<C>::size_type size (s.size ());
if (size != 0)
{
const C* f (s.data ());
const C* l (f + size - 1);
const C* ol (l);
while (l > f &&
(*l == C (0x20) || *l == C (0x0A) ||
*l == C (0x0D) || *l == C (0x09)))
--l;
if (l != ol)
{
size = f <= l ? l - f + 1 : 0;
s.assign ((f <= l ? f : 0), size);
}
}
return size;
}
template<typename C>
typename ro_string<C>::size_type
trim (ro_string<C>& s)
{
typename ro_string<C>::size_type size (s.size ());
if (size != 0)
{
const C* f (s.data ());
const C* l (f + size);
const C* of (f);
while (f < l &&
(*f == C (0x20) || *f == C (0x0A) ||
*f == C (0x0D) || *f == C (0x09)))
++f;
--l;
const C* ol (l);
while (l > f &&
(*l == C (0x20) || *l == C (0x0A) ||
*l == C (0x0D) || *l == C (0x09)))
--l;
if (f != of || l != ol)
{
size = f <= l ? l - f + 1 : 0;
s.assign ((f <= l ? f : 0), size);
}
}
return size;
}
template<typename C>
std::basic_string<C>
trim (const std::basic_string<C>& s)
{
ro_string<C> tmp (s);
typename ro_string<C>::size_type size (tmp.size ());
trim (tmp);
// If we didn't change the string then return the original to help
// avoid copying for smart (ref counted) string implementations.
//
if (size == tmp.size ())
return s;
else
return tmp;
}
}
}