zerocopy.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "zerocopy.h"
  2. #include "output.h"
  3. IZeroCopyInput::~IZeroCopyInput() = default;
  4. size_t IZeroCopyInput::DoRead(void* buf, size_t len) {
  5. const void* ptr;
  6. size_t result = DoNext(&ptr, len);
  7. if (result) {
  8. memcpy(buf, ptr, result);
  9. }
  10. return result;
  11. }
  12. ui64 IZeroCopyInput::DoReadAll(IOutputStream& out) {
  13. ui64 result = 0;
  14. const void* ptr;
  15. while (size_t len = Next(&ptr)) {
  16. out.Write(ptr, len);
  17. result += len;
  18. }
  19. return result;
  20. }
  21. size_t IZeroCopyInput::DoSkip(size_t len) {
  22. const void* ptr;
  23. return DoNext(&ptr, len);
  24. }
  25. IZeroCopyInputFastReadTo::~IZeroCopyInputFastReadTo() = default;
  26. size_t IZeroCopyInputFastReadTo::DoReadTo(TString& st, char ch) {
  27. const char* ptr;
  28. size_t len = Next(&ptr);
  29. if (!len) {
  30. return 0;
  31. }
  32. size_t result = 0;
  33. st.clear();
  34. do {
  35. if (const char* pos = (const char*)memchr(ptr, ch, len)) {
  36. size_t bytesRead = (pos - ptr) + 1;
  37. if (bytesRead > 1) {
  38. st.append(ptr, pos);
  39. }
  40. Undo(len - bytesRead);
  41. result += bytesRead;
  42. return result;
  43. } else {
  44. result += len;
  45. st.append(ptr, len);
  46. }
  47. len = Next(&ptr);
  48. } while (len);
  49. return result;
  50. }