123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #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_
|