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_SIGNATURE2(ArrayReverse, TypedArrayCoreRef, TypedArrayCoreRef) { TypedArrayCoreRef arrayOut = _Param(0); TypedArrayCoreRef arrayIn = _Param(1); IntIndex arrayInLength = arrayIn->Length(); VIREO_ASSERT(arrayOut != arrayIn); arrayOut->Resize1D(arrayInLength); for (IntIndex i = 0; i < arrayInLength; i++) arrayOut->ElementType()->CopyData(arrayIn->BeginAt(i), arrayOut->BeginAt(arrayInLength - 1 - i)); 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_SIGNATURE3(ArrayIndexElt, TypedArrayCoreRef, Int32, void) { TypedArrayCoreRef array = _Param(0); Int32 length = array->Length(); TypeRef elementType = array->ElementType(); Int32 index = _Param(1); if (_ParamPointer(2)) { if (index < 0 || index >= length) { elementType->InitData(_ParamPointer(2)); } else { elementType->CopyData(array->BeginAt(index), _ParamPointer(2)); } } 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(); }
VIREO_FUNCTION_SIGNATURE4(ArraySubset, TypedArrayCoreRef, TypedArrayCoreRef, IntIndex, IntIndex) { TypedArrayCoreRef arrayOut = _Param(0); TypedArrayCoreRef arrayIn = _Param(1); Int32 idx = (_ParamPointer(2) != null) ? _Param(2) : 0; idx = Max(idx, 0); // coerce index to non-negative integer VIREO_ASSERT(arrayOut != arrayIn || idx == 0); Int32 maxLen = arrayIn->Length() - idx; // calculate count from idx to end of array maxLen = Max(maxLen, 0); Int32 len = (_ParamPointer(3) != null) ? _Param(3) : maxLen; len = Max(len, 0); len = Min(len, maxLen); // coerce len to 0 .. maxLen arrayOut->Resize1D(len); if(idx < arrayIn->Length() && arrayOut != arrayIn) { arrayOut->ElementType()->CopyData(arrayIn->BeginAt(idx), arrayOut->BeginAt(0), len); } return _NextInstruction(); }
VIREO_FUNCTION_SIGNATURE3(ArrayRotate, TypedArrayCoreRef, TypedArrayCoreRef, Int32) { TypedArrayCoreRef arrayOut = _Param(0); TypedArrayCoreRef arrayIn = _Param(1); Int32 offset = _Param(2); VIREO_ASSERT(arrayOut != arrayIn); IntIndex arrayInLength = arrayIn->Length(); arrayOut->Resize1D(arrayInLength); if (arrayInLength > 0) { offset = offset % arrayInLength; if (offset < 0) offset += arrayInLength; arrayOut->ElementType()->CopyData(arrayIn->BeginAt(0), arrayOut->BeginAt(offset), arrayInLength - offset); arrayOut->ElementType()->CopyData(arrayIn->BeginAt(arrayInLength - offset), arrayOut->BeginAt(0), offset); } return _NextInstruction(); }