buffer.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "buffer.h"
  2. #include <util/system/yassert.h>
  3. #include <algorithm>
  4. TBufferBase::TBufferBase(size_t size) noexcept
  5. : Size(size)
  6. {
  7. }
  8. size_t
  9. TBufferBase::GetSize() const noexcept {
  10. return Size;
  11. }
  12. void TBufferBase::SetSize(size_t size) noexcept {
  13. Size = size;
  14. }
  15. /////////////////////////////////////////////////////////////////////
  16. template <typename PointerType>
  17. TBufferBaseT<PointerType>::TBufferBaseT(PointerType data, size_t size) noexcept
  18. : TBufferBase(size)
  19. , Data(data)
  20. {
  21. }
  22. template <typename PointerType>
  23. PointerType
  24. TBufferBaseT<PointerType>::GetPointer() const noexcept {
  25. return Data;
  26. }
  27. template <typename PointerType>
  28. void TBufferBaseT<PointerType>::Assign(PointerType data, size_t size) noexcept {
  29. Data = data;
  30. Size = size;
  31. }
  32. template <>
  33. void TBufferBaseT<void*>::Cut(size_t offset) noexcept {
  34. Y_VERIFY_DEBUG(offset <= Size);
  35. Data = static_cast<char*>(Data) + offset;
  36. TBufferBase::Size -= offset;
  37. }
  38. template <>
  39. void TBufferBaseT<const void*>::Cut(size_t offset) noexcept {
  40. Y_VERIFY_DEBUG(offset <= Size);
  41. Data = static_cast<const char*>(Data) + offset;
  42. TBufferBase::Size -= offset;
  43. }
  44. template class TBufferBaseT<void*>;
  45. template class TBufferBaseT<const void*>;
  46. /////////////////////////////////////////////////////////////////////
  47. TConstBuffer::TConstBuffer(const void* data, size_t size) noexcept
  48. : TBufferBaseT<const void*>(data, size)
  49. {
  50. }
  51. TConstBuffer::TConstBuffer(const TMutableBuffer& buffer) noexcept
  52. : TBufferBaseT<const void*>(buffer.GetPointer(), buffer.GetSize())
  53. {
  54. }
  55. TConstBuffer
  56. TConstBuffer::Offset(ptrdiff_t offset, size_t size) const noexcept {
  57. return TConstBuffer(static_cast<const char*>(Data) + offset, std::min(Size - offset, size));
  58. }
  59. ////////////////////////////////////////////////////////////////////////////////
  60. TMutableBuffer::TMutableBuffer(void* data, size_t size) noexcept
  61. : TBufferBaseT<void*>(data, size)
  62. {
  63. }
  64. TMutableBuffer
  65. TMutableBuffer::Offset(ptrdiff_t offset, size_t size) const noexcept {
  66. return TMutableBuffer(static_cast<char*>(Data) + offset, std::min(Size - offset, size));
  67. }
  68. size_t
  69. TMutableBuffer::CopyFrom(const TConstBuffer& buffer) const noexcept {
  70. const auto size = std::min(Size, buffer.Size);
  71. std::memcpy(Data, buffer.Data, size);
  72. return size;
  73. }