dcpu 0.5.0

An assembler, debugger and emulator for the DCPU-16
Documentation
#[cfg(feature = "serde")]
use serde::de::{self, Deserialize, Deserializer, SeqVisitor, Visitor};
#[cfg(feature = "serde")]
use serde::ser::{Serialize, Serializer};

use emulator::device::lem1802::screen::*;

#[cfg(feature = "serde")]
impl Serialize for Vram {
    fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
        where S: Serializer {
        let mut state =
            try!(serializer.serialize_seq_fixed_size(386));
        for word in self.0.iter() {
            try!(serializer.serialize_seq_elt(&mut state, word));
        }
        serializer.serialize_seq_end(state)
    }
}

#[cfg(feature = "serde")]
impl Deserialize for Vram {
    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
        where D: Deserializer {
        struct VramVisitor;

        impl Visitor for VramVisitor {
            type Value = Vram;

            fn visit_seq<V>(&mut self,
                            mut visitor: V) -> Result<Vram, V::Error>
                where V: SeqVisitor
            {
                let mut vram = Vram([0; 386]);

                for i in 0..386 as usize {
                    vram.0[i] = match try!(visitor.visit()) {
                        Some(val) => val,
                        None => { return Err(de::Error::end_of_stream()); }
                    };
                }

                try!(visitor.end());

                Ok(vram)
            }
        }

        deserializer.deserialize_seq_fixed_size(386, VramVisitor)
    }
}

#[cfg(feature = "serde")]
impl Serialize for Font {
    fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
        where S: Serializer {
        let mut state =
            try!(serializer.serialize_seq_fixed_size(256));
        for word in self.0.iter() {
            try!(serializer.serialize_seq_elt(&mut state, word));
        }
        serializer.serialize_seq_end(state)
    }
}

#[cfg(feature = "serde")]
impl Deserialize for Font {
    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
        where D: Deserializer {
        struct FontVisitor;

        impl Visitor for FontVisitor {
            type Value = Font;

            fn visit_seq<V>(&mut self,
                            mut visitor: V) -> Result<Font, V::Error>
                where V: SeqVisitor
            {
                let mut font = Font([0; 256]);

                for i in 0..256 as usize {
                    font.0[i] = match try!(visitor.visit()) {
                        Some(val) => val,
                        None => { return Err(de::Error::end_of_stream()); }
                    };
                }

                try!(visitor.end());

                Ok(font)
            }
        }

        deserializer.deserialize_seq_fixed_size(256, FontVisitor)
    }
}

#[cfg(feature = "serde")]
impl Serialize for Screen {
    fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
        where S: Serializer {
        let mut state =
            try!(serializer.serialize_seq_fixed_size(SCREEN_SIZE as usize));
        for pixel in self.0.iter() {
            try!(serializer.serialize_seq_elt(&mut state, pixel));
        }
        serializer.serialize_seq_end(state)
    }
}

#[cfg(feature = "serde")]
impl Deserialize for Screen {
    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
        where D: Deserializer {
        struct ScreenVisitor;

        impl Visitor for ScreenVisitor {
            type Value = Screen;

            fn visit_seq<V>(&mut self,
                            mut visitor: V) -> Result<Screen, V::Error>
                where V: SeqVisitor
            {
                let mut screen = Screen([Color::default();
                                         SCREEN_SIZE as usize]);

                for i in 0..SCREEN_SIZE as usize {
                    screen.0[i] = match try!(visitor.visit()) {
                        Some(val) => val,
                        None => { return Err(de::Error::end_of_stream()); }
                    };
                }

                try!(visitor.end());

                Ok(screen)
            }
        }

        deserializer.deserialize_seq_fixed_size(SCREEN_SIZE as usize,
                                                ScreenVisitor)
    }
}