@@ -1201,15 +1201,31 @@ VIREO_FUNCTION_SIGNATURET(ArrayMaxMinInternal, FindArrayMaxMinInstruction)
1201
1201
}
1202
1202
// NOLINT(runtime/references)
1203
1203
static void CopySubArray (AQBlock1* &sourcePtr, AQBlock1* &destinationPtr, // NOLINT(runtime/references)
1204
- const UInt32 elementSize, const size_t elementsToCopy )
1204
+ const size_t elementsToCopy, TypedArrayCoreRef arraySource, TypedArrayCoreRef arrayDest )
1205
1205
{
1206
- if (elementsToCopy) {
1207
- size_t bytesToCopy = elementsToCopy * elementSize;
1208
- if (destinationPtr) {
1209
- memmove (destinationPtr, sourcePtr, bytesToCopy);
1210
- sourcePtr += bytesToCopy, destinationPtr += bytesToCopy;
1211
- } else {
1212
- sourcePtr += bytesToCopy;
1206
+ NIError err = kNIError_Success ;
1207
+ TypeRef elementType = arraySource->ElementType ();
1208
+ if (elementType->IsFlat ()) {
1209
+ if (elementsToCopy) {
1210
+ size_t bytesToCopy = elementsToCopy * elementType->TopAQSize ();
1211
+ if (destinationPtr) {
1212
+ memmove (destinationPtr, sourcePtr, bytesToCopy);
1213
+ sourcePtr += bytesToCopy, destinationPtr += bytesToCopy;
1214
+ } else {
1215
+ sourcePtr += bytesToCopy;
1216
+ }
1217
+ }
1218
+ } else {
1219
+ IntIndex stride = elementType->TopAQSize ();
1220
+ IntIndex count = elementsToCopy;
1221
+ for (Int32 i = 0 ; i < count; i++) {
1222
+ err = elementType->CopyData (sourcePtr, destinationPtr);
1223
+ if (err != kNIError_Success ) {
1224
+ arrayDest->Resize1D (0 );
1225
+ break ;
1226
+ }
1227
+ sourcePtr += stride;
1228
+ destinationPtr += stride;
1213
1229
}
1214
1230
}
1215
1231
}
@@ -1316,11 +1332,11 @@ VIREO_FUNCTION_SIGNATURE7(ArrayDeleteND, TypedArrayCoreRef, StaticType, void,
1316
1332
size_t numberOfElementsToBeDeleted = deletedPortionLength * numberOfElementsInDeletedDimension;
1317
1333
size_t numberOfElementsAfterDeleted = (dimensionSize[dimensionToDelete]
1318
1334
- (startIndex + deletedPortionLength)) * numberOfElementsInDeletedDimension;
1319
- Int32 currentDimension;
1335
+ Int32 currentDimension;
1320
1336
do {
1321
- CopySubArray (inputArrayPtr, outputArrayPtr, elementSize, numberOfElementsBeforeDeleted );
1322
- CopySubArray (inputArrayPtr, deletedArrayPtr, elementSize, numberOfElementsToBeDeleted );
1323
- CopySubArray (inputArrayPtr, outputArrayPtr, elementSize, numberOfElementsAfterDeleted );
1337
+ CopySubArray (inputArrayPtr, outputArrayPtr, numberOfElementsBeforeDeleted, arrayIn, arrayOut );
1338
+ CopySubArray (inputArrayPtr, deletedArrayPtr, numberOfElementsToBeDeleted, arrayIn, deletedArray );
1339
+ CopySubArray (inputArrayPtr, outputArrayPtr, numberOfElementsAfterDeleted, arrayIn, arrayOut );
1324
1340
currentDimension = dimensionToDelete;
1325
1341
while (--currentDimension >= 0 && ++index [currentDimension] >= dimensionSize[currentDimension])
1326
1342
index [currentDimension] = 0 ;
0 commit comments