mirror of
https://github.com/mamedev/mame.git
synced 2024-11-16 07:48:32 +01:00
164 lines
3.1 KiB
C++
164 lines
3.1 KiB
C++
// Common/MyBuffer2.h
|
|
|
|
#ifndef ZIP7_INC_COMMON_MY_BUFFER2_H
|
|
#define ZIP7_INC_COMMON_MY_BUFFER2_H
|
|
|
|
#include "../../C/Alloc.h"
|
|
|
|
#include "MyTypes.h"
|
|
|
|
class CMidBuffer
|
|
{
|
|
Byte *_data;
|
|
size_t _size;
|
|
|
|
Z7_CLASS_NO_COPY(CMidBuffer)
|
|
|
|
public:
|
|
CMidBuffer(): _data(NULL), _size(0) {}
|
|
~CMidBuffer() { ::MidFree(_data); }
|
|
|
|
void Free() { ::MidFree(_data); _data = NULL; _size = 0; }
|
|
|
|
bool IsAllocated() const { return _data != NULL; }
|
|
operator Byte *() { return _data; }
|
|
operator const Byte *() const { return _data; }
|
|
size_t Size() const { return _size; }
|
|
|
|
void Alloc(size_t size)
|
|
{
|
|
if (!_data || size != _size)
|
|
{
|
|
::MidFree(_data);
|
|
_size = 0;
|
|
_data = NULL;
|
|
_data = (Byte *)::MidAlloc(size);
|
|
if (_data)
|
|
_size = size;
|
|
}
|
|
}
|
|
|
|
void AllocAtLeast(size_t size)
|
|
{
|
|
if (!_data || size > _size)
|
|
{
|
|
::MidFree(_data);
|
|
const size_t kMinSize = (size_t)1 << 16;
|
|
if (size < kMinSize)
|
|
size = kMinSize;
|
|
_size = 0;
|
|
_data = NULL;
|
|
_data = (Byte *)::MidAlloc(size);
|
|
if (_data)
|
|
_size = size;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
class CAlignedBuffer1
|
|
{
|
|
Byte *_data;
|
|
|
|
Z7_CLASS_NO_COPY(CAlignedBuffer1)
|
|
|
|
public:
|
|
~CAlignedBuffer1()
|
|
{
|
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
|
}
|
|
|
|
CAlignedBuffer1(size_t size)
|
|
{
|
|
_data = NULL;
|
|
_data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size);
|
|
if (!_data)
|
|
throw 1;
|
|
}
|
|
|
|
operator Byte *() { return _data; }
|
|
operator const Byte *() const { return _data; }
|
|
};
|
|
|
|
|
|
class CAlignedBuffer
|
|
{
|
|
Byte *_data;
|
|
size_t _size;
|
|
|
|
Z7_CLASS_NO_COPY(CAlignedBuffer)
|
|
|
|
public:
|
|
CAlignedBuffer(): _data(NULL), _size(0) {}
|
|
~CAlignedBuffer()
|
|
{
|
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
|
}
|
|
|
|
CAlignedBuffer(size_t size): _size(0)
|
|
{
|
|
_data = NULL;
|
|
_data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size);
|
|
if (!_data)
|
|
throw 1;
|
|
_size = size;
|
|
}
|
|
|
|
void Free()
|
|
{
|
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
|
_data = NULL;
|
|
_size = 0;
|
|
}
|
|
|
|
bool IsAllocated() const { return _data != NULL; }
|
|
operator Byte *() { return _data; }
|
|
operator const Byte *() const { return _data; }
|
|
size_t Size() const { return _size; }
|
|
|
|
void Alloc(size_t size)
|
|
{
|
|
if (!_data || size != _size)
|
|
{
|
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
|
_size = 0;
|
|
_data = NULL;
|
|
_data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size);
|
|
if (_data)
|
|
_size = size;
|
|
}
|
|
}
|
|
|
|
void AllocAtLeast(size_t size)
|
|
{
|
|
if (!_data || size > _size)
|
|
{
|
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
|
_size = 0;
|
|
_data = NULL;
|
|
_data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size);
|
|
if (_data)
|
|
_size = size;
|
|
}
|
|
}
|
|
};
|
|
|
|
/*
|
|
CMidAlignedBuffer must return aligned pointer.
|
|
- in Windows it uses CMidBuffer(): MidAlloc() : VirtualAlloc()
|
|
VirtualAlloc(): Memory allocated is automatically initialized to zero.
|
|
MidAlloc(0) returns NULL
|
|
- in non-Windows systems it uses g_AlignedAlloc.
|
|
g_AlignedAlloc::Alloc(size = 0) can return non NULL.
|
|
*/
|
|
|
|
typedef
|
|
#ifdef _WIN32
|
|
CMidBuffer
|
|
#else
|
|
CAlignedBuffer
|
|
#endif
|
|
CMidAlignedBuffer;
|
|
|
|
|
|
#endif
|