StringView.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <AK/StringView.h>
  2. #include <AK/AKString.h>
  3. namespace AK {
  4. Vector<StringView> StringView::split_view(const char separator) const
  5. {
  6. if (is_empty())
  7. return { };
  8. Vector<StringView> v;
  9. ssize_t substart = 0;
  10. for (ssize_t i = 0; i < length(); ++i) {
  11. char ch = characters()[i];
  12. if (ch == separator) {
  13. ssize_t sublen = i - substart;
  14. if (sublen != 0)
  15. v.append(substring_view(substart, sublen));
  16. substart = i + 1;
  17. }
  18. }
  19. ssize_t taillen = length() - substart;
  20. if (taillen != 0)
  21. v.append(substring_view(substart, taillen));
  22. if (characters()[length() - 1] == separator)
  23. v.append(String::empty().view());
  24. return v;
  25. }
  26. StringView StringView::substring_view(int start, int length) const
  27. {
  28. if (!length)
  29. return { };
  30. ASSERT(start + length <= m_length);
  31. return { m_characters + start, length };
  32. }
  33. unsigned StringView::to_uint(bool& ok) const
  34. {
  35. unsigned value = 0;
  36. for (ssize_t i = 0; i < length(); ++i) {
  37. if (characters()[i] < '0' || characters()[i] > '9') {
  38. ok = false;
  39. return 0;
  40. }
  41. value = value * 10;
  42. value += characters()[i] - '0';
  43. }
  44. ok = true;
  45. return value;
  46. }
  47. }