X-Git-Url: https://i11git.iti.kit.edu/anon-gitweb/?p=Mitarbeiter%2FTim-Zeitz%2Fstud-rust-base.git;a=blobdiff_plain;f=src%2Fio.rs;fp=src%2Fio.rs;h=419fa4520eb67ed5cbf3337bd1824586cc769257;hp=489d9e086280f270e98a8e01e7fbb86ca6a88fa4;hb=b52fc015957bcfa65d2e8fbb8d4ea44f4923e3a8;hpb=56149781fe0423d57676003b7c42698d295bb279 diff --git a/src/io.rs b/src/io.rs index 489d9e0..419fa45 100644 --- a/src/io.rs +++ b/src/io.rs @@ -1,3 +1,20 @@ +//! This module contains a few traits and blanket implementations +//! for (de)serializing and writing/reading numeric data to/from the disc. +//! To use it you should import the `Load` and `Store` traits and use the +//! `load_from` and `write_to` methods. +//! +//! # Example +//! +//! ``` +//! use stud_rust_base::io::*; +//! +//! fn test() { +//! let head = Vec::::load_from("head_file_name").expect("could not read head"); +//! let lat = Vec::::load_from("node_latitude_file_name").expect("could not read lat"); +//! head.write_to("output_file").expect("could not write head"); +//! } +//! ``` + use std::fs; use std::fs::File; use std::io::prelude::*; @@ -5,11 +22,23 @@ use std::io::Result; use std::mem; use std::slice; +/// A trait which allows accessing the data of an object as a slice of bytes. +/// The bytes should represent a serialization of the object and allow +/// recreating it when reading these bytes again from the disk. +/// +/// Do not use this Trait but rather the `Store` trait. pub trait DataBytes { + /// Should return the serialized object as a slice of bytes fn data_bytes(&self) -> &[u8]; } +/// A trait which mutably exposes the internal data of an object so that +/// a serialized object can be loaded from disk and written back into a precreated +/// object of the right size. +/// +/// Do not use this Trait but rather the `Load` trait. pub trait DataBytesMut { + /// Should return a mutable slice of the internal data of the object fn data_bytes_mut(&mut self) -> &mut [u8]; } @@ -34,7 +63,9 @@ impl DataBytesMut for Vec { } } +/// A trait which extends the `DataBytes` trait and exposes a method to write objects to disk. pub trait Store : DataBytes { + /// Writes the serialized object to the file with the given filename fn write_to(&self, filename: &str) -> Result<()> { File::create(filename)?.write_all(self.data_bytes()) } @@ -43,9 +74,14 @@ pub trait Store : DataBytes { impl Store for T {} impl Store for [T] where [T]: DataBytes {} +/// A trait to load serialized data back into objects. pub trait Load : DataBytesMut + Sized { + /// This method must create an object of the correct size for serialized data with the given number of bytes. + /// It should not be necessary to call this method directly. fn new_with_bytes(num_bytes: usize) -> Self; + /// This method will load serialized data from the disk, create an object of the appropriate size, + /// deserialize the bytes into the object and return the object. fn load_from(filename: &str) -> Result { let metadata = fs::metadata(filename)?; let mut file = File::open(filename)?;