#![no_std]
use core::{cmp, ops};
#[cfg(test)]
#[macro_use]
extern crate std;
mod lde;
mod opcode;
pub use self::opcode::OpCode;
mod builder;
pub use self::builder::OcBuilder;
mod iter;
pub use self::iter::Iter;
mod iter_mut;
pub use self::iter_mut::IterMut;
pub unsafe trait Int: Copy + 'static {}
unsafe impl Int for u8 {}
unsafe impl Int for u16 {}
unsafe impl Int for u32 {}
unsafe impl Int for u64 {}
unsafe impl Int for i8 {}
unsafe impl Int for i16 {}
unsafe impl Int for i32 {}
unsafe impl Int for i64 {}
pub trait Va: Copy + Ord + ops::Add<Output = Self> + ops::AddAssign {}
impl Va for u32 {}
impl Va for u64 {}
pub trait Isa: Sized {
type Va: Va;
fn ld(bytes: &[u8]) -> u32;
fn peek(bytes: &[u8]) -> Option<&OpCode> {
let len = cmp::min(Self::ld(bytes) as usize, bytes.len());
if len > 0 { Some((&bytes[..len]).into()) }
else { None }
}
fn peek_mut(bytes: &mut [u8]) -> Option<&mut OpCode> {
let len = cmp::min(Self::ld(bytes) as usize, bytes.len());
if len > 0 { Some((&mut bytes[..len]).into()) }
else { None }
}
fn iter<'a>(bytes: &'a [u8], va: Self::Va) -> Iter<'a, Self> {
Iter { bytes, va }
}
fn iter_mut<'a>(bytes: &'a mut [u8], va: Self::Va) -> IterMut<'a, Self> {
IterMut { bytes, va }
}
#[doc(hidden)]
fn as_va(len: usize) -> Self::Va;
}
pub struct X86;
impl Isa for X86 {
type Va = u32;
fn ld(bytes: &[u8]) -> u32 {
lde::x86::lde_int(bytes)
}
#[doc(hidden)]
fn as_va(len: usize) -> u32 {
len as u32
}
}
impl X86 {
pub fn ld(self, bytes: &[u8]) -> u32 {
<X86 as Isa>::ld(bytes)
}
pub fn peek(self, bytes: &[u8]) -> Option<&OpCode> {
<X86 as Isa>::peek(bytes)
}
pub fn peek_mut(self, bytes: &mut [u8]) -> Option<&mut OpCode> {
<X86 as Isa>::peek_mut(bytes)
}
pub fn iter<'a>(self, bytes: &'a [u8], va: u32) -> Iter<'a, X86> {
<X86 as Isa>::iter(bytes, va)
}
pub fn iter_mut<'a>(self, bytes: &'a mut [u8], va: u32) -> IterMut<'a, X86> {
<X86 as Isa>::iter_mut(bytes, va)
}
}
pub struct X64;
impl Isa for X64 {
type Va = u64;
fn ld(bytes: &[u8]) -> u32 {
lde::x64::lde_int(bytes)
}
#[doc(hidden)]
fn as_va(len: usize) -> u64 {
len as u64
}
}
impl X64 {
pub fn ld(self, bytes: &[u8]) -> u32 {
<X64 as Isa>::ld(bytes)
}
pub fn peek(self, bytes: &[u8]) -> Option<&OpCode> {
<X64 as Isa>::peek(bytes)
}
pub fn peek_mut(self, bytes: &mut [u8]) -> Option<&mut OpCode> {
<X64 as Isa>::peek_mut(bytes)
}
pub fn iter<'a>(self, bytes: &'a [u8], va: u64) -> Iter<'a, X64> {
<X64 as Isa>::iter(bytes, va)
}
pub fn iter_mut<'a>(self, bytes: &'a mut [u8], va: u64) -> IterMut<'a, X64> {
<X64 as Isa>::iter_mut(bytes, va)
}
}