SpillBuffer.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "SpillBuffer.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #ifndef min
  5. #define min(a,b) ((a<b)?(a):(b))
  6. #endif
  7. SpillBuffer::SpillBuffer()
  8. {
  9. spillBufferUsed=0;
  10. spillBufferSize=0;
  11. spillBuffer=0;
  12. }
  13. SpillBuffer::~SpillBuffer()
  14. {
  15. free(spillBuffer);
  16. }
  17. void SpillBuffer::reset()
  18. {
  19. free(spillBuffer);
  20. spillBuffer=0;
  21. spillBufferUsed=0;
  22. spillBufferSize=0;
  23. }
  24. bool SpillBuffer::reserve(size_t bytes)
  25. {
  26. size_t old_spillBufferSize = spillBufferSize;
  27. spillBufferSize=bytes;
  28. char *new_spillBuffer = (char *)realloc(spillBuffer, spillBufferSize*2);
  29. if (new_spillBuffer) spillBuffer = new_spillBuffer;
  30. else
  31. {
  32. new_spillBuffer = (char *)calloc(spillBufferSize*2, sizeof(char));
  33. if (new_spillBuffer)
  34. {
  35. memcpy(new_spillBuffer, spillBuffer, old_spillBufferSize * 2);
  36. free(spillBuffer);
  37. spillBuffer = new_spillBuffer;
  38. }
  39. else
  40. {
  41. spillBufferSize = old_spillBufferSize;
  42. return false;
  43. }
  44. }
  45. if (!spillBuffer) return false;
  46. clear();
  47. return true;
  48. }
  49. void SpillBuffer::clear()
  50. {
  51. spillBufferUsed=0;
  52. }
  53. size_t SpillBuffer::write(const void *buffer, size_t bytes)
  54. {
  55. size_t avail = spillBufferSize - spillBufferUsed;
  56. bytes = min(avail, bytes);
  57. memcpy(spillBuffer + spillBufferUsed, buffer, bytes);
  58. spillBufferUsed+=bytes;
  59. return bytes;
  60. }
  61. bool SpillBuffer::get(void **buffer, size_t *len)
  62. {
  63. *buffer = spillBuffer;
  64. *len = spillBufferUsed;
  65. spillBufferUsed = 0;
  66. return true;
  67. }
  68. bool SpillBuffer::full() const
  69. {
  70. return spillBufferUsed == spillBufferSize;
  71. }
  72. bool SpillBuffer::empty() const
  73. {
  74. return spillBufferUsed == 0;
  75. }
  76. void SpillBuffer::remove(size_t len)
  77. {
  78. if (len > spillBufferUsed)
  79. len=spillBufferUsed;
  80. if (len)
  81. {
  82. memmove(spillBuffer, spillBuffer + len, spillBufferUsed - len);
  83. }
  84. }
  85. size_t SpillBuffer::remaining() const
  86. {
  87. return spillBufferSize - spillBufferUsed;
  88. }
  89. size_t SpillBuffer::length() const
  90. {
  91. return spillBufferSize;
  92. }