/* Copy a line from an array to a buffer: */ int NI_ArrayToLineBuffer(NI_LineBuffer *buffer, maybelong *number_of_lines, int *more) { double *pb = buffer->buffer_data; char *pa; maybelong length = buffer->line_length; pb += buffer->size1; *number_of_lines = 0; /* fill until all lines in the array have been processed, or until the buffer is full: */ while (buffer->next_line < buffer->array_lines && *number_of_lines < buffer->buffer_lines) { pa = buffer->array_data; /* copy the data from the array to the buffer: */ switch (buffer->array_type) { CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, Bool); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, UInt8); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, UInt16); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, UInt32); #if HAS_UINT64 CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, UInt64); #endif CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, Int8); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, Int16); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, Int32); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, Int64); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, Float32); CASE_COPY_DATA_TO_LINE(pa, pb, length, buffer->line_stride, Float64); default: PyErr_Format(PyExc_RuntimeError, "array type %d not supported", buffer->array_type); return 0; } /* goto next line in the array: */ NI_ITERATOR_NEXT(buffer->iterator, buffer->array_data); /* implement boundary conditions to the line: */ if (buffer->size1 + buffer->size2 > 0) if (!NI_ExtendLine(pb - buffer->size1, length, buffer->size1, buffer->size2, buffer->extend_mode, buffer->extend_value)) return 0; /* The number of the array lines copied: */ ++(buffer->next_line); /* keep track of (and return) the number of lines in the buffer: */ ++(*number_of_lines); pb += buffer->line_length + buffer->size1 + buffer->size2; } /* if not all array lines were processed, *more is set true: */ *more = buffer->next_line < buffer->array_lines; return 1; }
/* Copy a line from an array to a buffer: */ int NI_ArrayToLineBuffer(NI_LineBuffer *buffer, npy_intp *number_of_lines, int *more) { double *pb = buffer->buffer_data; char *pa; npy_intp length = buffer->line_length; pb += buffer->size1; *number_of_lines = 0; /* fill until all lines in the array have been processed, or until the buffer is full: */ while (buffer->next_line < buffer->array_lines && *number_of_lines < buffer->buffer_lines) { pa = buffer->array_data; /* copy the data from the array to the buffer: */ switch (buffer->array_type) { CASE_COPY_DATA_TO_LINE(NPY_BOOL, npy_bool, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_UBYTE, npy_ubyte, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_USHORT, npy_ushort, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_UINT, npy_uint, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_ULONG, npy_ulong, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_ULONGLONG, npy_ulonglong, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_BYTE, npy_byte, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_SHORT, npy_short, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_INT, npy_int, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_LONG, npy_long, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_LONGLONG, npy_longlong, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_FLOAT, npy_float, pa, pb, length, buffer->line_stride); CASE_COPY_DATA_TO_LINE(NPY_DOUBLE, npy_double, pa, pb, length, buffer->line_stride); default: PyErr_Format(PyExc_RuntimeError, "array type %d not supported", buffer->array_type); return 0; } /* goto next line in the array: */ NI_ITERATOR_NEXT(buffer->iterator, buffer->array_data); /* implement boundary conditions to the line: */ if (buffer->size1 + buffer->size2 > 0) { if (!NI_ExtendLine(pb - buffer->size1, length, buffer->size1, buffer->size2, buffer->extend_mode, buffer->extend_value)) { return 0; } } /* The number of the array lines copied: */ ++(buffer->next_line); /* keep track of (and return) the number of lines in the buffer: */ ++(*number_of_lines); pb += buffer->line_length + buffer->size1 + buffer->size2; } /* if not all array lines were processed, *more is set true: */ *more = buffer->next_line < buffer->array_lines; return 1; }