#pragma once #include #include "String.DString.hpp" #include "Iterator.tlh" #include "ReverseIterator.tlh" //----------------------------------------------------------------------------- // DStringArray // Nothing different with Array but add some search functions //----------------------------------------------------------------------------- class DStringArray : public std::vector { using inherited = std::vector ; public: // using Iterator = Iterator >; DStringArray () = default; DStringArray (const DStringArray &) = default; DStringArray (DStringArray && ) = default; DStringArray & operator = (const DStringArray &) = default; DStringArray & operator = (DStringArray &&) = default; public: // find string starting at left, -1 if not found int Find (const eSTR::DString & str) const { for (auto Iter = Iterator::From (*this); Iter; Iter++) { const auto & s = Iter (); if (s == str) return Iter.Index (); } return -1; } // find string starting at left, -1 if not found int NCFind (const eSTR::DString & str) const { for (auto Iter = Iterator::From (*this); Iter; Iter++) { const auto & s = Iter (); if (!s.CompareNoCase (str)) return Iter.Index (); } return -1; } int ReverseFind (const eSTR::DString & str) const { for (auto Iter = ReverseIterator::From (*this); Iter; Iter++) { const auto & s = Iter (); if (s == str) return Iter.Index (); } return -1; } bool IsExist (const eSTR::DString & str) const { return (Find (str) >= 0); } bool IsEmpty () const { return empty (); } void Add (const eSTR::DString & str) { push_back (str); } void Add (eSTR::DString && str) { push_back (std::move (str)); } int GetSize () const { return (int) size (); } void Reset () { clear (); } int GetStringLength (void) const { int Length = 0; for (auto Iter = Iterator::From (*this); Iter; Iter++) { const auto & s = Iter (); Length += s.GetLength (); } return Length; } virtual eSTR::DString ToString (void) const { return ToString (eSTR::StringView ()); } virtual eSTR::DString ToString (CV_String & sep) const { int seplen = sep.Length (); int length = 0; for (auto Iter = Iterator::From (*this); Iter; Iter++) { const auto & s = Iter (); length += s.GetLength () + 2; length += seplen + 2; } eSTR::DString rc; rc.GetBuffer (length); for (auto Iter = Iterator::From (*this); Iter; Iter++) { const auto & s = Iter (); rc += s; if (Iter.Index () < this->size () - 1) rc += sep; } return rc; } DStringArray & operator << (const eSTR::DString & string) { Add (string); return (*this); } DStringArray & operator << (CV_String & lpsz) { Add (eSTR::DString (lpsz)); return (*this); } };