DStringArray.hpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #pragma once
  2. #include <vector>
  3. #include "String.DString.hpp"
  4. #include "Iterator.tlh"
  5. #include "ReverseIterator.tlh"
  6. //-----------------------------------------------------------------------------
  7. // DStringArray
  8. // Nothing different with Array <DString> but add some search functions
  9. //-----------------------------------------------------------------------------
  10. class DStringArray : public std::vector <eSTR::DString>
  11. {
  12. using inherited = std::vector <eSTR::DString>;
  13. public:
  14. // using Iterator = Iterator <std::vector <DString>>;
  15. DStringArray () = default;
  16. DStringArray (const DStringArray &) = default;
  17. DStringArray (DStringArray && ) = default;
  18. DStringArray & operator = (const DStringArray &) = default;
  19. DStringArray & operator = (DStringArray &&) = default;
  20. public:
  21. // find string starting at left, -1 if not found
  22. int Find (const eSTR::DString & str) const
  23. {
  24. for (auto Iter = Iterator::From (*this); Iter; Iter++)
  25. {
  26. const auto & s = Iter ();
  27. if (s == str)
  28. return Iter.Index ();
  29. }
  30. return -1;
  31. }
  32. // find string starting at left, -1 if not found
  33. int NCFind (const eSTR::DString & str) const
  34. {
  35. for (auto Iter = Iterator::From (*this); Iter; Iter++)
  36. {
  37. const auto & s = Iter ();
  38. if (!s.CompareNoCase (str))
  39. return Iter.Index ();
  40. }
  41. return -1;
  42. }
  43. int ReverseFind (const eSTR::DString & str) const
  44. {
  45. for (auto Iter = ReverseIterator::From (*this); Iter; Iter++)
  46. {
  47. const auto & s = Iter ();
  48. if (s == str)
  49. return Iter.Index ();
  50. }
  51. return -1;
  52. }
  53. bool IsExist (const eSTR::DString & str) const
  54. {
  55. return (Find (str) >= 0);
  56. }
  57. bool IsEmpty () const
  58. {
  59. return empty ();
  60. }
  61. void Add (const eSTR::DString & str)
  62. {
  63. push_back (str);
  64. }
  65. void Add (eSTR::DString && str)
  66. {
  67. push_back (std::move (str));
  68. }
  69. int GetSize () const
  70. {
  71. return (int) size ();
  72. }
  73. void Reset ()
  74. {
  75. clear ();
  76. }
  77. int GetStringLength (void) const
  78. {
  79. int Length = 0;
  80. for (auto Iter = Iterator::From (*this); Iter; Iter++)
  81. {
  82. const auto & s = Iter ();
  83. Length += s.GetLength ();
  84. }
  85. return Length;
  86. }
  87. virtual eSTR::DString ToString (void) const
  88. {
  89. return ToString (eSTR::StringView ());
  90. }
  91. virtual eSTR::DString ToString (CV_String & sep) const
  92. {
  93. int seplen = sep.Length ();
  94. int length = 0;
  95. for (auto Iter = Iterator::From (*this); Iter; Iter++)
  96. {
  97. const auto & s = Iter ();
  98. length += s.GetLength () + 2;
  99. length += seplen + 2;
  100. }
  101. eSTR::DString rc;
  102. rc.GetBuffer (length);
  103. for (auto Iter = Iterator::From (*this); Iter; Iter++)
  104. {
  105. const auto & s = Iter ();
  106. rc += s;
  107. if (Iter.Index () < this->size () - 1)
  108. rc += sep;
  109. }
  110. return rc;
  111. }
  112. DStringArray & operator << (const eSTR::DString & string)
  113. {
  114. Add (string);
  115. return (*this);
  116. }
  117. DStringArray & operator << (CV_String & lpsz)
  118. {
  119. Add (eSTR::DString (lpsz));
  120. return (*this);
  121. }
  122. };