Example #1
0
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();
}
Example #2
0
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();
}
Example #3
0
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();
}
Example #4
0
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();
}
Example #5
0
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();
}