// file : xsd/cxx/ro-string.txx // copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file namespace xsd { namespace cxx { template typename ro_string::size_type ro_string:: 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 ro_string::size_type trim_left (ro_string& s) { typename ro_string::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 ro_string::size_type trim_right (ro_string& s) { typename ro_string::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 ro_string::size_type trim (ro_string& s) { typename ro_string::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 std::basic_string trim (const std::basic_string& s) { ro_string tmp (s); typename ro_string::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; } } }