diff options
Diffstat (limited to 'src/libs/7zip/unix/CPP/Common/DynamicBuffer.h')
-rw-r--r-- | src/libs/7zip/unix/CPP/Common/DynamicBuffer.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/libs/7zip/unix/CPP/Common/DynamicBuffer.h b/src/libs/7zip/unix/CPP/Common/DynamicBuffer.h new file mode 100644 index 000000000..b5fd97823 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Common/DynamicBuffer.h @@ -0,0 +1,50 @@ +// Common/DynamicBuffer.h + +#ifndef __COMMON_DYNAMIC_BUFFER_H +#define __COMMON_DYNAMIC_BUFFER_H + +#include "Buffer.h" + +template <class T> class CDynamicBuffer: public CBuffer<T> +{ + void GrowLength(size_t size) + { + size_t delta; + if (this->_capacity > 64) + delta = this->_capacity / 4; + else if (this->_capacity > 8) + delta = 16; + else + delta = 4; + delta = MyMax(delta, size); + size_t newCap = this->_capacity + delta; + if (newCap < delta) + newCap = this->_capacity + size; + this->SetCapacity(newCap); + } +public: + CDynamicBuffer(): CBuffer<T>() {}; + CDynamicBuffer(const CDynamicBuffer &buffer): CBuffer<T>(buffer) {}; + CDynamicBuffer(size_t size): CBuffer<T>(size) {}; + CDynamicBuffer& operator=(const CDynamicBuffer &buffer) + { + this->Free(); + if (buffer._capacity > 0) + { + SetCapacity(buffer._capacity); + memmove(this->_items, buffer._items, buffer._capacity * sizeof(T)); + } + return *this; + } + void EnsureCapacity(size_t capacity) + { + if (this->_capacity < capacity) + GrowLength(capacity - this->_capacity); + } +}; + +typedef CDynamicBuffer<char> CCharDynamicBuffer; +typedef CDynamicBuffer<wchar_t> CWCharDynamicBuffer; +typedef CDynamicBuffer<unsigned char> CByteDynamicBuffer; + +#endif |