VectorBuffer.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Copyright (c) 2008-2022 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../IO/VectorBuffer.h"
  5. namespace Urho3D
  6. {
  7. VectorBuffer::VectorBuffer() = default;
  8. VectorBuffer::VectorBuffer(const Vector<byte>& data)
  9. {
  10. SetData(data);
  11. }
  12. VectorBuffer::VectorBuffer(const void* data, i32 size)
  13. {
  14. assert(size >= 0);
  15. SetData(data, size);
  16. }
  17. VectorBuffer::VectorBuffer(Deserializer& source, i32 size)
  18. {
  19. assert(size >= 0);
  20. SetData(source, size);
  21. }
  22. i32 VectorBuffer::Read(void* dest, i32 size)
  23. {
  24. assert(size >= 0);
  25. if (size + position_ > size_)
  26. size = size_ - position_;
  27. if (!size)
  28. return 0;
  29. byte* srcPtr = &buffer_[position_];
  30. byte* destPtr = (byte*)dest;
  31. position_ += size;
  32. memcpy(destPtr, srcPtr, size);
  33. return size;
  34. }
  35. i64 VectorBuffer::Seek(i64 position)
  36. {
  37. assert(position >= 0 && position <= M_MAX_INT);
  38. if (position > size_)
  39. position = size_;
  40. position_ = position;
  41. return position_;
  42. }
  43. i32 VectorBuffer::Write(const void* data, i32 size)
  44. {
  45. assert(size >= 0);
  46. if (!size)
  47. return 0;
  48. if (size + position_ > size_)
  49. {
  50. size_ = size + position_;
  51. buffer_.Resize(size_);
  52. }
  53. byte* srcPtr = (byte*)data;
  54. byte* destPtr = &buffer_[position_];
  55. position_ += size;
  56. memcpy(destPtr, srcPtr, size);
  57. return size;
  58. }
  59. void VectorBuffer::SetData(const Vector<byte>& data)
  60. {
  61. buffer_ = data;
  62. position_ = 0;
  63. size_ = data.Size();
  64. }
  65. void VectorBuffer::SetData(const void* data, i32 size)
  66. {
  67. assert(size >= 0);
  68. if (!data)
  69. size = 0;
  70. buffer_.Resize(size);
  71. if (size)
  72. memcpy(&buffer_[0], data, size);
  73. position_ = 0;
  74. size_ = size;
  75. }
  76. void VectorBuffer::SetData(Deserializer& source, i32 size)
  77. {
  78. assert(size >= 0);
  79. buffer_.Resize(size);
  80. i32 actualSize = (i32)source.Read(&buffer_[0], size);
  81. if (actualSize != size)
  82. buffer_.Resize(actualSize);
  83. position_ = 0;
  84. size_ = actualSize;
  85. }
  86. void VectorBuffer::Clear()
  87. {
  88. buffer_.Clear();
  89. position_ = 0;
  90. size_ = 0;
  91. }
  92. void VectorBuffer::Resize(i32 size)
  93. {
  94. assert(size >= 0);
  95. buffer_.Resize(size);
  96. size_ = size;
  97. if (position_ > size_)
  98. position_ = size_;
  99. }
  100. }