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(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_SIGNATURE2(ArrayAppendElt, TypedArrayCoreRef, void) { TypedArrayCoreRef array = _Param(0); array->Insert1D(array->Length(), 1, _ParamPointer(1)); return _NextInstruction(); }