@@ -299,6 +299,14 @@ class MaybeStackArray {
299
299
* Destructor deletes the array (if owned).
300
300
*/
301
301
~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;
302
310
/* *
303
311
* Returns the array capacity (number of T items).
304
312
* @return array capacity
@@ -376,6 +384,11 @@ class MaybeStackArray {
376
384
uprv_free (ptr);
377
385
}
378
386
}
387
+ void resetToStackArray () {
388
+ ptr=stackArray;
389
+ capacity=stackCapacity;
390
+ needToRelease=FALSE ;
391
+ }
379
392
/* No comparison operators with other MaybeStackArray's. */
380
393
bool operator ==(const MaybeStackArray & /* other*/ ) {return FALSE ;}
381
394
bool operator !=(const MaybeStackArray & /* other*/ ) {return TRUE ;}
@@ -398,6 +411,34 @@ class MaybeStackArray {
398
411
#endif
399
412
};
400
413
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
+
401
442
template <typename T, int32_t stackCapacity>
402
443
inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
403
444
if (newCapacity>0 ) {
@@ -447,9 +488,7 @@ inline T *MaybeStackArray<T, stackCapacity>::orphanOrClone(int32_t length, int32
447
488
uprv_memcpy (p, ptr, (size_t )length*sizeof (T));
448
489
}
449
490
resultCapacity=length;
450
- ptr=stackArray;
451
- capacity=stackCapacity;
452
- needToRelease=FALSE ;
491
+ resetToStackArray ();
453
492
return p;
454
493
}
455
494
0 commit comments