@@ -299,6 +299,14 @@ class MaybeStackArray {
299299 * Destructor deletes the array (if owned).
300300 */
301301 ~MaybeStackArray () { releaseArray (); }
302+ /* *
303+ * Move constructor: transfers ownership or copies the stack array.
304+ */
305+ MaybeStackArray (MaybeStackArray<T, stackCapacity> &&src) U_NOEXCEPT;
306+ /* *
307+ * Move assignment: transfers ownership or copies the stack array.
308+ */
309+ MaybeStackArray<T, stackCapacity> &operator =(MaybeStackArray<T, stackCapacity> &&src) U_NOEXCEPT;
302310 /* *
303311 * Returns the array capacity (number of T items).
304312 * @return array capacity
@@ -376,6 +384,11 @@ class MaybeStackArray {
376384 uprv_free (ptr);
377385 }
378386 }
387+ void resetToStackArray () {
388+ ptr=stackArray;
389+ capacity=stackCapacity;
390+ needToRelease=FALSE ;
391+ }
379392 /* No comparison operators with other MaybeStackArray's. */
380393 bool operator ==(const MaybeStackArray & /* other*/ ) {return FALSE ;}
381394 bool operator !=(const MaybeStackArray & /* other*/ ) {return TRUE ;}
@@ -398,6 +411,34 @@ class MaybeStackArray {
398411#endif
399412};
400413
414+ template <typename T, int32_t stackCapacity>
415+ icu::MaybeStackArray<T, stackCapacity>::MaybeStackArray(
416+ MaybeStackArray <T, stackCapacity>&& src) U_NOEXCEPT
417+ : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
418+ if (src.ptr == src.stackArray ) {
419+ ptr = stackArray;
420+ uprv_memcpy (stackArray, src.stackArray , sizeof (T) * src.capacity );
421+ } else {
422+ src.resetToStackArray (); // take ownership away from src
423+ }
424+ }
425+
426+ template <typename T, int32_t stackCapacity>
427+ inline MaybeStackArray <T, stackCapacity>&
428+ MaybeStackArray<T, stackCapacity>::operator =(MaybeStackArray <T, stackCapacity>&& src) U_NOEXCEPT {
429+ releaseArray (); // in case this instance had its own memory allocated
430+ capacity = src.capacity ;
431+ needToRelease = src.needToRelease ;
432+ if (src.ptr == src.stackArray ) {
433+ ptr = stackArray;
434+ uprv_memcpy (stackArray, src.stackArray , sizeof (T) * src.capacity );
435+ } else {
436+ ptr = src.ptr ;
437+ src.resetToStackArray (); // take ownership away from src
438+ }
439+ return *this ;
440+ }
441+
401442template <typename T, int32_t stackCapacity>
402443inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
403444 if (newCapacity>0 ) {
@@ -447,9 +488,7 @@ inline T *MaybeStackArray<T, stackCapacity>::orphanOrClone(int32_t length, int32
447488 uprv_memcpy (p, ptr, (size_t )length*sizeof (T));
448489 }
449490 resultCapacity=length;
450- ptr=stackArray;
451- capacity=stackCapacity;
452- needToRelease=FALSE ;
491+ resetToStackArray ();
453492 return p;
454493}
455494
0 commit comments