+
+# 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;
+ `}
+end