VIREO_FUNCTION_SIGNATURE4(ArrayInsertSubset, TypedArrayCoreRef, TypedArrayCoreRef, Int32, TypedArrayCoreRef) { TypedArrayCoreRef arrayOut = _Param(0); TypedArrayCoreRef arrayIn = _Param(1); IntIndex arrayInLength = arrayIn->Length(); Int32 idx = (_ParamPointer(2) != null) ? _Param(2) : arrayInLength; TypedArrayCoreRef subArray = _Param(3); IntIndex subArrayLength = subArray->Length(); VIREO_ASSERT(arrayOut != subArray); if (0 <= idx && idx <= arrayInLength) { if (arrayOut == arrayIn){ arrayOut->Insert1D(idx, subArrayLength, subArray->BeginAt(0)); } else { arrayOut->Resize1D(arrayInLength + subArrayLength); // Copy the original array up to the insert point arrayOut->ElementType()->CopyData(arrayIn->BeginAt(0), arrayOut->BeginAt(0), idx); // Copy the inserted subarray arrayOut->ElementType()->CopyData(subArray->BeginAt(0), arrayOut->BeginAt(idx), subArrayLength); // Copy the rest of the original array. arrayOut->ElementType()->CopyData(arrayIn->BeginAt(idx), arrayOut->BeginAt(idx + subArrayLength), arrayInLength - idx); } } else if (arrayOut != arrayIn) arrayOut->Type()->CopyData(_ParamPointer(1), _ParamPointer(0)); return _NextInstruction(); }
VIREO_FUNCTION_SIGNATURE4(ArrayReplaceSubset, TypedArrayCoreRef, TypedArrayCoreRef, Int32, TypedArrayCoreRef) { TypedArrayCoreRef arrayOut = _Param(0); TypedArrayCoreRef arrayIn = _Param(1); Int32 idx = _Param(2); TypedArrayCoreRef subArray = _Param(3); VIREO_ASSERT(arrayOut != subArray); if(arrayOut != arrayIn){ arrayOut->Type()->CopyData(_ParamPointer(1), _ParamPointer(0)); } if(idx >= 0 && idx < arrayOut->Length()) { Int32 length = Min(subArray->Length(), arrayOut->Length() - idx); arrayIn->ElementType()->CopyData(subArray->BeginAt(0), arrayOut->BeginAt(idx), length); } return _NextInstruction(); }
VIREO_FUNCTION_SIGNATURE4(ArrayInsertElt, TypedArrayCoreRef, TypedArrayCoreRef, Int32, void) { TypedArrayCoreRef arrayOut = _Param(0); TypedArrayCoreRef arrayIn = _Param(1); Int32 length = arrayIn->Length(); Int32 index = (_ParamPointer(2) != null) ? _Param(2) : length; if(arrayOut != arrayIn) arrayOut->Type()->CopyData(_ParamPointer(1), _ParamPointer(0)); if (0 <= index && index <= length) arrayOut->Insert1D(index, 1, _ParamPointer(3)); return _NextInstruction(); }
//------------------------------------------------------------ VIREO_FUNCTION_SIGNATURE4(ArrayReplaceElt, TypedArrayCoreRef, TypedArrayCoreRef, Int32, void) { TypedArrayCoreRef arrayOut = _Param(0); TypedArrayCoreRef arrayIn = _Param(1); TypeRef elementType = arrayOut->ElementType(); Int32 index = _Param(2); Int32 length = arrayIn->Length(); if(arrayOut != arrayIn){ arrayOut->Type()->CopyData(_ParamPointer(1), _ParamPointer(0)); } if (index >= 0 && index < length) { void* pDest = arrayOut->BeginAt(index); elementType->CopyData(_ParamPointer(3), pDest); } return _NextInstruction(); }