// license:BSD-3-Clause // copyright-holders:Couriersud #include "pstring.h" #include "palloc.h" #include #include #include template int pstring_t::compare(const pstring_t &right) const noexcept { #if 0 return m_str.compare(right.m_str); #else auto si = this->begin(); auto ri = right.begin(); const auto se = this->end(); const auto re = right.end(); while (si != se && ri != re && *si == *ri) { ++ri; ++si; } if (si != se && ri != re) return plib::narrow_cast(*si) - plib::narrow_cast(*ri); if (si != se) return 1; if (ri != re) return -1; return 0; #endif } template pstring_t pstring_t::substr(size_type start, size_type nlen) const { pstring_t ret; auto ps = begin(); while (ps != end() && start > 0) { ++ps; --start; } //FIXME: throw ? if (ps != end()) { auto pe = ps; while (pe != end() && nlen > 0) { ++pe; --nlen; } ret.m_str.assign(ps.p, pe.p); } return ret; } template pstring_t pstring_t::substr(size_type start) const { pstring_t ret; auto ps = begin(); while (ps != end() && start > 0) { ++ps; --start; } //FIXME: throw ? if (ps != end()) { ret.m_str.assign(ps.p, end().p); } return ret; } template typename pstring_t::size_type pstring_t::find(const pstring_t &search, size_type start) const noexcept { auto istart = std::next(begin(), static_cast(start)); for (; istart != end(); ++istart) { auto itc = istart; auto cmp = search.begin(); while (itc != end() && cmp != search.end() && *itc == *cmp) { ++itc; ++cmp; } if (cmp == search.end()) return start; ++start; } return npos; } template typename pstring_t::size_type pstring_t::find(code_t search, size_type start) const noexcept { auto i = std::next(begin(), static_cast(start)); for (; i != end(); ++i) { if (*i == search) return start; ++start; } return npos; } // ---------------------------------------------------------------------------------------- // template stuff ... // ---------------------------------------------------------------------------------------- template struct pstring_t; template struct pstring_t; template struct pstring_t; template struct pstring_t; template struct pstring_t;