pub trait AsISize {
fn as_isize(&self) -> isize;
}
impl<T : AsISize + ?Sized> AsISize for Box<T> {
fn as_isize(&self) -> isize {
(**self).as_isize()
}
}
impl<T : AsISize + ?Sized> AsISize for std::rc::Rc<T> {
fn as_isize(&self) -> isize {
(**self).as_isize()
}
}
#[cfg(feature = "implement-AsISize-for-built_ins")]
mod impl_for_built_ins {
#![allow(non_snake_case)]
impl super::AsISize for isize {
fn as_isize(&self) -> isize {
*self
}
}
}
#[cfg(test)]
mod tests {
#![allow(non_snake_case)]
use super::AsISize;
use std::rc as std_rc;
mod TEST_CUSTOM_TYPE {
#![allow(non_snake_case)]
use super::*;
struct CustomType {
value : u64,
}
impl AsISize for CustomType {
fn as_isize(&self) -> isize {
self.value as isize
}
}
#[test]
fn TEST_RANGE_OF_VALUES() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
u32::MAX as isize,
];
for &value in VALUES {
let expected = value;
let instance = CustomType { value: value as u64 };
let actual = instance.as_isize();
assert_eq!(expected, actual);
}
}
#[test]
fn TEST_RANGE_OF_VALUES_IN_Box() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
u32::MAX as isize,
];
for &value in VALUES {
let expected = value;
let instance = Box::new(CustomType { value: value as u64 });
let actual = instance.as_isize();
assert_eq!(expected, actual);
}
}
}
#[cfg(feature = "implement-AsISize-for-built_ins")]
mod TEST_BUILTIN_TYPES {
#![allow(non_snake_case)]
use super::*;
#[test]
fn TEST_RANGE_OF_VALUES() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
isize::MAX,
];
for &value in VALUES {
let expected = value;
let actual = value.as_isize();
assert_eq!(expected, actual);
}
}
#[test]
fn TEST_RANGE_OF_VALUES_REF() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
isize::MAX,
];
for &value in VALUES {
let expected = value;
let actual = (&value).as_isize();
assert_eq!(expected, actual);
}
}
#[test]
fn TEST_RANGE_OF_VALUES_IN_Box() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
isize::MAX,
];
for &value in VALUES {
let expected = value;
let instance = Box::new(value);
let actual = instance.as_isize();
assert_eq!(expected, actual);
}
}
#[test]
fn TEST_RANGE_OF_VALUES_IN_REF_Box() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
isize::MAX,
];
for &value in VALUES {
let expected = value;
let instance = Box::new(value);
let actual = (&instance).as_isize();
assert_eq!(expected, actual);
}
}
#[test]
fn TEST_RANGE_OF_VALUES_IN_Rc() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
isize::MAX,
];
for &value in VALUES {
let expected = value;
let instance = std_rc::Rc::new(value);
let actual = instance.as_isize();
assert_eq!(expected, actual);
}
}
#[test]
fn TEST_RANGE_OF_VALUES_IN_REF_Rc() {
const VALUES : &[isize] = &[
0,
1,
2,
4,
8,
16,
32,
64,
128,
256,
isize::MAX,
];
for &value in VALUES {
let expected = value;
let instance = std_rc::Rc::new(value);
let actual = (&instance).as_isize();
assert_eq!(expected, actual);
}
}
}
}