use std::marker::PhantomData;
use std::mem;
use dupe::Dupe;
#[derive(Copy, Clone, Dupe)]
pub(crate) struct AlignedPaddedStr<'a> {
len: usize,
data: *const usize,
_marker: PhantomData<&'a str>,
}
impl<'a> AlignedPaddedStr<'a> {
#[inline]
pub(crate) unsafe fn new(len: usize, data: *const usize) -> AlignedPaddedStr<'a> {
AlignedPaddedStr {
len,
data,
_marker: PhantomData,
}
}
#[inline]
fn len_words(self) -> usize {
(self.len + mem::size_of::<usize>() - 1) / mem::size_of::<usize>()
}
}
impl<'a> PartialEq for AlignedPaddedStr<'a> {
#[inline]
fn eq(&self, other: &Self) -> bool {
if self.len != other.len {
return false;
}
let len_words = self.len_words();
for i in 0..len_words {
if unsafe { *self.data.add(i) != *other.data.add(i) } {
return false;
}
}
true
}
}