use std::{hash::Hash, num::NonZeroUsize};
#[derive(Clone, Copy, Eq, PartialEq, Hash)]
#[repr(transparent)]
#[doc(hidden)]
#[allow(missing_debug_implementations)]
pub struct OffsetProvider<T>(T);
impl OffsetProvider<usize> {
#[inline]
#[must_use]
pub unsafe fn new(offset: usize) -> Self {
Self(offset)
}
#[inline]
#[must_use]
pub fn into_offset(self) -> usize {
self.0
}
}
impl OffsetProvider<NonZeroUsize> {
#[inline]
#[must_use]
pub unsafe fn new(offset: usize) -> Self {
let inner = offset.checked_add(1).expect("usize overflow");
Self(unsafe { NonZeroUsize::new_unchecked(inner) })
}
#[inline]
#[must_use]
pub fn into_offset(self) -> usize {
self.0.get() - 1
}
}
#[cfg(test)]
mod tests {
use std::{
fmt::{Debug, Display},
num::NonZeroUsize,
};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use static_assertions::assert_not_impl_any;
use crate::utils::offset_provider::OffsetProvider;
assert_not_impl_any!(OffsetProvider<usize>: Default, Debug, Display, PartialOrd);
assert_not_impl_any!(OffsetProvider<NonZeroUsize>: Default, Debug, Display, PartialOrd);
#[cfg(feature = "serde")]
assert_not_impl_any!(OffsetProvider<usize>: Serialize, Deserialize<'static>);
#[cfg(feature = "serde")]
assert_not_impl_any!(OffsetProvider<NonZeroUsize>: Serialize, Deserialize<'static>);
}