bitvec/slice/
specialization.rs1#![doc = include_str!("../../doc/slice/specialization.md")]
2
3use funty::Integral;
4
5use super::BitSlice;
6use crate::{
7 devel as dvl,
8 mem,
9 order::BitOrder,
10 store::BitStore,
11};
12
13mod lsb0;
14mod msb0;
15
16const WORD_BITS: usize = mem::bits_of::<usize>();
18
19fn has_zero<T>(val: T, mask: T) -> bool
21where T: Integral {
22 val | !mask != !T::ZERO
23}
24
25fn has_one<T>(val: T, mask: T) -> bool
27where T: Integral {
28 val & mask != T::ZERO
29}
30
31impl<T, O> BitSlice<T, O>
32where
33 T: BitStore,
34 O: BitOrder,
35{
36 #[inline]
42 fn as_accessor(&mut self) -> &BitSlice<T::Access, O> {
43 unsafe { &*(self as *const Self as *const BitSlice<T::Access, O>) }
44 }
45
46 pub(crate) fn coerce<T2, O2>(&self) -> Option<&BitSlice<T2, O2>>
54 where
55 T2: BitStore,
56 O2: BitOrder,
57 {
58 if dvl::match_types::<T, O, T2, O2>() {
59 Some(unsafe { &*(self as *const Self as *const BitSlice<T2, O2>) })
60 }
61 else {
62 None
63 }
64 }
65
66 pub(crate) fn coerce_mut<T2, O2>(&mut self) -> Option<&mut BitSlice<T2, O2>>
70 where
71 T2: BitStore,
72 O2: BitOrder,
73 {
74 if dvl::match_types::<T, O, T2, O2>() {
75 Some(unsafe { &mut *(self as *mut Self as *mut BitSlice<T2, O2>) })
76 }
77 else {
78 None
79 }
80 }
81}