Blob.h 2.1 KB

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