7zip/CPP/Common/MyBuffer.h

298 lines
5.9 KiB
C
Raw Normal View History

2021-12-27 01:00:00 +01:00
// Common/MyBuffer.h
2023-06-21 02:00:00 +02:00
#ifndef ZIP7_INC_COMMON_MY_BUFFER_H
#define ZIP7_INC_COMMON_MY_BUFFER_H
#include <string.h>
2021-12-27 01:00:00 +01:00
#include "Defs.h"
#include "MyTypes.h"
/* 7-Zip now uses CBuffer only as CByteBuffer.
2023-06-21 02:00:00 +02:00
So there is no need to use Z7_ARRAY_NEW macro in CBuffer code. */
2021-12-27 01:00:00 +01:00
template <class T> class CBuffer
{
T *_items;
size_t _size;
public:
void Free()
{
if (_items)
{
delete []_items;
2023-06-21 02:00:00 +02:00
_items = NULL;
2021-12-27 01:00:00 +01:00
}
_size = 0;
}
2023-06-21 02:00:00 +02:00
CBuffer(): _items(NULL), _size(0) {}
CBuffer(size_t size): _items(NULL), _size(0)
{
if (size != 0)
{
_items = new T[size];
_size = size;
}
}
CBuffer(const CBuffer &buffer): _items(NULL), _size(0)
2021-12-27 01:00:00 +01:00
{
2023-06-21 02:00:00 +02:00
const size_t size = buffer._size;
2021-12-27 01:00:00 +01:00
if (size != 0)
{
_items = new T[size];
memcpy(_items, buffer._items, size * sizeof(T));
_size = size;
}
}
~CBuffer() { delete []_items; }
operator T *() { return _items; }
operator const T *() const { return _items; }
2024-05-14 02:00:00 +02:00
const T* ConstData() const { return _items; }
T* NonConstData() const { return _items; }
T* NonConstData() { return _items; }
// const T* Data() const { return _items; }
// T* Data() { return _items; }
2021-12-27 01:00:00 +01:00
size_t Size() const { return _size; }
void Alloc(size_t size)
{
if (size != _size)
{
Free();
if (size != 0)
{
_items = new T[size];
_size = size;
}
}
}
void AllocAtLeast(size_t size)
{
if (size > _size)
{
Free();
_items = new T[size];
_size = size;
}
}
void CopyFrom(const T *data, size_t size)
{
Alloc(size);
if (size != 0)
memcpy(_items, data, size * sizeof(T));
}
void ChangeSize_KeepData(size_t newSize, size_t keepSize)
{
if (newSize == _size)
return;
T *newBuffer = NULL;
if (newSize != 0)
{
newBuffer = new T[newSize];
if (keepSize > _size)
keepSize = _size;
if (keepSize != 0)
memcpy(newBuffer, _items, MyMin(keepSize, newSize) * sizeof(T));
}
delete []_items;
_items = newBuffer;
_size = newSize;
}
void Wipe()
{
if (_size != 0)
memset(_items, 0, _size * sizeof(T));
}
CBuffer& operator=(const CBuffer &buffer)
{
if (&buffer != this)
CopyFrom(buffer, buffer._size);
return *this;
}
};
template <class T>
bool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2)
{
size_t size1 = b1.Size();
if (size1 != b2.Size())
return false;
if (size1 == 0)
return true;
return memcmp(b1, b2, size1 * sizeof(T)) == 0;
}
template <class T>
bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2)
{
size_t size1 = b1.Size();
if (size1 != b2.Size())
return true;
if (size1 == 0)
return false;
return memcmp(b1, b2, size1 * sizeof(T)) != 0;
}
// typedef CBuffer<char> CCharBuffer;
// typedef CBuffer<wchar_t> CWCharBuffer;
2024-05-14 02:00:00 +02:00
typedef CBuffer<Byte> CByteBuffer;
2021-12-27 01:00:00 +01:00
class CByteBuffer_Wipe: public CByteBuffer
{
2023-06-21 02:00:00 +02:00
Z7_CLASS_NO_COPY(CByteBuffer_Wipe)
2021-12-27 01:00:00 +01:00
public:
2024-05-14 02:00:00 +02:00
// CByteBuffer_Wipe(): CBuffer<Byte>() {}
CByteBuffer_Wipe(size_t size): CBuffer<Byte>(size) {}
2021-12-27 01:00:00 +01:00
~CByteBuffer_Wipe() { Wipe(); }
};
template <class T> class CObjArray
{
protected:
T *_items;
private:
// we disable copy
CObjArray(const CObjArray &buffer);
void operator=(const CObjArray &buffer);
public:
void Free()
{
delete []_items;
2023-06-21 02:00:00 +02:00
_items = NULL;
2021-12-27 01:00:00 +01:00
}
2023-06-21 02:00:00 +02:00
CObjArray(size_t size): _items(NULL)
2021-12-27 01:00:00 +01:00
{
if (size != 0)
{
2023-06-21 02:00:00 +02:00
Z7_ARRAY_NEW(_items, T, size)
2021-12-27 01:00:00 +01:00
// _items = new T[size];
}
}
2023-06-21 02:00:00 +02:00
CObjArray(): _items(NULL) {}
2021-12-27 01:00:00 +01:00
~CObjArray() { delete []_items; }
operator T *() { return _items; }
operator const T *() const { return _items; }
2024-05-14 02:00:00 +02:00
const T* ConstData() const { return _items; }
T* NonConstData() const { return _items; }
T* NonConstData() { return _items; }
// const T* Data() const { return _items; }
// T* Data() { return _items; }
2021-12-27 01:00:00 +01:00
void Alloc(size_t newSize)
{
delete []_items;
2023-06-21 02:00:00 +02:00
_items = NULL;
Z7_ARRAY_NEW(_items, T, newSize)
2021-12-27 01:00:00 +01:00
// _items = new T[newSize];
}
};
2024-05-14 02:00:00 +02:00
typedef CObjArray<Byte> CByteArr;
2021-12-27 01:00:00 +01:00
typedef CObjArray<bool> CBoolArr;
typedef CObjArray<int> CIntArr;
typedef CObjArray<unsigned> CUIntArr;
template <class T> class CObjArray2
{
T *_items;
unsigned _size;
// we disable copy
CObjArray2(const CObjArray2 &buffer);
void operator=(const CObjArray2 &buffer);
public:
void Free()
{
delete []_items;
2023-06-21 02:00:00 +02:00
_items = NULL;
2021-12-27 01:00:00 +01:00
_size = 0;
}
2023-06-21 02:00:00 +02:00
CObjArray2(): _items(NULL), _size(0) {}
2021-12-27 01:00:00 +01:00
/*
2023-06-21 02:00:00 +02:00
CObjArray2(const CObjArray2 &buffer): _items(NULL), _size(0)
2021-12-27 01:00:00 +01:00
{
size_t newSize = buffer._size;
if (newSize != 0)
{
T *newBuffer = new T[newSize];;
_items = newBuffer;
_size = newSize;
const T *src = buffer;
for (size_t i = 0; i < newSize; i++)
newBuffer[i] = src[i];
}
}
*/
/*
2023-06-21 02:00:00 +02:00
CObjArray2(size_t size): _items(NULL), _size(0)
2021-12-27 01:00:00 +01:00
{
if (size != 0)
{
_items = new T[size];
_size = size;
}
}
*/
~CObjArray2() { delete []_items; }
operator T *() { return _items; }
operator const T *() const { return _items; }
unsigned Size() const { return (unsigned)_size; }
bool IsEmpty() const { return _size == 0; }
// SetSize doesn't keep old items. It allocates new array if size is not equal
void SetSize(unsigned size)
{
if (size == _size)
return;
T *newBuffer = NULL;
if (size != 0)
{
2023-06-21 02:00:00 +02:00
Z7_ARRAY_NEW(newBuffer, T, size)
2021-12-27 01:00:00 +01:00
// newBuffer = new T[size];
}
delete []_items;
_items = newBuffer;
_size = size;
}
/*
CObjArray2& operator=(const CObjArray2 &buffer)
{
Free();
size_t newSize = buffer._size;
if (newSize != 0)
{
T *newBuffer = new T[newSize];;
_items = newBuffer;
_size = newSize;
const T *src = buffer;
for (size_t i = 0; i < newSize; i++)
newBuffer[i] = src[i];
}
return *this;
}
*/
};
#endif