Property definitions

matrix $ NativeDoubleArray :: defaultinit
# 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