From f33891ef1ca98eadd9dc5e926bccfdf4de898ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Thu, 23 Dec 2021 21:11:18 +0100 Subject: [PATCH] Rework ByteArray::resize() to keep buffer data --- include/bytearray.h | 8 +++++--- src/bytearray.cpp | 49 +++++++++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/include/bytearray.h b/include/bytearray.h index d5339d1..e2f8d29 100644 --- a/include/bytearray.h +++ b/include/bytearray.h @@ -156,10 +156,12 @@ namespace gourou unsigned int size() const {return length();} /** - * @brief Create a new internal buffer of length bytes - * All previous data is lost + * @brief Increase or decrease internal buffer + * @param length New length of internal buffer + * @param keepData If true copy old data on new buffer, if false, + * create a new buffer with random data */ - void resize(unsigned int length); + void resize(unsigned int length, bool keepData=true); ByteArray& operator=(const ByteArray& other); diff --git a/src/bytearray.cpp b/src/bytearray.cpp index ceb7a98..0bfbbab 100644 --- a/src/bytearray.cpp +++ b/src/bytearray.cpp @@ -172,33 +172,44 @@ namespace gourou void ByteArray::append(const unsigned char* data, unsigned int length) { - unsigned char* oldData = _data; - unsigned char* newData; - - if (_useMalloc) - newData = (unsigned char*)malloc(_length+length); - else - newData = new unsigned char[_length+length]; - - memcpy(newData, oldData, _length); + if (!length) + return; - delRef(); + unsigned int oldLength = _length; - memcpy(&newData[_length], data, length); - _length += length; - - _data = newData; - - addRef(); + resize(_length+length, true); + + memcpy(&_data[oldLength], data, length); } void ByteArray::append(unsigned char c) { append(&c, 1);} void ByteArray::append(const char* str) { append((const unsigned char*)str, strlen(str));} void ByteArray::append(const std::string& str) { append((const unsigned char*)str.c_str(), str.length()); } - void ByteArray::resize(unsigned length) + void ByteArray::resize(unsigned length, bool keepData) { - delRef(); - initData(0, length); + if (length == _length) + return; + else if (length < _length) + _length = length ; // Don't touch data + else // New size > + { + unsigned char* newData; + + if (_useMalloc) + newData = (unsigned char*)malloc(_length+length); + else + newData = new unsigned char[_length+length]; + + if (keepData) + memcpy(newData, _data, _length); + + delRef(); + + _length = length; + _data = newData; + + addRef(); + } } }