# Specialized native structure to store matrix items and avoid boxing cost
private extern class NativeDoubleArray `{ double* `}
new(size: Int) do
var sizeof_double = 8
var buf = new CString(sizeof_double*size)
return new NativeDoubleArray.in_buffer(buf)
end
new in_buffer(buffer: CString) `{ return (double*)buffer; `}
fun [](i: Int): Float `{ return self[i]; `}
fun []=(i: Int, value: Float) `{ self[i] = value; `}
fun equal_items(other: NativeDoubleArray, len: Int): Bool `{
int i;
for (i = 0; i < len; i ++)
if (self[i] != other[i])
return 0;
return 1;
`}
fun hash_items(len: Int): Int `{
// Adapted from `SequenceRead::hash`
long r = 17+len;
int i;
for (i = 0; i < len; i ++)
r = r * 3 / 2 + (long)(i*1024.0);
return r;
`}
fun mul(a, b: NativeDoubleArray, a_width, a_height, b_width: Int) `{
int i, j, k;
for (j = 0; j < a_height; j ++)
for (i = 0; i < b_width; i ++) {
float sum = 0.0;
for (k = 0; k < a_width; k ++) sum += a[j*a_width + k] * b[k*b_width + i];
self[j*b_width + i] = sum;
}
`}
end
lib/matrix/matrix.nit:301,1--342,3