use std::convert::AsMut;
use std::fmt::{self, Display};
use std::num::NonZeroUsize;
use std::ops::{Deref, DerefMut};
use rosidl_runtime_rs::StringExceedsBoundsError;
use super::{DynamicSequenceElementMut, Proxy, ProxyMut, ProxySequence};
#[derive(Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct DynamicBoundedString<'msg> {
pub(super) inner: &'msg rosidl_runtime_rs::String,
pub(super) upper_bound: NonZeroUsize,
}
#[derive(Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct DynamicBoundedWString<'msg> {
pub(super) inner: &'msg rosidl_runtime_rs::WString,
pub(super) upper_bound: NonZeroUsize,
}
#[derive(Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct DynamicBoundedStringMut<'msg> {
pub(super) inner: &'msg mut rosidl_runtime_rs::String,
pub(super) upper_bound: NonZeroUsize,
}
#[derive(Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct DynamicBoundedWStringMut<'msg> {
pub(super) inner: &'msg mut rosidl_runtime_rs::WString,
pub(super) upper_bound: NonZeroUsize,
}
impl<'msg> Deref for DynamicBoundedString<'msg> {
type Target = rosidl_runtime_rs::String;
fn deref(&self) -> &Self::Target {
self.inner
}
}
impl<'msg> Display for DynamicBoundedString<'msg> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
self.inner.fmt(f)
}
}
unsafe impl<'msg> Proxy<'msg> for DynamicBoundedString<'msg> {
type Metadata = NonZeroUsize;
fn size_in_memory(_: NonZeroUsize) -> usize {
std::mem::size_of::<rosidl_runtime_rs::String>()
}
unsafe fn new(bytes: &'msg [u8], string_upper_bound: NonZeroUsize) -> Self {
let inner = &*(bytes.as_ptr() as *const rosidl_runtime_rs::String);
Self {
inner,
upper_bound: string_upper_bound,
}
}
}
impl<'msg> DynamicBoundedString<'msg> {
pub fn upper_bound(&self) -> NonZeroUsize {
self.upper_bound
}
}
impl<'msg> DynamicBoundedWString<'msg> {
pub fn upper_bound(&self) -> NonZeroUsize {
self.upper_bound
}
}
impl<'msg> Deref for DynamicBoundedWString<'msg> {
type Target = rosidl_runtime_rs::WString;
fn deref(&self) -> &Self::Target {
self.inner
}
}
impl<'msg> Display for DynamicBoundedWString<'msg> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
self.inner.fmt(f)
}
}
unsafe impl<'msg> Proxy<'msg> for DynamicBoundedWString<'msg> {
type Metadata = NonZeroUsize;
fn size_in_memory(_: NonZeroUsize) -> usize {
std::mem::size_of::<rosidl_runtime_rs::WString>()
}
unsafe fn new(bytes: &'msg [u8], string_upper_bound: NonZeroUsize) -> Self {
let inner = &*(bytes.as_ptr() as *const rosidl_runtime_rs::WString);
Self {
inner,
upper_bound: string_upper_bound,
}
}
}
impl<'msg> AsMut<[std::os::raw::c_char]> for DynamicBoundedStringMut<'msg> {
fn as_mut(&mut self) -> &mut [std::os::raw::c_char] {
self.inner.deref_mut()
}
}
impl<'msg> Deref for DynamicBoundedStringMut<'msg> {
type Target = rosidl_runtime_rs::String;
fn deref(&self) -> &Self::Target {
self.inner
}
}
impl<'msg> Display for DynamicBoundedStringMut<'msg> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
self.inner.fmt(f)
}
}
impl<'msg> DynamicSequenceElementMut<'msg> for DynamicBoundedStringMut<'msg> {
type InnerSequence = ProxySequence<'msg, Self>;
}
unsafe impl<'msg> ProxyMut<'msg> for DynamicBoundedStringMut<'msg> {
type Metadata = NonZeroUsize;
fn size_in_memory(_: NonZeroUsize) -> usize {
std::mem::size_of::<rosidl_runtime_rs::String>()
}
unsafe fn new(bytes: &'msg mut [u8], string_upper_bound: NonZeroUsize) -> Self {
let inner = &mut *(bytes.as_mut_ptr() as *mut rosidl_runtime_rs::String);
Self {
inner,
upper_bound: string_upper_bound,
}
}
}
impl<'msg> DynamicBoundedStringMut<'msg> {
pub fn upper_bound(&self) -> NonZeroUsize {
self.upper_bound
}
pub fn try_assign(&mut self, s: &str) -> Result<(), StringExceedsBoundsError> {
let length = s.chars().count();
if length <= self.upper_bound.into() {
*self.inner = rosidl_runtime_rs::String::from(s);
Ok(())
} else {
Err(StringExceedsBoundsError {
len: length,
upper_bound: self.upper_bound.into(),
})
}
}
}
impl<'msg> AsMut<[std::os::raw::c_ushort]> for DynamicBoundedWStringMut<'msg> {
fn as_mut(&mut self) -> &mut [std::os::raw::c_ushort] {
self.inner.deref_mut()
}
}
impl<'msg> Deref for DynamicBoundedWStringMut<'msg> {
type Target = rosidl_runtime_rs::WString;
fn deref(&self) -> &Self::Target {
self.inner
}
}
impl<'msg> Display for DynamicBoundedWStringMut<'msg> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
self.inner.fmt(f)
}
}
impl<'msg> DynamicSequenceElementMut<'msg> for DynamicBoundedWStringMut<'msg> {
type InnerSequence = ProxySequence<'msg, Self>;
}
unsafe impl<'msg> ProxyMut<'msg> for DynamicBoundedWStringMut<'msg> {
type Metadata = NonZeroUsize;
fn size_in_memory(_: NonZeroUsize) -> usize {
std::mem::size_of::<rosidl_runtime_rs::WString>()
}
unsafe fn new(bytes: &'msg mut [u8], string_upper_bound: NonZeroUsize) -> Self {
let inner = &mut *(bytes.as_mut_ptr() as *mut rosidl_runtime_rs::WString);
Self {
inner,
upper_bound: string_upper_bound,
}
}
}
impl<'msg> DynamicBoundedWStringMut<'msg> {
pub fn upper_bound(&self) -> NonZeroUsize {
self.upper_bound
}
pub fn try_assign(&mut self, s: &str) -> Result<(), StringExceedsBoundsError> {
let length = s.chars().count();
if length <= self.upper_bound.into() {
*self.inner = rosidl_runtime_rs::WString::from(s);
Ok(())
} else {
Err(StringExceedsBoundsError {
len: length,
upper_bound: self.upper_bound.into(),
})
}
}
}