alt-std 0.2.9

Alternative Lightweight Std library for making small executables and shared objects
Documentation
use crate::vec::*;
use ::core::*;
use ::core::cmp::*;
use crate::hash::*;

#[repr(C)]
pub struct String {
    data    : Vec<u8>
}

impl String {
    pub fn withCapacity(c: usize) -> Self {
        Self { data: Vec::withCapacity(c) }
    }

    pub fn new() -> Self { Self { data: Vec::new() } }
    pub fn from(s: &str) -> Self {
        let mut st = Self::new();
        for c in s.bytes() {
            st.data.pushBack(c);
        }
        st
    }

    pub fn toStr(&self) -> &str {
        ::core::str::from_utf8(self.data.asArray()).expect("Error getting string out")
    }

    pub fn add(&mut self, u: u8) {
        self.data.pushBack(u);
    }

    pub fn asArray(&self) -> &[u8] { self.data.asArray() }
    pub fn asMutArray(&mut self) -> &mut [u8] { self.data.asMutArray() }
}

pub trait Append<T> {
    fn append(&mut self, other: T);
}

impl Append<&str> for String {
    fn append(&mut self, s: &str) {
        for c in s.bytes() {
            self.data.pushBack(c);
        }
    }
}

impl Append<&String> for String {
    fn append(&mut self, s: &String) {
        for c in s.toStr().bytes() {
            self.data.pushBack(c);
        }
    }
}

impl PartialEq<String> for String {
    fn eq(&self, other: &Self) -> bool {
        let ls = self.data.len();
        let lo = other.data.len();
        if ls != lo { return false }
        for i in 0..self.data.len() {
            if self.data[i] != other.data[i] { return false }
        }
        true
    }
}

impl Eq for String {}

impl PartialEq<&str> for String {
    fn eq(&self, other: &&str) -> bool {
        let ob = (*other).as_bytes();
        let ls = self.data.len();
        let lo = ob.len();
        if ls != lo { return false }
        for i in 0..self.data.len() {
            if self.data[i] != ob[i] { return false }
        }
        true
    }
}

impl Clone for String {
    fn clone(&self) -> Self {
        String::from(self.toStr())
    }
}

impl fmt::Write for String {
    #[inline]
    fn write_str(&mut self, s: &str) -> fmt::Result {
        self.append(s);
        Ok(())
    }

    #[inline]
    fn write_char(&mut self, c: char) -> fmt::Result {
        self.add(c as u8);
        Ok(())
    }
}

impl fmt::Display for String {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.toStr())
    }
}

impl Hash for String {
    fn hash(&self) -> usize {
        self.asArray().hash()
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::io::*;
    #[test]
    fn testConversion() {
        {
            let u : u32 = 12345;
            if String::from("12345") != format(format_args!("{}", u)) {
                panic!("fail {}", u);
            }
        }

        {
            let i : i32 = -12345;
            if String::from("-12345") != format(format_args!("{}", i)) {
                panic!("fail {}", i);
            }
        }
    }
}