use super::{MrSlice, Slicing};
use crate::bindings::*;
#[derive(Clone, Copy, Debug, serde::Serialize, serde::Deserialize)]
pub struct MrRemote {
pub addr: u64,
pub len: usize,
pub rkey: u32,
}
impl MrRemote {
pub fn new(addr: u64, len: usize, rkey: u32) -> Self {
Self { addr, len, rkey }
}
pub fn dummy() -> Self {
Self::new(0, 0, 0)
}
#[inline]
pub fn at(&self, offset: usize) -> u64 {
self.addr + offset as u64
}
#[inline]
pub(crate) fn as_rdma_t(&self) -> rdma_t {
rdma_t {
remote_addr: self.addr,
rkey: self.rkey,
}
}
}
impl Default for MrRemote {
fn default() -> Self {
Self::dummy()
}
}
unsafe impl<'s> Slicing<'s> for MrRemote {
type Output = Self;
#[inline]
fn addr(&'s self) -> *mut u8 {
self.addr as _
}
#[inline]
fn len(&'s self) -> usize {
self.len
}
#[inline]
unsafe fn slice_unchecked(&'s self, offset: usize, len: usize) -> Self::Output {
Self::new(self.addr + offset as u64, len, self.rkey)
}
}
impl From<MrSlice<'_>> for MrRemote {
fn from(slice: MrSlice<'_>) -> Self {
Self {
addr: slice.addr() as u64,
len: slice.len(),
rkey: slice.mr().rkey(),
}
}
}
impl From<&'_ MrRemote> for rdma_t {
#[inline]
fn from(remote: &'_ MrRemote) -> Self {
remote.as_rdma_t()
}
}