Merge pull request #26 from Amanieu/int_trait
Add traits for integer operations
This commit is contained in:
commit
c4142ed777
63
src/lib.rs
63
src/lib.rs
|
@ -9,21 +9,76 @@
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
extern crate core;
|
extern crate core;
|
||||||
|
|
||||||
use core::mem;
|
|
||||||
|
|
||||||
#[cfg(target_arch = "arm")]
|
#[cfg(target_arch = "arm")]
|
||||||
pub mod arm;
|
pub mod arm;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test;
|
mod test;
|
||||||
|
|
||||||
const CHAR_BITS: usize = 8;
|
/// Trait for some basic operations on integers
|
||||||
|
trait Int {
|
||||||
|
fn bits() -> usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Once i128/u128 support lands, we'll want to add impls for those as well
|
||||||
|
impl Int for u32 {
|
||||||
|
fn bits() -> usize { 32 }
|
||||||
|
}
|
||||||
|
impl Int for i32 {
|
||||||
|
fn bits() -> usize { 32 }
|
||||||
|
}
|
||||||
|
impl Int for u64 {
|
||||||
|
fn bits() -> usize { 64 }
|
||||||
|
}
|
||||||
|
impl Int for i64 {
|
||||||
|
fn bits() -> usize { 64 }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Trait to convert an integer to/from smaller parts
|
||||||
|
trait LargeInt {
|
||||||
|
type LowHalf;
|
||||||
|
type HighHalf;
|
||||||
|
|
||||||
|
fn low(self) -> Self::LowHalf;
|
||||||
|
fn high(self) -> Self::HighHalf;
|
||||||
|
fn from_parts(low: Self::LowHalf, high: Self::HighHalf) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Once i128/u128 support lands, we'll want to add impls for those as well
|
||||||
|
impl LargeInt for u64 {
|
||||||
|
type LowHalf = u32;
|
||||||
|
type HighHalf = u32;
|
||||||
|
|
||||||
|
fn low(self) -> u32 {
|
||||||
|
self as u32
|
||||||
|
}
|
||||||
|
fn high(self) -> u32 {
|
||||||
|
(self >> 32) as u32
|
||||||
|
}
|
||||||
|
fn from_parts(low: u32, high: u32) -> u64 {
|
||||||
|
low as u64 | ((high as u64) << 32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl LargeInt for i64 {
|
||||||
|
type LowHalf = u32;
|
||||||
|
type HighHalf = i32;
|
||||||
|
|
||||||
|
fn low(self) -> u32 {
|
||||||
|
self as u32
|
||||||
|
}
|
||||||
|
fn high(self) -> i32 {
|
||||||
|
(self >> 32) as i32
|
||||||
|
}
|
||||||
|
fn from_parts(low: u32, high: i32) -> i64 {
|
||||||
|
low as i64 | ((high as i64) << 32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! absv_i2 {
|
macro_rules! absv_i2 {
|
||||||
($intrinsic:ident : $ty:ty) => {
|
($intrinsic:ident : $ty:ty) => {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn $intrinsic(x: $ty) -> $ty {
|
pub extern "C" fn $intrinsic(x: $ty) -> $ty {
|
||||||
let n = mem::size_of::<$ty>() * CHAR_BITS;
|
let n = <$ty>::bits();
|
||||||
if x == 1 << (n - 1) {
|
if x == 1 << (n - 1) {
|
||||||
panic!();
|
panic!();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue