StringBuilder.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "StringBuilder.h"
  2. #include <LibC/stdarg.h>
  3. #include "printf.cpp"
  4. #include <AK/StdLibExtras.h>
  5. namespace AK {
  6. inline void StringBuilder::will_append(size_t size)
  7. {
  8. if ((m_length + size) > m_buffer.size())
  9. m_buffer.grow(max((size_t)16, m_buffer.size() * 2 + size));
  10. }
  11. StringBuilder::StringBuilder(size_t initial_capacity)
  12. {
  13. m_buffer.grow(initial_capacity);
  14. }
  15. void StringBuilder::append(const String& str)
  16. {
  17. if (str.is_empty())
  18. return;
  19. will_append(str.length());
  20. memcpy(m_buffer.pointer() + m_length, str.characters(), str.length());
  21. m_length += str.length();
  22. }
  23. void StringBuilder::append(const char* characters, size_t length)
  24. {
  25. if (!length)
  26. return;
  27. will_append(length);
  28. memcpy(m_buffer.pointer() + m_length, characters, length);
  29. m_length += length;
  30. }
  31. void StringBuilder::append(char ch)
  32. {
  33. will_append(1);
  34. m_buffer.pointer()[m_length] = ch;
  35. m_length += 1;
  36. }
  37. void StringBuilder::appendvf(const char* fmt, va_list ap)
  38. {
  39. printf_internal([this] (char*&, char ch) {
  40. append(ch);
  41. }, nullptr, fmt, ap);
  42. }
  43. void StringBuilder::appendf(const char* fmt, ...)
  44. {
  45. va_list ap;
  46. va_start(ap, fmt);
  47. appendvf(fmt, ap);
  48. va_end(ap);
  49. }
  50. ByteBuffer StringBuilder::to_byte_buffer()
  51. {
  52. m_buffer.trim(m_length);
  53. return move(m_buffer);
  54. }
  55. String StringBuilder::to_string()
  56. {
  57. auto string = String((const char*)m_buffer.pointer(), m_length);
  58. m_buffer.clear();
  59. return string;
  60. }
  61. }