mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-22 00:43:24 +00:00
Add macros to help implementing SysObj trait
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
1dd1c8c775
commit
a67bd8cdc9
@ -136,3 +136,76 @@ impl SymlinkNodeFields {
|
|||||||
&self.target_path
|
&self.target_path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A macro to automatically generate cast-related methods and `type_` method for `SysObj`
|
||||||
|
/// trait implementation of `SysBranchNode` struct.
|
||||||
|
///
|
||||||
|
/// Users should make sure that the struct has a `weak_self: Weak<Self>` field.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! impl_cast_methods_for_branch {
|
||||||
|
() => {
|
||||||
|
fn as_any(&self) -> &dyn core::any::Any {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cast_to_node(&self) -> Option<Arc<dyn SysNode>> {
|
||||||
|
self.weak_self.upgrade().map(|arc| arc as Arc<dyn SysNode>)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cast_to_branch(&self) -> Option<Arc<dyn SysBranchNode>> {
|
||||||
|
self.weak_self
|
||||||
|
.upgrade()
|
||||||
|
.map(|arc| arc as Arc<dyn SysBranchNode>)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn type_(&self) -> SysNodeType {
|
||||||
|
SysNodeType::Branch
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A macro to automatically generate cast-related methods and `type_` method for `SysObj`
|
||||||
|
/// trait implementation of `SysNode` struct.
|
||||||
|
///
|
||||||
|
/// If the struct is also a branch node, use `impl_cast_methods_for_branch!()` instead.
|
||||||
|
///
|
||||||
|
/// Users should make sure that the struct has a `weak_self: Weak<Self>` field.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! impl_cast_methods_for_node {
|
||||||
|
() => {
|
||||||
|
fn as_any(&self) -> &dyn core::any::Any {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cast_to_node(&self) -> Option<Arc<dyn SysNode>> {
|
||||||
|
self.weak_self.upgrade().map(|arc| arc as Arc<dyn SysNode>)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn type_(&self) -> SysNodeType {
|
||||||
|
SysNodeType::Leaf
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A macro to automatically generate cast-related methods and `type_` method for `SysObj`
|
||||||
|
/// trait implementation of `SysSymlink` struct.
|
||||||
|
///
|
||||||
|
/// Users should make sure that the struct has a `weak_self: Weak<Self>` field.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! impl_cast_methods_for_symlink {
|
||||||
|
() => {
|
||||||
|
fn as_any(&self) -> &dyn core::any::Any {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cast_to_symlink(&self) -> Option<Arc<dyn SysSymlink>> {
|
||||||
|
self.weak_self
|
||||||
|
.upgrade()
|
||||||
|
.map(|arc| arc as Arc<dyn SysSymlink>)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn type_(&self) -> SysNodeType {
|
||||||
|
SysNodeType::Symlink
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user