mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-27 11:23:25 +00:00
86 lines
1.9 KiB
Rust
86 lines
1.9 KiB
Rust
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
#[macro_export]
|
|
macro_rules! impl_socket_options {
|
|
($(
|
|
$(#[$outer:meta])*
|
|
pub struct $name: ident ( $value_ty:ty );
|
|
)*) => {
|
|
$(
|
|
$(#[$outer])*
|
|
#[derive(Debug)]
|
|
pub struct $name (Option<$value_ty>);
|
|
|
|
impl $name {
|
|
pub fn new() -> Self {
|
|
Self (None)
|
|
}
|
|
|
|
pub fn get(&self) -> Option<&$value_ty> {
|
|
self.0.as_ref()
|
|
}
|
|
|
|
pub fn set(&mut self, value: $value_ty) {
|
|
self.0 = Some(value);
|
|
}
|
|
}
|
|
|
|
impl $crate::net::socket::SocketOption for $name {
|
|
fn as_any(&self) -> &dyn core::any::Any {
|
|
self
|
|
}
|
|
|
|
fn as_any_mut(&mut self) -> &mut dyn core::any::Any {
|
|
self
|
|
}
|
|
}
|
|
|
|
impl Default for $name {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! match_sock_option_ref {
|
|
(
|
|
$option:expr, {
|
|
$( $bind: ident : $ty:ty => $arm:expr ),*,
|
|
_ => $default:expr
|
|
}
|
|
) => {{
|
|
let __option : &dyn SocketOption = $option;
|
|
$(
|
|
if let Some($bind) = __option.as_any().downcast_ref::<$ty>() {
|
|
$arm
|
|
} else
|
|
)*
|
|
{
|
|
$default
|
|
}
|
|
}};
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! match_sock_option_mut {
|
|
(
|
|
$option:expr, {
|
|
$( $bind: ident : $ty:ty => $arm:expr ),*,
|
|
_ => $default:expr
|
|
}
|
|
) => {{
|
|
let __option : &mut dyn SocketOption = $option;
|
|
$(
|
|
if let Some($bind) = __option.as_any_mut().downcast_mut::<$ty>() {
|
|
$arm
|
|
} else
|
|
)*
|
|
{
|
|
$default
|
|
}
|
|
}};
|
|
}
|