buffer.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "buffer.h"
  2. #include "mem_copy.h"
  3. #include "string.h"
  4. #include "ymath.h"
  5. #include <util/system/sys_alloc.h>
  6. #include <util/system/sanitizers.h>
  7. TBuffer::TBuffer(size_t len)
  8. : Data_(nullptr)
  9. , Len_(0)
  10. , Pos_(0)
  11. {
  12. Reserve(len);
  13. }
  14. TBuffer::TBuffer(TBuffer&& b) noexcept
  15. : Data_(nullptr)
  16. , Len_(0)
  17. , Pos_(0)
  18. {
  19. Swap(b);
  20. }
  21. TBuffer::TBuffer(const char* buf, size_t len)
  22. : Data_(nullptr)
  23. , Len_(0)
  24. , Pos_(0)
  25. {
  26. Append(buf, len);
  27. }
  28. TBuffer& TBuffer::operator=(TBuffer&& b) noexcept {
  29. y_deallocate(Data_);
  30. Data_ = b.Data_;
  31. Len_ = b.Len_;
  32. Pos_ = b.Pos_;
  33. b.Data_ = nullptr;
  34. b.Len_ = 0;
  35. b.Pos_ = 0;
  36. return *this;
  37. }
  38. void TBuffer::Append(const char* buf, size_t len) {
  39. if (len > Avail()) {
  40. Reserve(Pos_ + len);
  41. }
  42. Y_ASSERT(len <= Avail());
  43. MemCopy(Data() + Pos_, buf, len);
  44. NSan::Unpoison(Data() + Pos_, len);
  45. Pos_ += len;
  46. Y_ASSERT(Pos_ <= Len_);
  47. }
  48. void TBuffer::Fill(char ch, size_t len) {
  49. if (len > Avail()) {
  50. Reserve(Pos_ + len);
  51. }
  52. Y_ASSERT(len <= Avail());
  53. memset(Data() + Pos_, ch, len);
  54. NSan::Unpoison(Data() + Pos_, len);
  55. Pos_ += len;
  56. Y_ASSERT(Pos_ <= Len_);
  57. }
  58. void TBuffer::DoReserve(size_t realLen) {
  59. // FastClp2<T>(x) returns 0 on x from [Max<T>/2 + 2, Max<T>]
  60. const size_t len = Max<size_t>(FastClp2(realLen), realLen);
  61. Y_ASSERT(realLen > Len_);
  62. Y_ASSERT(len >= realLen);
  63. Realloc(len);
  64. }
  65. void TBuffer::Realloc(size_t len) {
  66. Y_ASSERT(Pos_ <= len);
  67. Data_ = (char*)y_reallocate(Data_, len);
  68. Len_ = len;
  69. }
  70. TBuffer::~TBuffer() {
  71. y_deallocate(Data_);
  72. }
  73. void TBuffer::AsString(TString& s) {
  74. s.assign(Data(), Size());
  75. Clear();
  76. }