StringView.cpp 1.4 KB

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