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_SIGNATURE3(FileRead, Int16, Int32, TypedArrayCoreRef) { Int16 handle = _Param(0); Int32 length = _Param(1); TypedArrayCoreRef data; if (_ParamPointer(2)) data = _Param(2); else return _NextInstruction(); PRGID PrgId = CurrentProgramId(); Int32 ISize; DESCR *pTmp; HANDLER arrayHandle; DSPSTAT DspStat; // Create a byte array to hold the data if (length < MIN_ARRAY_ELEMENTS) length = MIN_ARRAY_ELEMENTS; ISize = length * sizeof(DATA8) + sizeof(DESCR); if (cMemoryAlloc(PrgId, POOL_TYPE_MEMORY, (GBINDEX) ISize, (void**) &pTmp, &arrayHandle) == OK) { pTmp->Type = DATA_8; pTmp->ElementSize = (DATA8)sizeof(DATA8); pTmp->Elements = length; // Read the file into the array DspStat = cMemoryReadFile(PrgId, handle, length, DEL_NONE, pTmp->pArray); if (DspStat != FAILBREAK) { // If the array is not big enough, resize it if (data->Length() < length) data->Resize1D(length); // Copy into the output data array for (Int32 i = 0; i < length; i++) *data->BeginAt(i) = pTmp->pArray[i]; cMemoryFreeHandle(PrgId, arrayHandle); } } else DspStat = FAILBREAK; SetDispatchStatus(DspStat); return DspStat == BUSYBREAK ? _this : _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(); }