@@ -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