1use core::ops::{
4 BitAnd,
5 BitAndAssign,
6 BitOr,
7 BitOrAssign,
8 BitXor,
9 BitXorAssign,
10 Deref,
11 DerefMut,
12 Index,
13 IndexMut,
14 Not,
15};
16
17use super::BitArray;
18use crate::{
19 order::BitOrder,
20 slice::BitSlice,
21 store::BitStore,
22 view::BitViewSized,
23};
24
25#[cfg(not(tarpaulin_include))]
26impl<A, O> BitAndAssign<BitArray<A, O>> for BitSlice<A::Store, O>
27where
28 A: BitViewSized,
29 O: BitOrder,
30{
31 #[inline]
32 fn bitand_assign(&mut self, rhs: BitArray<A, O>) {
33 *self &= rhs.as_bitslice()
34 }
35}
36
37#[cfg(not(tarpaulin_include))]
38impl<A, O> BitAndAssign<&BitArray<A, O>> for BitSlice<A::Store, O>
39where
40 A: BitViewSized,
41 O: BitOrder,
42{
43 #[inline]
44 fn bitand_assign(&mut self, rhs: &BitArray<A, O>) {
45 *self &= rhs.as_bitslice()
46 }
47}
48
49impl<A, O, Rhs> BitAnd<Rhs> for BitArray<A, O>
50where
51 A: BitViewSized,
52 O: BitOrder,
53 BitSlice<A::Store, O>: BitAndAssign<Rhs>,
54{
55 type Output = Self;
56
57 #[inline]
58 fn bitand(mut self, rhs: Rhs) -> Self::Output {
59 self &= rhs;
60 self
61 }
62}
63
64impl<A, O, Rhs> BitAndAssign<Rhs> for BitArray<A, O>
65where
66 A: BitViewSized,
67 O: BitOrder,
68 BitSlice<A::Store, O>: BitAndAssign<Rhs>,
69{
70 #[inline]
71 fn bitand_assign(&mut self, rhs: Rhs) {
72 *self.as_mut_bitslice() &= rhs;
73 }
74}
75
76#[cfg(not(tarpaulin_include))]
77impl<A, O> BitOrAssign<BitArray<A, O>> for BitSlice<A::Store, O>
78where
79 A: BitViewSized,
80 O: BitOrder,
81{
82 #[inline]
83 fn bitor_assign(&mut self, rhs: BitArray<A, O>) {
84 *self |= rhs.as_bitslice()
85 }
86}
87
88#[cfg(not(tarpaulin_include))]
89impl<A, O> BitOrAssign<&BitArray<A, O>> for BitSlice<A::Store, O>
90where
91 A: BitViewSized,
92 O: BitOrder,
93{
94 #[inline]
95 fn bitor_assign(&mut self, rhs: &BitArray<A, O>) {
96 *self |= rhs.as_bitslice()
97 }
98}
99
100impl<A, O, Rhs> BitOr<Rhs> for BitArray<A, O>
101where
102 A: BitViewSized,
103 O: BitOrder,
104 BitSlice<A::Store, O>: BitOrAssign<Rhs>,
105{
106 type Output = Self;
107
108 #[inline]
109 fn bitor(mut self, rhs: Rhs) -> Self::Output {
110 self |= rhs;
111 self
112 }
113}
114
115impl<A, O, Rhs> BitOrAssign<Rhs> for BitArray<A, O>
116where
117 A: BitViewSized,
118 O: BitOrder,
119 BitSlice<A::Store, O>: BitOrAssign<Rhs>,
120{
121 #[inline]
122 fn bitor_assign(&mut self, rhs: Rhs) {
123 *self.as_mut_bitslice() |= rhs;
124 }
125}
126
127#[cfg(not(tarpaulin_include))]
128impl<A, O> BitXorAssign<BitArray<A, O>> for BitSlice<A::Store, O>
129where
130 A: BitViewSized,
131 O: BitOrder,
132{
133 #[inline]
134 fn bitxor_assign(&mut self, rhs: BitArray<A, O>) {
135 *self ^= rhs.as_bitslice()
136 }
137}
138
139#[cfg(not(tarpaulin_include))]
140impl<A, O> BitXorAssign<&BitArray<A, O>> for BitSlice<A::Store, O>
141where
142 A: BitViewSized,
143 O: BitOrder,
144{
145 #[inline]
146 fn bitxor_assign(&mut self, rhs: &BitArray<A, O>) {
147 *self ^= rhs.as_bitslice()
148 }
149}
150
151impl<A, O, Rhs> BitXor<Rhs> for BitArray<A, O>
152where
153 A: BitViewSized,
154 O: BitOrder,
155 BitSlice<A::Store, O>: BitXorAssign<Rhs>,
156{
157 type Output = Self;
158
159 #[inline]
160 fn bitxor(mut self, rhs: Rhs) -> Self::Output {
161 self ^= rhs;
162 self
163 }
164}
165
166impl<A, O, Rhs> BitXorAssign<Rhs> for BitArray<A, O>
167where
168 A: BitViewSized,
169 O: BitOrder,
170 BitSlice<A::Store, O>: BitXorAssign<Rhs>,
171{
172 #[inline]
173 fn bitxor_assign(&mut self, rhs: Rhs) {
174 *self.as_mut_bitslice() ^= rhs;
175 }
176}
177
178impl<A, O> Deref for BitArray<A, O>
179where
180 A: BitViewSized,
181 O: BitOrder,
182{
183 type Target = BitSlice<A::Store, O>;
184
185 #[inline]
186 fn deref(&self) -> &Self::Target {
187 self.as_bitslice()
188 }
189}
190
191impl<A, O> DerefMut for BitArray<A, O>
192where
193 A: BitViewSized,
194 O: BitOrder,
195{
196 #[inline]
197 fn deref_mut(&mut self) -> &mut Self::Target {
198 self.as_mut_bitslice()
199 }
200}
201
202impl<A, O, Idx> Index<Idx> for BitArray<A, O>
203where
204 A: BitViewSized,
205 O: BitOrder,
206 BitSlice<A::Store, O>: Index<Idx>,
207{
208 type Output = <BitSlice<A::Store, O> as Index<Idx>>::Output;
209
210 #[inline]
211 fn index(&self, index: Idx) -> &Self::Output {
212 &self.as_bitslice()[index]
213 }
214}
215
216impl<A, O, Idx> IndexMut<Idx> for BitArray<A, O>
217where
218 A: BitViewSized,
219 O: BitOrder,
220 BitSlice<A::Store, O>: IndexMut<Idx>,
221{
222 #[inline]
223 fn index_mut(&mut self, index: Idx) -> &mut Self::Output {
224 &mut self.as_mut_bitslice()[index]
225 }
226}
227
228impl<A, O> Not for BitArray<A, O>
229where
230 A: BitViewSized,
231 O: BitOrder,
232{
233 type Output = Self;
234
235 #[inline]
236 fn not(mut self) -> Self::Output {
237 for elem in self.as_raw_mut_slice() {
238 elem.store_value(!elem.load_value());
239 }
240 self
241 }
242}