From 368fa950223ca4c436225c2f964112fd345735b6 Mon Sep 17 00:00:00 2001 From: Aaron Swan Date: Sat, 10 Nov 2018 21:05:40 -0700 Subject: [PATCH] Add option to zero-initialize new elements created by resizeAndPreserve. --- blitz/array-impl.h | 36 ++++++++++++++++++--------- blitz/array/resize.cc | 53 +++++++++++++++++++++++++++++++--------- doc/arrays-members.texi | 5 ++-- manual/arrays-members.yo | 4 +-- manual/blitz02.html | 4 +-- 5 files changed, 72 insertions(+), 30 deletions(-) diff --git a/blitz/array-impl.h b/blitz/array-impl.h index 4bff205a..0ca0dbbb 100644 --- a/blitz/array-impl.h +++ b/blitz/array-impl.h @@ -1107,41 +1107,53 @@ class Array : public MemoryBlockReference void resizeAndPreserve(const TinyVector&); - void resizeAndPreserve(int extent); + N_rank>&, + bool zeroInitialize=false); + void resizeAndPreserve(int extent, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, - int extent2); + int extent2, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, - int extent2, int extent3); + int extent2, int extent3, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, - int extent2, int extent3, int extent4); + int extent2, int extent3, int extent4, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, - int extent5); + int extent5, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, - int extent5, int extent6); + int extent5, int extent6, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, - int extent5, int extent6, int extent7); + int extent5, int extent6, int extent7, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5, int extent6, int extent7, - int extent8); + int extent8, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5, int extent6, int extent7, - int extent8, int extent9); + int extent8, int extent9, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5, int extent6, int extent7, int extent8, int extent9, - int extent10); + int extent10, + bool zeroInitialize=false); void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5, int extent6, int extent7, int extent8, int extent9, int extent10, - int extent11); + int extent11, + bool zeroInitialize=false); // NEEDS_WORK -- resizeAndPreserve(Range,...) // NEEDS_WORK -- resizeAndPreserve(const Domain&); diff --git a/blitz/array/resize.cc b/blitz/array/resize.cc index 53af40bf..3f34513f 100644 --- a/blitz/array/resize.cc +++ b/blitz/array/resize.cc @@ -567,7 +567,8 @@ void Array::resize(Range r0, Range r1, Range r2, template -void Array::resizeAndPreserve(int length0) +void Array::resizeAndPreserve(int length0, + bool zeroInitialize) { BZPRECONDITION(length0 > 0); BZPRECONDITION(N_rank == 1); @@ -595,6 +596,8 @@ void Array::resizeAndPreserve(int length0) #endif if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); B(overlap0) = (*this)(overlap0); @@ -604,7 +607,8 @@ void Array::resizeAndPreserve(int length0) } template -void Array::resizeAndPreserve(int length0, int length1) +void Array::resizeAndPreserve(int length0, int length1, + bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0)); BZPRECONDITION(N_rank == 2); @@ -615,6 +619,8 @@ void Array::resizeAndPreserve(int length0, int length1) if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), @@ -627,7 +633,7 @@ void Array::resizeAndPreserve(int length0, int length1) template void Array::resizeAndPreserve(int length0, int length1, - int length2) + int length2, bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0)); BZPRECONDITION(N_rank == 3); @@ -639,6 +645,8 @@ void Array::resizeAndPreserve(int length0, int length1, storage_); if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), @@ -654,7 +662,7 @@ void Array::resizeAndPreserve(int length0, int length1, template void Array::resizeAndPreserve(int length0, int length1, - int length2, int length3) + int length2, int length3, bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0)); @@ -668,6 +676,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), ubound(1))); Range overlap2 = Range(fromStart, (extrema::min)(B.ubound(2), ubound(2))); @@ -681,7 +691,7 @@ void Array::resizeAndPreserve(int length0, int length1, template void Array::resizeAndPreserve(int length0, int length1, - int length2, int length3, int length4) + int length2, int length3, int length4, bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0) && (length4 > 0)); @@ -696,6 +706,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), ubound(1))); Range overlap2 = Range(fromStart, (extrema::min)(B.ubound(2), ubound(2))); @@ -710,7 +722,8 @@ void Array::resizeAndPreserve(int length0, int length1, template void Array::resizeAndPreserve(int length0, int length1, - int length2, int length3, int length4, int length5) + int length2, int length3, int length4, int length5, + bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0) && (length4 > 0) && (length5 > 0)); @@ -725,6 +738,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), ubound(1))); Range overlap2 = Range(fromStart, (extrema::min)(B.ubound(2), ubound(2))); @@ -742,7 +757,8 @@ void Array::resizeAndPreserve(int length0, int length1, /* Added by Julian Cummings */ template void Array::resizeAndPreserve(int length0, int length1, - int length2, int length3, int length4, int length5, int length6) + int length2, int length3, int length4, int length5, int length6, + bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0) && (length4 > 0) && (length5 > 0) && (length6 > 0)); @@ -758,6 +774,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), @@ -785,7 +803,7 @@ void Array::resizeAndPreserve(int length0, int length1, template void Array::resizeAndPreserve(int length0, int length1, int length2, int length3, int length4, int length5, int length6, - int length7) + int length7, bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0) && (length4 > 0) && (length5 > 0) && (length6 > 0) @@ -802,6 +820,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), @@ -831,7 +851,7 @@ void Array::resizeAndPreserve(int length0, int length1, template void Array::resizeAndPreserve(int length0, int length1, int length2, int length3, int length4, int length5, int length6, - int length7, int length8) + int length7, int length8, bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0) && (length4 > 0) && (length5 > 0) && (length6 > 0) @@ -849,6 +869,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), @@ -880,7 +902,7 @@ void Array::resizeAndPreserve(int length0, int length1, template void Array::resizeAndPreserve(int length0, int length1, int length2, int length3, int length4, int length5, int length6, - int length7, int length8, int length9) + int length7, int length8, int length9, bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0) && (length4 > 0) && (length5 > 0) && (length6 > 0) @@ -899,6 +921,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), @@ -932,7 +956,8 @@ void Array::resizeAndPreserve(int length0, int length1, template void Array::resizeAndPreserve(int length0, int length1, int length2, int length3, int length4, int length5, int length6, - int length7, int length8, int length9, int length10) + int length7, int length8, int length9, int length10, + bool zeroInitialize) { BZPRECONDITION((length0 > 0) && (length1 > 0) && (length2 > 0) && (length3 > 0) && (length4 > 0) && (length5 > 0) && (length6 > 0) @@ -952,6 +977,8 @@ void Array::resizeAndPreserve(int length0, int length1, if (numElements()) { + if (zeroInitialize) + B = 0; Range overlap0 = Range(fromStart, (extrema::min)(B.ubound(0), ubound(0))); Range overlap1 = Range(fromStart, (extrema::min)(B.ubound(1), @@ -998,7 +1025,7 @@ void Array::resize(const TinyVector& extent) /* Added by Julian Cummings */ template void Array::resizeAndPreserve( - const TinyVector& extent) + const TinyVector& extent, bool zeroInitialize) { // NEEDS_WORK -- don't resize if unnecessary // BZPRECONDITION(all(extent > 0)); @@ -1008,6 +1035,8 @@ void Array::resizeAndPreserve( if (numElements()) { + if (zeroInitialize) + B = 0; TinyVector ub; for (int d=0; d < N_rank; ++d) ub(d) = (extrema::min)(B.ubound(d),ubound(d)); diff --git a/doc/arrays-members.texi b/doc/arrays-members.texi index 8327e079..3f3bf253 100644 --- a/doc/arrays-members.texi +++ b/doc/arrays-members.texi @@ -429,7 +429,7 @@ the contents of the array are garbage. See also @code{resizeAndPreserve()}. @findex resizeAndPreserve() @cindex Array member functions @code{resizeAndPreserve()} @example -void resizeAndPreserve(int extent1, ...); +void resizeAndPreserve(int extent1, ..., bool zeroInitialize=false); void resizeAndPreserve(const TinyVector&); @end example @@ -437,7 +437,8 @@ These functions resize an array to the specified size. If the array is already the size specified, then no change occurs (the array is not reallocated and copied). The contents of the array are preserved whenever possible; if the new array size is smaller, then some data will be lost. -Any new elements created by resizing the array are left uninitialized. +Any new elements created by resizing the array are left uninitialized +unless zeroInitialize is set to true. @findex reverse(), reverseSelf() @cindex Array member functions @code{reverse()} diff --git a/manual/arrays-members.yo b/manual/arrays-members.yo index e870ec9d..aee6c37a 100644 --- a/manual/arrays-members.yo +++ b/manual/arrays-members.yo @@ -417,7 +417,7 @@ garbage. See also tt(resizeAndPreserve()). bzindex(resizeAndPreserve()) bzindex(Array!member functions!resizeAndPreserve()) bf(bzverb(\ -void resizeAndPreserve(int extent1, ...); +void resizeAndPreserve(int extent1, ..., bool zeroInitialize=false); void resizeAndPreserve(const TinyVector&))); These functions resize an array to the specified size. If the array is already the size specified, then no change @@ -425,7 +425,7 @@ occurs (the array is not reallocated and copied). The contents of the array are preserved whenever possible; if the new array size is smaller, then some data will be lost. Any new elements created by resizing the array -are left uninitialized. +are left uninitialized unless zeroInitialize is set to true. bzindex(reverse(), reverseSelf()) bzindex(Array!member functions!reverse()) diff --git a/manual/blitz02.html b/manual/blitz02.html index f3b012e8..b95792e1 100644 --- a/manual/blitz02.html +++ b/manual/blitz02.html @@ -1151,7 +1151,7 @@

Chapter 2: Arrays

garbage. See also resizeAndPreserve().

-

void                              resizeAndPreserve(int extent1, ...);
+
void                              resizeAndPreserve(int extent1, ..., bool zeroInitialize=false);
 void                              resizeAndPreserve(const TinyVector<int,N_rank>&)
; These functions resize an array to the specified size. If the array is already the size specified, then no change @@ -1159,7 +1159,7 @@

Chapter 2: Arrays

The contents of the array are preserved whenever possible; if the new array size is smaller, then some data will be lost. Any new elements created by resizing the array -are left uninitialized. +are left uninitialized unless zeroInitialize is set to true.