我正在创建 std::sync::atomic::Ordering 的子集:
如您所见,现在我需要再次使用
use std::sync::atomic::Ordering;
pub enum StoreOrdering {
Relaxed,
Release,
SeqCst
}
impl Into<Ordering> for StoreOrdering {
fn into(self) -> Ordering {
match self {
Self::Relaxed => Ordering::Relaxed,
Self::Release => Ordering::Release,
Self::SeqCst => Ordering::SeqCst
}
}
}
impl std::convert::TryFrom<Ordering> for StoreOrdering {
type Error = (); // HACK
fn try_from(ord: Ordering) -> Result<Self, Self::Error> {
match ord {
Ordering::Relaxed => Ok(Self::Relaxed),
Ordering::Release => Ok(Self::Release),
Ordering::SeqCst => Ok(Self::SeqCst),
_ => Err(())
}
}
}
enum LoadOrdering {
Acquire,
Relaxed,
SeqCst
}
// ???
如您所见,现在我需要再次使用
match
来编写那两个impl
,分别对应于StoreOrdering <-> LoadOrdering
和LoadOrdering <-> StoreOrdering
,甚至是任何枚举子集。如何避免这种样板代码?
AtomicPtr
编写AtomicRef
。AtomicPtr :: load()
和AtomicPtr :: store()
接收Ordering
,如果不是预期的Ordering
子集,则会出现恐慌 - 我觉得这很愚蠢,并希望通过编译时检查(对于我的AtomicRef
)来提高质量,因此...就有了这个问题。你的宏似乎很有趣,我应该试试。 - passing_through