CMemoryBuffer.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * CMemoryBuffer.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "CMemoryBuffer.h"
  12. ///CMemoryBuffer
  13. CMemoryBuffer::CMemoryBuffer():
  14. position(0)
  15. {
  16. buffer.reserve(4096);
  17. }
  18. si64 CMemoryBuffer::write(const ui8 * data, si64 size)
  19. {
  20. //do not shrink
  21. const si64 newSize = tell()+size;
  22. if(newSize>getSize())
  23. buffer.resize(newSize);
  24. std::copy(data, data + size, buffer.data() + position);
  25. position += size;
  26. return size;
  27. }
  28. si64 CMemoryBuffer::read(ui8 * data, si64 size)
  29. {
  30. si64 toRead = std::min(getSize() - tell(), size);
  31. if(toRead > 0)
  32. {
  33. std::copy(buffer.data() + position, buffer.data() + position + toRead, data);
  34. position += toRead;
  35. }
  36. return toRead;
  37. }
  38. si64 CMemoryBuffer::seek(si64 position)
  39. {
  40. this->position = position;
  41. if (this->position >getSize())
  42. this->position = getSize();
  43. return this->position;
  44. }
  45. si64 CMemoryBuffer::tell()
  46. {
  47. return position;
  48. }
  49. si64 CMemoryBuffer::skip(si64 delta)
  50. {
  51. auto old_position = tell();
  52. return seek(old_position + delta) - old_position;
  53. }
  54. si64 CMemoryBuffer::getSize()
  55. {
  56. return buffer.size();
  57. }