| // 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 |