bokutotu/zenu

Ref, RefMut MatrixのPtrの実装を変更

Closed this issue · 2 comments

#[derive(Debug)]
pub struct OwnedMem<T: Num, A: MemoryAccessor<Item = T>> {
ptr: NonNull<T>,
offset: usize,
length: usize,
accessor: A,
}
#[derive(Debug)]
pub struct ViewMem<'a, T: Num, A: MemoryAccessor<Item = T>> {
ptr: &'a OwnedMem<T, A>,
offset: usize,
}
#[derive(Debug)]
pub struct ViewMutMem<'a, T: Num, A: MemoryAccessor<Item = T>> {
ptr: &'a mut OwnedMem<T, A>,
offset: usize,
}

この実装の方が、borrow系のライフタイムをあまり気にしなくて良いので実装としては、いい気がする。
この実装の問題点としては、RefとRefMutがほぼ同じ実装になる可能性がある。

この実装のいいところとしては、以下のようなコードが書けるようになる。

let a: Option<Matrix<Owned<f32, DimDyn, Nvidia>> = ...;
let a_ref: Option<Matrix<Ref<f32>, DimDyn, Nvidia>> = a.map(|a|a.to_ref());

みたいなことができる。
今の実装だと、creates a temporary value which is freed while still in useのエラーがでる。これは、'aのライフタイムが合わないから。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=96e7383dd368070c0197649ccc2acdf1
こんな感じできる

そっくりそのまま置き換えると大変なことになるので、一旦は、RefとView,ViewMutの構造体両方とも使用して、段階的にRefを廃止していく

ndarrayの実装をパクったけど、元の実装の方が良さそう...