Blob.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #ifndef _RVC_COMM_CBLOB_H_
  2. #define _RVC_COMM_CBLOB_H_
  3. #pragma once
  4. // TODO: warning: deleting ‘void*’ is undefined [-Wdelete-incomplete] [Gifur@2020424]
  5. struct CBlob
  6. {
  7. char *m_pData;
  8. int m_iLength;
  9. bool m_bManaged;
  10. CBlob() : m_bManaged(false), m_pData(NULL), m_iLength(0) {}
  11. ~CBlob() { Clear(); }
  12. CBlob(const CBlob &t)
  13. : m_bManaged(false), m_pData(NULL), m_iLength(0)
  14. {
  15. m_bManaged = t.m_bManaged;
  16. m_iLength = t.m_iLength;
  17. if (m_bManaged) {
  18. if (m_iLength) {
  19. m_pData = new char[m_iLength];
  20. memcpy(m_pData, t.m_pData, m_iLength);
  21. }
  22. } else {
  23. m_pData = t.m_pData;
  24. }
  25. }
  26. void Clear()
  27. {
  28. if (m_bManaged) {
  29. delete[] m_pData;
  30. m_bManaged = false;
  31. }
  32. m_iLength = 0;
  33. m_pData = NULL;
  34. }
  35. const CBlob &operator =(const CBlob &t) {
  36. Clear();
  37. m_bManaged = t.m_bManaged;
  38. m_iLength = t.m_iLength;
  39. if (m_bManaged) {
  40. if (m_iLength) {
  41. m_pData = new char[m_iLength];
  42. memcpy(m_pData, t.m_pData, m_iLength);
  43. }
  44. } else {
  45. m_pData = t.m_pData;
  46. }
  47. return *this;
  48. }
  49. void Alloc(int len) {
  50. if (m_bManaged) {
  51. delete[] m_pData;
  52. } else {
  53. m_bManaged = true;
  54. }
  55. m_pData = new char[len];
  56. memset(m_pData, 0, len);
  57. m_iLength = len;
  58. }
  59. void Attach(void *pData, int nLen)
  60. {
  61. Clear();
  62. m_pData = (char*)pData;
  63. m_iLength = nLen;
  64. m_bManaged = true;
  65. }
  66. // resize buffer size, if smaller, only change m_iLength; if larger, realloc memory and copy current data
  67. void Resize(int len)
  68. {
  69. if (len == 0)
  70. {
  71. Clear();
  72. return;
  73. }
  74. if (len <= m_iLength)
  75. {
  76. // smaller size only change m_iLength
  77. m_iLength = len;
  78. return;
  79. }
  80. // new size is larger
  81. char *pNewBuf = new char[len];
  82. memset(pNewBuf, 0, len);
  83. if (m_iLength >0) // copy original data
  84. memcpy(pNewBuf, m_pData, m_iLength);
  85. if (m_bManaged)
  86. delete[] m_pData;
  87. m_bManaged = true;
  88. m_pData = pNewBuf;
  89. m_iLength = len;
  90. }
  91. // dont release memory when destruct
  92. void Refer(void *pData, int nLen)
  93. {
  94. Clear();
  95. m_pData = (char*)pData;
  96. m_iLength = nLen;
  97. m_bManaged = false;
  98. }
  99. void AssignAndClear(CBlob &toBlob) {
  100. toBlob.Clear();
  101. toBlob.m_pData = m_pData;
  102. toBlob.m_iLength = m_iLength;
  103. toBlob.m_bManaged = m_bManaged;
  104. if (m_bManaged) {
  105. m_bManaged = false;
  106. Clear();
  107. }
  108. }
  109. };
  110. #endif //_RVC_COMM_CBLOB_H_