From 29ee94387128a63cc7881f5543ec8e0c3a3723c8 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 1 Aug 2013 23:14:49 +0200 Subject: [PATCH] Made non-filling version of ByteArray::Resize Former-commit-id: 0fec6b5749a786fc1999b9fc718a481d47c52895 --- include/Nazara/Core/ByteArray.hpp | 6 ++-- src/Nazara/Core/ByteArray.cpp | 54 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/include/Nazara/Core/ByteArray.hpp b/include/Nazara/Core/ByteArray.hpp index a83a1d204..597c5143a 100644 --- a/include/Nazara/Core/ByteArray.hpp +++ b/include/Nazara/Core/ByteArray.hpp @@ -50,8 +50,10 @@ class NAZARA_API NzByteArray : public NzHashable void Reserve(unsigned int bufferSize); - NzByteArray& Resize(int size, nzUInt8 byte = 0); - NzByteArray Resized(int size, nzUInt8 byte = 0) const; + NzByteArray& Resize(int size); + NzByteArray& Resize(int size, nzUInt8 byte); + NzByteArray Resized(int size) const; + NzByteArray Resized(int size, nzUInt8 byte) const; NzByteArray SubArray(int startPos, int endPos = -1) const; diff --git a/src/Nazara/Core/ByteArray.cpp b/src/Nazara/Core/ByteArray.cpp index 3f4669fed..1689896ab 100644 --- a/src/Nazara/Core/ByteArray.cpp +++ b/src/Nazara/Core/ByteArray.cpp @@ -213,6 +213,42 @@ void NzByteArray::Reserve(unsigned int bufferSize) m_sharedArray->size = size; } +NzByteArray& NzByteArray::Resize(int size) +{ + if (size == 0) + { + Clear(true); + return *this; + } + + if (size < 0) + size = std::max(static_cast(m_sharedArray->size + size), 0); + + unsigned int newSize = static_cast(size); + + if (m_sharedArray->capacity >= newSize) + { + EnsureOwnership(); + + // Nous avons déjà la place requise + m_sharedArray->size = newSize; + } + else // On veut forcément agrandir la chaine + { + nzUInt8* newBuffer = new nzUInt8[newSize]; + if (m_sharedArray->size != 0) + std::memcpy(newBuffer, m_sharedArray->buffer, newSize); + + ReleaseArray(); + m_sharedArray = new SharedArray; + m_sharedArray->buffer = newBuffer; + m_sharedArray->capacity = newSize; + m_sharedArray->size = newSize; + } + + return *this; +} + NzByteArray& NzByteArray::Resize(int size, nzUInt8 byte) { if (size == 0) @@ -254,6 +290,24 @@ NzByteArray& NzByteArray::Resize(int size, nzUInt8 byte) return *this; } +NzByteArray NzByteArray::Resized(int size) const +{ + if (size < 0) + size = m_sharedArray->size + size; + + if (size <= 0) + return NzByteArray(); + + unsigned int newSize = static_cast(size); + if (newSize == m_sharedArray->size) + return *this; + + nzUInt8* buffer = new nzUInt8[newSize]; + std::memcpy(buffer, m_sharedArray->buffer, (newSize > m_sharedArray->size) ? m_sharedArray->size : newSize); + + return NzByteArray(new SharedArray(1, newSize, newSize, buffer)); +} + NzByteArray NzByteArray::Resized(int size, nzUInt8 byte) const { if (size < 0)