#ifndef _RVC_COMM_CBLOB_H_ #define _RVC_COMM_CBLOB_H_ #pragma once // TODO: warning: deleting ‘void*’ is undefined [-Wdelete-incomplete] [Gifur@2020424] struct CBlob { char *m_pData; int m_iLength; bool m_bManaged; CBlob() : m_bManaged(false), m_pData(NULL), m_iLength(0) {} ~CBlob() { Clear(); } CBlob(const CBlob &t) : m_bManaged(false), m_pData(NULL), m_iLength(0) { m_bManaged = t.m_bManaged; m_iLength = t.m_iLength; if (m_bManaged) { if (m_iLength) { m_pData = new char[m_iLength]; memcpy(m_pData, t.m_pData, m_iLength); } } else { m_pData = t.m_pData; } } void Clear() { if (m_bManaged) { delete[] m_pData; m_bManaged = false; } m_iLength = 0; m_pData = NULL; } const CBlob &operator =(const CBlob &t) { Clear(); m_bManaged = t.m_bManaged; m_iLength = t.m_iLength; if (m_bManaged) { if (m_iLength) { m_pData = new char[m_iLength]; memcpy(m_pData, t.m_pData, m_iLength); } } else { m_pData = t.m_pData; } return *this; } void Alloc(int len) { if (m_bManaged) { delete[] m_pData; } else { m_bManaged = true; } m_pData = new char[len]; memset(m_pData, 0, len); m_iLength = len; } void Attach(void *pData, int nLen) { Clear(); m_pData = (char*)pData; m_iLength = nLen; m_bManaged = true; } // resize buffer size, if smaller, only change m_iLength; if larger, realloc memory and copy current data void Resize(int len) { if (len == 0) { Clear(); return; } if (len <= m_iLength) { // smaller size only change m_iLength m_iLength = len; return; } // new size is larger char *pNewBuf = new char[len]; memset(pNewBuf, 0, len); if (m_iLength >0) // copy original data memcpy(pNewBuf, m_pData, m_iLength); if (m_bManaged) delete[] m_pData; m_bManaged = true; m_pData = pNewBuf; m_iLength = len; } // dont release memory when destruct void Refer(void *pData, int nLen) { Clear(); m_pData = (char*)pData; m_iLength = nLen; m_bManaged = false; } void AssignAndClear(CBlob &toBlob) { toBlob.Clear(); toBlob.m_pData = m_pData; toBlob.m_iLength = m_iLength; toBlob.m_bManaged = m_bManaged; if (m_bManaged) { m_bManaged = false; Clear(); } } }; #endif //_RVC_COMM_CBLOB_H_