1use alloc::{borrow::Cow, boxed::Box, vec::Vec};
4use core::{
5 cell::{Ref, RefCell, RefMut},
6 fmt::Debug,
7 hash::{Hash, Hasher},
8 ops::{Deref, DerefMut},
9};
10
11use ahash::RandomState;
12use libafl_bolts::{AsIter, AsIterMut, AsSlice, AsSliceMut, HasLen, Named, ownedref::OwnedRef};
13use serde::{Deserialize, Serialize, de::DeserializeOwned};
14
15use crate::{
16 Error,
17 observers::{MapObserver, Observer, ObserverWithHashField},
18};
19
20#[derive(Serialize, Deserialize, Debug)]
25#[expect(clippy::unsafe_derive_deserialize)]
26pub struct ValueObserver<'a, T> {
27 name: Cow<'static, str>,
29 pub value: OwnedRef<'a, T>,
31}
32
33impl<'a, T> ValueObserver<'a, T> {
34 #[must_use]
36 pub fn new(name: &'static str, value: OwnedRef<'a, T>) -> Self {
37 Self {
38 name: Cow::from(name),
39 value,
40 }
41 }
42
43 #[must_use]
45 pub fn get_ref(&self) -> &T {
46 self.value.as_ref()
47 }
48
49 pub fn set(&mut self, new_value: T) {
51 self.value = OwnedRef::Owned(Box::new(new_value));
52 }
53
54 #[must_use]
56 pub fn take(self) -> T
57 where
58 T: Clone,
59 {
60 match self.value {
61 OwnedRef::RefRaw(r, _) => unsafe { (*r).clone() },
62 OwnedRef::Ref(r) => r.clone(),
63 OwnedRef::Owned(v) => *v,
64 }
65 }
66}
67
68impl<I, S, T> Observer<I, S> for ValueObserver<'_, T> {}
70
71impl<T> Named for ValueObserver<'_, T> {
72 fn name(&self) -> &Cow<'static, str> {
73 &self.name
74 }
75}
76
77impl<T: Hash> ObserverWithHashField for ValueObserver<'_, T> {
78 fn hash(&self) -> Option<u64> {
79 Some(RandomState::with_seeds(1, 2, 3, 4).hash_one(self.value.as_ref()))
80 }
81}
82
83#[derive(Serialize, Deserialize, Debug)]
85#[expect(clippy::unsafe_derive_deserialize)]
86pub struct RefCellValueObserver<'a, T> {
87 name: Cow<'static, str>,
89 pub value: OwnedRef<'a, RefCell<T>>,
91}
92
93impl<'a, T> RefCellValueObserver<'a, T> {
94 #[must_use]
96 pub fn new(name: &'static str, value: OwnedRef<'a, RefCell<T>>) -> Self {
97 Self {
98 name: Cow::from(name),
99 value,
100 }
101 }
102
103 #[must_use]
107 pub fn get_ref<'b>(&'b self) -> Ref<'a, T>
108 where
109 'b: 'a,
110 {
111 self.value.as_ref().borrow()
112 }
113
114 #[must_use]
118 pub fn get_ref_mut<'b>(&'b self) -> RefMut<'a, T>
119 where
120 'b: 'a,
121 {
122 self.value.as_ref().borrow_mut()
123 }
124
125 pub fn set(&mut self, new_value: T) {
127 self.value.as_ref().replace(new_value);
128 }
129
130 #[must_use]
132 pub fn take(self) -> T
133 where
134 T: Clone,
135 {
136 match self.value {
137 OwnedRef::RefRaw(r, _) => unsafe { (*r).borrow().deref().clone() },
138 OwnedRef::Ref(r) => r.borrow().deref().clone(),
139 OwnedRef::Owned(v) => v.borrow().clone(),
140 }
141 }
142}
143
144impl<I, S, T> Observer<I, S> for RefCellValueObserver<'_, T> {}
146
147impl<T> Named for RefCellValueObserver<'_, T> {
148 fn name(&self) -> &Cow<'static, str> {
149 &self.name
150 }
151}
152
153impl<T> ObserverWithHashField for RefCellValueObserver<'_, T>
154where
155 T: Hash,
156{
157 fn hash(&self) -> Option<u64> {
158 Some(RandomState::with_seeds(1, 2, 3, 4).hash_one(&*self.value.as_ref().borrow()))
159 }
160}
161
162#[derive(Debug)]
164pub struct RefCellValueObserverIter<'it, T> {
165 v: Ref<'it, [T]>,
166}
167
168impl<'it, T: 'it, A: Deref<Target = [T]>> AsSlice<'it> for RefCellValueObserver<'_, A> {
169 type Entry = T;
170 type SliceRef = Ref<'it, [T]>;
171
172 fn as_slice(&'it self) -> Self::SliceRef {
173 Ref::map(self.value.as_ref().borrow(), |s| &**s)
174 }
175}
176
177impl<'it, T: 'it, A: DerefMut<Target = [T]>> AsSliceMut<'it> for RefCellValueObserver<'_, A> {
178 type SliceRefMut = RefMut<'it, [T]>;
179
180 fn as_slice_mut(&'it mut self) -> Self::SliceRefMut {
181 RefMut::map(self.value.as_ref().borrow_mut(), |s| &mut **s)
182 }
183}
184
185impl<'it, T: 'it, A: Deref<Target = [T]>> AsIter<'it> for RefCellValueObserver<'_, A> {
186 type Item = T;
187 type Ref = Ref<'it, Self::Item>;
188 type IntoIter = RefCellValueObserverIter<'it, T>;
189
190 fn as_iter(&'it self) -> Self::IntoIter {
191 Self::IntoIter {
192 v: Ref::map(self.value.as_ref().borrow(), Deref::deref),
193 }
194 }
195}
196
197impl<'it, T: 'it> Iterator for RefCellValueObserverIter<'it, T> {
198 type Item = Ref<'it, T>;
199
200 fn next(&mut self) -> Option<Self::Item> {
201 if self.v.is_empty() {
202 return None;
203 }
204 let cloned = Ref::clone(&self.v);
205 let (next, remainder) = Ref::map_split(cloned, |v| (&v[0], &v[1..]));
206 self.v = remainder;
207 Some(next)
208 }
209}
210
211#[derive(Debug)]
213pub struct RefCellValueObserverIterMut<'it, T> {
214 v: Option<RefMut<'it, [T]>>,
215}
216
217impl<'it, T: 'it, A: DerefMut<Target = [T]> + Serialize> AsIterMut<'it>
218 for RefCellValueObserver<'_, A>
219{
220 type RefMut = RefMut<'it, T>;
221 type IntoIterMut = RefCellValueObserverIterMut<'it, T>;
222
223 fn as_iter_mut(&'it mut self) -> Self::IntoIterMut {
224 Self::IntoIterMut {
225 v: Some(RefMut::map(
226 self.value.as_ref().borrow_mut(),
227 DerefMut::deref_mut,
228 )),
229 }
230 }
231}
232
233impl<'it, T: 'it> Iterator for RefCellValueObserverIterMut<'it, T> {
234 type Item = RefMut<'it, T>;
235
236 fn next(&mut self) -> Option<Self::Item> {
237 match self.v.take() {
238 Some(v) => {
239 let next_slice = if v.len() > 1 {
240 let (next, remainder) = RefMut::map_split(v, |v| v.split_at_mut(1));
241 self.v = Some(remainder);
242 next
243 } else {
244 v
245 };
246 Some(RefMut::map(next_slice, |v| &mut v[0]))
247 }
248 _ => None,
249 }
250 }
251}
252
253impl<A: Hash> Hash for RefCellValueObserver<'_, A> {
254 #[inline]
257 fn hash<H: Hasher>(&self, hasher: &mut H) {
258 self.get_ref().hash(hasher);
259 }
260}
261
262impl<A> HasLen for RefCellValueObserver<'_, A>
265where
266 A: HasLen,
267{
268 fn len(&self) -> usize {
271 self.get_ref().len()
272 }
273
274 fn is_empty(&self) -> bool {
277 self.get_ref().is_empty()
278 }
279}
280
281impl<T> AsRef<Self> for RefCellValueObserver<'_, T> {
282 fn as_ref(&self) -> &Self {
283 self
284 }
285}
286
287impl<T> AsMut<Self> for RefCellValueObserver<'_, T> {
288 fn as_mut(&mut self) -> &mut Self {
289 self
290 }
291}
292
293impl<T, A> MapObserver for RefCellValueObserver<'_, A>
294where
295 T: PartialEq + Copy + Hash + Default + DeserializeOwned + Serialize + Debug,
296 A: DerefMut<Target = [T]> + Hash + Serialize + DeserializeOwned + HasLen + Default,
297{
298 type Entry = T;
299
300 fn get(&self, idx: usize) -> Self::Entry {
303 self.get_ref()[idx]
304 }
305
306 fn set(&mut self, idx: usize, val: Self::Entry) {
309 self.get_ref_mut()[idx] = val;
310 }
311
312 fn usable_count(&self) -> usize {
315 self.get_ref().len()
316 }
317
318 fn count_bytes(&self) -> u64 {
321 let default = Self::Entry::default();
322 let mut count = 0;
323 for entry in self.get_ref().iter() {
324 if entry != &default {
325 count += 1;
326 }
327 }
328 count
329 }
330
331 fn reset_map(&mut self) -> Result<(), Error> {
334 *self.get_ref_mut() = A::default();
337 Ok(())
338 }
339
340 fn to_vec(&self) -> Vec<Self::Entry> {
343 self.get_ref().to_vec()
344 }
345
346 fn how_many_set(&self, indexes: &[usize]) -> usize {
349 let default = Self::Entry::default();
350 let mut count = 0;
351 let arr = self.get_ref();
352 for idx in indexes {
353 if arr[*idx] != default {
354 count += 1;
355 }
356 }
357 count
358 }
359
360 fn initial(&self) -> Self::Entry {
361 Self::Entry::default()
362 }
363}