use crate::memory::MainMem;
#[derive(Clone, Copy)]
pub struct Message<'a, 'b, R: MainMem = NoMem> {
pub(crate) fmt: &'a [u8],
pub(crate) args: Option<&'b [Argument<R>]>,
}
impl<'a, 'b, R: MainMem> core::fmt::Debug for Message<'a, 'b, R> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::result::Result<(), core::fmt::Error> {
use core::fmt::Write;
write!(f, "Message {{ fmt: b\"")?;
for c in self.fmt.iter() {
for c in core::ascii::escape_default(*c) {
let c = c as char;
f.write_char(c)?;
}
}
write!(f, "\", args: {:?} }}", self.args)
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum Argument<R: MainMem> {
Int(i32),
UInt(u32),
Char(char),
String(crate::memory::Ptr<R>),
}
impl<'a, 'b, R: MainMem> Message<'a, 'b, R> {
#[inline]
pub fn new(fmt: &'a [u8], args: &'b [Argument<R>]) -> Self {
Self {
fmt: fmt,
args: Some(args),
}
}
#[inline]
pub fn new_literal(lit: &'a [u8]) -> Self {
Self {
fmt: lit,
args: None,
}
}
pub fn needs_format(&self) -> bool {
if let Some(_) = self.args {
true
} else {
false
}
}
}
#[doc(hidden)]
#[derive(Debug, Clone, Copy)]
pub struct NoModel;
impl crate::models::Model for NoModel {
type MainMem = NoMem;
type DisplayListMem = NoMem;
type RegisterMem = NoMem;
type CommandMem = NoMem;
}
#[doc(hidden)]
#[derive(Debug, Clone, Copy)]
pub enum NoMem {}
impl crate::memory::MemoryRegion for NoMem {
type Model = NoModel;
const BASE_ADDR: u32 = 0;
const LENGTH: u32 = 0;
const DEBUG_NAME: &'static str = "NoMem";
}
impl crate::memory::HostAccessible for NoMem {}
impl crate::memory::MainMem for NoMem {}
impl crate::memory::DisplayListMem for NoMem {}
impl crate::memory::RegisterMem for NoMem {}
impl crate::memory::CommandMem for NoMem {}
#[cfg(test)]
mod tests {
extern crate std;
use super::*;
#[test]
fn test_instantiate_directly_no_args() {
let _got: Message = Message::new(b"hi", &[]);
}
#[test]
fn test_instantiate_directly_with_arg() {
let _got: Message = Message::new(b"%d", &[Argument::Int(3)]);
}
}