ruff/crates/ruff_index/src/idx.rs
2023-05-23 17:40:35 +02:00

60 lines
1.5 KiB
Rust

use std::hash::Hash;
/// Represents a newtype wrapper used to index into a Vec or a slice.
///
/// You can use the [`newtype_index`](crate::newtype_index) macro to define your own index.
pub trait Idx: Copy + PartialEq + Eq + Hash + std::fmt::Debug + 'static {
fn new(value: usize) -> Self;
fn index(self) -> usize;
}
#[cfg(test)]
mod tests {
use crate::newtype_index;
use static_assertions::{assert_eq_size, assert_impl_all};
// Allows the macro invocation below to work
use crate as ruff_index;
#[newtype_index]
#[derive(PartialOrd, Ord)]
struct MyIndex;
assert_impl_all!(MyIndex: Ord, PartialOrd);
assert_eq_size!(MyIndex, Option<MyIndex>);
#[test]
#[should_panic(expected = "assertion failed: value <= Self::MAX")]
fn from_u32_panics_for_u32_max() {
MyIndex::from_u32(u32::MAX);
}
#[test]
#[should_panic(expected = "assertion failed: value <= Self::MAX")]
fn from_usize_panics_for_u32_max() {
MyIndex::from_usize(u32::MAX as usize);
}
#[test]
fn max_value() {
let max_value = MyIndex::from_u32(u32::MAX - 1);
assert_eq!(max_value.as_u32(), u32::MAX - 1);
}
#[test]
fn max_value_usize() {
let max_value = MyIndex::from_usize((u32::MAX - 1) as usize);
assert_eq!(max_value.as_u32(), u32::MAX - 1);
}
#[test]
fn debug() {
let output = format!("{:?}", MyIndex::from(10u32));
assert_eq!(output, "MyIndex(10)");
}
}