1
2use std::fmt;
3use std::ops::{Deref, Index, IndexMut};
4use std::{default::Default, usize};
5
6use crate::unsafe_cell_type::U;
7
8pub struct FastArray<T, const LEN: usize> {
17 item: U<UnsafeData<T, LEN>>,
18}
19
20impl<T, const LEN: usize> Deref for FastArray<T, LEN> {
21 type Target = UnsafeData<T, LEN>;
22 fn deref(&self) -> &Self::Target {
23 self.item.as_ref()
24 }
25}
26
27pub struct UnsafeData<T, const LEN: usize> {
28 items: [Option<T>; LEN],
29 index: usize,
30 pub count: usize,
31}
32
33impl<T, const LEN: usize> FastArray<T, LEN> {
34 pub fn new() -> Self {
35 let items: [Option<T>; LEN] = std::array::from_fn(|_| None);
36 let item = UnsafeData {
37 items,
38 index: 0,
39 count: 0,
40 };
41 Self { item: U::new(item) }
42 }
43
44 fn item_mut(&self) -> &mut UnsafeData<T, LEN> {
45 self.item.as_mut()
46 }
47
48 pub fn push(&self, item_new: T) {
51 let self_item = self.item_mut();
52
53 if self_item.count == 0 {
54 } else {
56 self_item.index += 1;
57 if self_item.index == LEN {
58 self_item.index = 0;
59 }
60 }
61 self_item.items[self.index] = Some(item_new);
62 self_item.count += 1;
63 }
64
65 pub fn current(&self) -> Option<&T> {
67 if self.count == 0 {
68 return None;
69 }
70 self.items[self.index].as_ref()
71 }
72
73 pub fn clear(&self) {
75 let self_item = self.item_mut();
76 self_item.index = 0;
77 self_item.count = 0;
78 }
79
80 pub fn find<F: FnMut(&T) -> bool>(&self, mut f: F) -> Option<&T> {
81 if self.count == 0 {
82 return None;
83 }
84
85 if let Some(当前项) = &self.items[self.index] {
86 if f(当前项) {
87 return Some(当前项);
88 }
89 }
90
91 let index_当前索引 = self.index;
92 for idx in (0..index_当前索引).rev() {
93 if let Some(item) = &self.items[idx] {
94 if f(item) {
95 return Some(item);
96 }
97 }
98 }
99 if self.count <= LEN {
100 return None;
102 }
103
104 for idx in ((index_当前索引 + 1)..self.items.len()).rev() {
105 if let Some(item) = &self.items[idx] {
106 if f(item) {
107 return Some(item);
108 }
109 }
110 }
111 None
112 }
113
114 pub fn find_vec<F: FnMut(&T) -> bool>(&self, mut f: F) -> Vec<&T> {
115 if self.count == 0 {
116 return vec![];
117 }
118
119 let mut r_items = vec![];
120 if let Some(当前项) = &self.items[self.index] {
121 if f(当前项) {
122 r_items.push(当前项);
123 }
124 }
125
126 let index_当前索引 = self.index;
127 for idx in (0..index_当前索引).rev() {
128 if let Some(item) = &self.items[idx] {
129 if f(item) {
130 r_items.push(item);
131 }
132 }
133 }
134 if self.count <= LEN {
135 return r_items;
137 }
138
139 for idx in ((index_当前索引 + 1)..self.items.len()).rev() {
140 if let Some(item) = &self.items[idx] {
141 if f(item) {
142 r_items.push(item);
143 }
144 }
145 }
146 r_items
147 }
148
149 pub fn len(&self) -> usize {
151 if self.count <= LEN {
152 self.count
153 } else {
154 LEN
155 }
156 }
157
158 pub fn is_empty(&self) -> bool {
159 self.count == 0
160 }
161
162 pub fn iter(&self) -> Iter<'_, T, LEN> {
164 let len = self.len();
165 let back = if len == 0 {
166 0
167 } else if self.count <= LEN {
168 0
169 } else {
170 (self.index + 1) % LEN
171 };
172 Iter {
173 data: self.item.as_ref(),
174 remaining: len,
175 front: self.index,
176 back,
177 }
178 }
179
180 fn logical_to_physical(&self, logical_idx: usize) -> usize {
182 assert!(
183 logical_idx < self.len(),
184 "index out of bounds: the len is {} but the index is {}",
185 self.len(),
186 logical_idx
187 );
188 if self.index >= logical_idx {
189 self.index - logical_idx
190 } else {
191 LEN - (logical_idx - self.index)
192 }
193 }
194}
195
196pub struct Iter<'a, T, const LEN: usize> {
198 data: &'a UnsafeData<T, LEN>,
199 remaining: usize,
200 front: usize,
202 back: usize,
204}
205
206impl<'a, T, const LEN: usize> Iterator for Iter<'a, T, LEN> {
207 type Item = &'a T;
208
209 fn next(&mut self) -> Option<Self::Item> {
210 if self.remaining == 0 {
211 return None;
212 }
213 let item = self.data.items[self.front].as_ref();
214 self.front = if self.front == 0 { LEN - 1 } else { self.front - 1 };
215 self.remaining -= 1;
216 item
217 }
218
219 fn size_hint(&self) -> (usize, Option<usize>) {
220 (self.remaining, Some(self.remaining))
221 }
222}
223
224impl<'a, T, const LEN: usize> DoubleEndedIterator for Iter<'a, T, LEN> {
225 fn next_back(&mut self) -> Option<Self::Item> {
226 if self.remaining == 0 {
227 return None;
228 }
229 let item = self.data.items[self.back].as_ref();
230 self.back = if self.back == LEN - 1 { 0 } else { self.back + 1 };
231 self.remaining -= 1;
232 item
233 }
234}
235
236impl<'a, T, const LEN: usize> ExactSizeIterator for Iter<'a, T, LEN> {}
237
238impl<'a, T, const LEN: usize> IntoIterator for &'a FastArray<T, LEN> {
239 type Item = &'a T;
240 type IntoIter = Iter<'a, T, LEN>;
241
242 fn into_iter(self) -> Self::IntoIter {
243 self.iter()
244 }
245}
246
247pub struct IntoIter<T, const LEN: usize> {
249 items: [Option<T>; LEN],
250 remaining: usize,
251 front: usize,
252 back: usize,
253}
254
255impl<T, const LEN: usize> Iterator for IntoIter<T, LEN> {
256 type Item = T;
257
258 fn next(&mut self) -> Option<Self::Item> {
259 if self.remaining == 0 {
260 return None;
261 }
262 let item = self.items[self.front].take();
263 self.front = if self.front == 0 { LEN - 1 } else { self.front - 1 };
264 self.remaining -= 1;
265 item
266 }
267
268 fn size_hint(&self) -> (usize, Option<usize>) {
269 (self.remaining, Some(self.remaining))
270 }
271}
272
273impl<T, const LEN: usize> DoubleEndedIterator for IntoIter<T, LEN> {
274 fn next_back(&mut self) -> Option<Self::Item> {
275 if self.remaining == 0 {
276 return None;
277 }
278 let item = self.items[self.back].take();
279 self.back = if self.back == LEN - 1 { 0 } else { self.back + 1 };
280 self.remaining -= 1;
281 item
282 }
283}
284
285impl<T, const LEN: usize> ExactSizeIterator for IntoIter<T, LEN> {}
286
287impl<T, const LEN: usize> IntoIterator for FastArray<T, LEN> {
288 type Item = T;
289 type IntoIter = IntoIter<T, LEN>;
290
291 fn into_iter(self) -> Self::IntoIter {
292 let len = self.len();
293 let index = self.index;
294 let count = self.count;
295 let items = self.item.into_inner().items;
296 let back = if len == 0 {
297 0
298 } else if count <= LEN {
299 0
300 } else {
301 (index + 1) % LEN
302 };
303 IntoIter {
304 items,
305 remaining: len,
306 front: index,
307 back,
308 }
309 }
310}
311
312impl<T: fmt::Debug, const LEN: usize> fmt::Debug for FastArray<T, LEN> {
313 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
314 f.debug_list().entries(self.iter()).finish()
315 }
316}
317
318impl<T: fmt::Display, const LEN: usize> fmt::Display for FastArray<T, LEN> {
319 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
320 write!(f, "[")?;
321 let mut first = true;
322 for item in self.iter() {
323 if !first {
324 write!(f, ", ")?;
325 }
326 write!(f, "{}", item)?;
327 first = false;
328 }
329 write!(f, "]")
330 }
331}
332
333impl<T, const LEN: usize> Index<usize> for FastArray<T, LEN> {
334 type Output = T;
335
336 fn index(&self, idx: usize) -> &Self::Output {
337 let physical = self.logical_to_physical(idx);
338 self.items[physical].as_ref().unwrap()
339 }
340}
341
342impl<T, const LEN: usize> IndexMut<usize> for FastArray<T, LEN> {
343 fn index_mut(&mut self, idx: usize) -> &mut Self::Output {
344 let physical = self.logical_to_physical(idx);
345 self.item.as_mut().items[physical].as_mut().unwrap()
346 }
347}
348
349impl<T, const LEN: usize> Default for FastArray<T, LEN> {
350 fn default() -> Self {
351 Self::new()
352 }
353}
354
355#[cfg(test)]
356mod tests {
357 use super::*;
358
359 fn make_cache(values: &[i32]) -> FastArray<i32, 4> {
360 let cache = FastArray::<i32, 4>::new();
361 for &v in values {
362 cache.push(v);
363 }
364 cache
365 }
366
367 #[test]
370 fn test_empty_no_push() {
371 let cache = FastArray::<i32, 4>::new();
372 assert_eq!(cache.len(), 0);
373 assert_eq!(cache.count, 0);
374 assert!(cache.is_empty());
375 assert!(cache.current().is_none());
376 assert!(cache.find(|_| true).is_none());
377 assert!(cache.find_vec(|_| true).is_empty());
378 assert_eq!(cache.iter().count(), 0);
379 let collected: Vec<&i32> = cache.iter().collect();
380 assert!(collected.is_empty());
381 }
382
383 #[test]
384 fn test_push_single() {
385 let cache = FastArray::<i32, 4>::new();
386 cache.push(42);
387 assert_eq!(cache.len(), 1);
388 assert_eq!(cache.count, 1);
389 assert!(!cache.is_empty());
390 assert_eq!(cache.current(), Some(&42));
391 assert_eq!(cache[0], 42);
392 let items: Vec<&i32> = cache.iter().collect();
393 assert_eq!(items, vec![&42]);
394 }
395
396 #[test]
397 fn test_partial_fill() {
398 let cache = make_cache(&[10, 20]);
399 assert_eq!(cache.len(), 2);
400 assert_eq!(cache.count, 2);
401 assert!(!cache.is_empty());
402 assert_eq!(cache.current(), Some(&20));
403 let items: Vec<&i32> = cache.iter().collect();
404 assert_eq!(items, vec![&20, &10]);
405 }
406
407 #[test]
408 fn test_partial_fill_three() {
409 let cache = make_cache(&[10, 20, 30]);
410 assert_eq!(cache.len(), 3);
411 assert_eq!(cache.count, 3);
412 assert_eq!(cache.current(), Some(&30));
413 let items: Vec<&i32> = cache.iter().collect();
414 assert_eq!(items, vec![&30, &20, &10]);
415 }
416
417 #[test]
418 fn test_exact_full() {
419 let cache = make_cache(&[1, 2, 3, 4]);
420 assert_eq!(cache.len(), 4);
421 assert_eq!(cache.count, 4);
422 assert_eq!(cache.current(), Some(&4));
423 let items: Vec<&i32> = cache.iter().collect();
424 assert_eq!(items, vec![&4, &3, &2, &1]);
425 }
426
427 #[test]
428 fn test_overflow_by_one() {
429 let cache = make_cache(&[1, 2, 3, 4, 5]);
431 assert_eq!(cache.len(), 4);
432 assert_eq!(cache.count, 5);
433 assert_eq!(cache.current(), Some(&5));
434 let items: Vec<&i32> = cache.iter().collect();
435 assert_eq!(items, vec![&5, &4, &3, &2]);
436 }
437
438 #[test]
439 fn test_overflow_by_two() {
440 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
441 assert_eq!(cache.len(), 4);
442 assert_eq!(cache.count, 6);
443 assert_eq!(cache.current(), Some(&6));
444 let items: Vec<&i32> = cache.iter().collect();
445 assert_eq!(items, vec![&6, &5, &4, &3]);
446 }
447
448 #[test]
449 fn test_many_wraps() {
450 let values: Vec<i32> = (1..=20).collect();
452 let cache = make_cache(&values);
453 assert_eq!(cache.len(), 4);
454 assert_eq!(cache.count, 20);
455 assert_eq!(cache.current(), Some(&20));
456 let items: Vec<&i32> = cache.iter().collect();
457 assert_eq!(items, vec![&20, &19, &18, &17]);
458 }
459
460 #[test]
461 fn test_many_wraps_large() {
462 let values: Vec<i32> = (1..=100).collect();
464 let cache = make_cache(&values);
465 assert_eq!(cache.len(), 4);
466 assert_eq!(cache.count, 100);
467 assert_eq!(cache.current(), Some(&100));
468 let items: Vec<&i32> = cache.iter().collect();
469 assert_eq!(items, vec![&100, &99, &98, &97]);
470 }
471
472 #[test]
473 fn test_exact_two_wraps() {
474 let values: Vec<i32> = (1..=8).collect();
476 let cache = make_cache(&values);
477 assert_eq!(cache.len(), 4);
478 assert_eq!(cache.count, 8);
479 let items: Vec<&i32> = cache.iter().collect();
480 assert_eq!(items, vec![&8, &7, &6, &5]);
481 }
482
483 #[test]
484 fn test_exact_two_wraps_plus_one() {
485 let values: Vec<i32> = (1..=9).collect();
486 let cache = make_cache(&values);
487 assert_eq!(cache.len(), 4);
488 assert_eq!(cache.count, 9);
489 let items: Vec<&i32> = cache.iter().collect();
490 assert_eq!(items, vec![&9, &8, &7, &6]);
491 }
492
493 #[test]
496 fn test_len_one_cache() {
497 let cache = FastArray::<i32, 1>::new();
498 assert!(cache.is_empty());
499
500 cache.push(1);
501 assert_eq!(cache.len(), 1);
502 assert_eq!(cache[0], 1);
503
504 cache.push(2);
505 assert_eq!(cache.len(), 1);
506 assert_eq!(cache.count, 2);
507 assert_eq!(cache[0], 2);
508
509 cache.push(3);
510 assert_eq!(cache[0], 3);
511 assert_eq!(cache.count, 3);
512
513 let items: Vec<&i32> = cache.iter().collect();
514 assert_eq!(items, vec![&3]);
515 }
516
517 #[test]
520 fn test_iter_empty() {
521 let cache = FastArray::<i32, 4>::new();
522 let mut iter = cache.iter();
523 assert_eq!(iter.next(), None);
524 }
525
526 #[test]
527 fn test_iter_size_hint() {
528 let cache = make_cache(&[1, 2, 3]);
529 let iter = cache.iter();
530 assert_eq!(iter.size_hint(), (3, Some(3)));
531 assert_eq!(iter.len(), 3);
532 }
533
534 #[test]
535 fn test_iter_exact_size_overflow() {
536 let cache = make_cache(&[1, 2, 3, 4, 5]);
537 let iter = cache.iter();
538 assert_eq!(iter.len(), 4);
539 }
540
541 #[test]
542 fn test_iter_step_by_step() {
543 let cache = make_cache(&[10, 20, 30]);
544 let mut iter = cache.iter();
545 assert_eq!(iter.next(), Some(&30));
546 assert_eq!(iter.len(), 2);
547 assert_eq!(iter.next(), Some(&20));
548 assert_eq!(iter.len(), 1);
549 assert_eq!(iter.next(), Some(&10));
550 assert_eq!(iter.len(), 0);
551 assert_eq!(iter.next(), None);
552 }
553
554 #[test]
557 fn test_into_iter_borrow() {
558 let cache = make_cache(&[10, 20, 30]);
559 let items: Vec<&i32> = (&cache).into_iter().collect();
560 assert_eq!(items, vec![&30, &20, &10]);
561 }
562
563 #[test]
564 fn test_for_loop() {
565 let cache = make_cache(&[1, 2, 3]);
566 let mut items = vec![];
567 for item in &cache {
568 items.push(*item);
569 }
570 assert_eq!(items, vec![3, 2, 1]);
571 }
572
573 #[test]
574 fn test_for_loop_overflow() {
575 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
576 let mut items = vec![];
577 for item in &cache {
578 items.push(*item);
579 }
580 assert_eq!(items, vec![6, 5, 4, 3]);
581 }
582
583 #[test]
586 fn test_len_and_count_incremental() {
587 let cache = FastArray::<i32, 4>::new();
588 assert_eq!(cache.len(), 0);
589 assert_eq!(cache.count, 0);
590 assert!(cache.is_empty());
591
592 cache.push(1);
593 assert_eq!(cache.len(), 1);
594 assert_eq!(cache.count, 1);
595 assert!(!cache.is_empty());
596
597 cache.push(2);
598 cache.push(3);
599 cache.push(4);
600 assert_eq!(cache.len(), 4);
601 assert_eq!(cache.count, 4);
602
603 cache.push(5);
604 assert_eq!(cache.len(), 4); assert_eq!(cache.count, 5); cache.push(6);
608 cache.push(7);
609 assert_eq!(cache.len(), 4);
610 assert_eq!(cache.count, 7);
611 }
612
613 #[test]
616 fn test_debug_empty() {
617 let cache = FastArray::<i32, 4>::new();
618 assert_eq!(format!("{:?}", cache), "[]");
619 }
620
621 #[test]
622 fn test_debug_partial() {
623 let cache = make_cache(&[1, 2]);
624 assert_eq!(format!("{:?}", cache), "[2, 1]");
625 }
626
627 #[test]
628 fn test_debug_full() {
629 let cache = make_cache(&[1, 2, 3, 4]);
630 assert_eq!(format!("{:?}", cache), "[4, 3, 2, 1]");
631 }
632
633 #[test]
634 fn test_debug_overflow() {
635 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
636 assert_eq!(format!("{:?}", cache), "[6, 5, 4, 3]");
637 }
638
639 #[test]
642 fn test_display_empty() {
643 let cache = FastArray::<i32, 4>::new();
644 assert_eq!(format!("{}", cache), "[]");
645 }
646
647 #[test]
648 fn test_display_partial() {
649 let cache = make_cache(&[1, 2]);
650 assert_eq!(format!("{}", cache), "[2, 1]");
651 }
652
653 #[test]
654 fn test_display_full() {
655 let cache = make_cache(&[1, 2, 3, 4]);
656 assert_eq!(format!("{}", cache), "[4, 3, 2, 1]");
657 }
658
659 #[test]
660 fn test_display_overflow() {
661 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
662 assert_eq!(format!("{}", cache), "[6, 5, 4, 3]");
663 }
664
665 #[test]
668 fn test_index_partial() {
669 let cache = make_cache(&[10, 20, 30]);
670 assert_eq!(cache[0], 30); assert_eq!(cache[1], 20);
672 assert_eq!(cache[2], 10); }
674
675 #[test]
676 fn test_index_full() {
677 let cache = make_cache(&[1, 2, 3, 4]);
678 assert_eq!(cache[0], 4);
679 assert_eq!(cache[1], 3);
680 assert_eq!(cache[2], 2);
681 assert_eq!(cache[3], 1);
682 }
683
684 #[test]
685 fn test_index_overflow() {
686 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
687 assert_eq!(cache[0], 6);
688 assert_eq!(cache[1], 5);
689 assert_eq!(cache[2], 4);
690 assert_eq!(cache[3], 3);
691 }
692
693 #[test]
694 #[should_panic(expected = "index out of bounds")]
695 fn test_index_out_of_bounds_empty() {
696 let cache = FastArray::<i32, 4>::new();
697 let _ = cache[0];
698 }
699
700 #[test]
701 #[should_panic(expected = "index out of bounds")]
702 fn test_index_out_of_bounds_partial() {
703 let cache = make_cache(&[1, 2]);
704 let _ = cache[2];
705 }
706
707 #[test]
708 #[should_panic(expected = "index out of bounds")]
709 fn test_index_out_of_bounds_full() {
710 let cache = make_cache(&[1, 2, 3, 4]);
711 let _ = cache[4];
712 }
713
714 #[test]
717 fn test_index_mut_partial() {
718 let mut cache = make_cache(&[10, 20, 30]);
719 cache[0] = 99; assert_eq!(cache[0], 99);
721 assert_eq!(cache[1], 20);
722 assert_eq!(cache[2], 10);
723
724 cache[2] = 88; assert_eq!(cache[2], 88);
726 }
727
728 #[test]
729 fn test_index_mut_overflow() {
730 let mut cache = make_cache(&[1, 2, 3, 4, 5]);
731 cache[0] = 99; assert_eq!(cache[0], 99);
733 assert_eq!(cache[1], 4);
734 assert_eq!(cache[2], 3);
735 assert_eq!(cache[3], 2);
736 }
737
738 #[test]
739 fn test_index_mut_then_iter() {
740 let mut cache = make_cache(&[1, 2, 3, 4]);
741 cache[1] = 33; let items: Vec<&i32> = cache.iter().collect();
743 assert_eq!(items, vec![&4, &33, &2, &1]);
744 }
745
746 #[test]
749 fn test_find_empty() {
750 let cache = FastArray::<i32, 4>::new();
751 assert!(cache.find(|_| true).is_none());
752 }
753
754 #[test]
755 fn test_find_partial() {
756 let cache = make_cache(&[10, 20, 30]);
757 assert_eq!(cache.find(|&v| v >= 20), Some(&30));
759 assert_eq!(cache.find(|&v| v == 10), Some(&10));
760 assert!(cache.find(|&v| v > 100).is_none());
761 }
762
763 #[test]
764 fn test_find_full() {
765 let cache = make_cache(&[1, 2, 3, 4]);
766 assert_eq!(cache.find(|&v| v == 1), Some(&1));
767 assert_eq!(cache.find(|&v| v == 4), Some(&4));
768 assert_eq!(cache.find(|&v| v % 2 == 0), Some(&4)); }
770
771 #[test]
772 fn test_find_overflow() {
773 let cache = make_cache(&[1, 2, 3, 4, 5]);
774 assert!(cache.find(|&v| v == 1).is_none());
776 assert_eq!(cache.find(|&v| v == 5), Some(&5));
777 assert_eq!(cache.find(|&v| v == 2), Some(&2));
778 }
779
780 #[test]
783 fn test_find_vec_empty() {
784 let cache = FastArray::<i32, 4>::new();
785 assert!(cache.find_vec(|_| true).is_empty());
786 }
787
788 #[test]
789 fn test_find_vec_partial() {
790 let cache = make_cache(&[10, 20, 30]);
791 let found = cache.find_vec(|&v| v >= 20);
792 assert_eq!(found, vec![&30, &20]);
793 }
794
795 #[test]
796 fn test_find_vec_all() {
797 let cache = make_cache(&[1, 2, 3, 4]);
798 let found = cache.find_vec(|_| true);
799 assert_eq!(found, vec![&4, &3, &2, &1]);
800 }
801
802 #[test]
803 fn test_find_vec_overflow() {
804 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
805 let found = cache.find_vec(|_| true);
806 assert_eq!(found, vec![&6, &5, &4, &3]);
807 }
808
809 #[test]
810 fn test_find_vec_none_match() {
811 let cache = make_cache(&[1, 2, 3]);
812 let found = cache.find_vec(|&v| v > 100);
813 assert!(found.is_empty());
814 }
815
816 #[test]
819 fn test_current_empty() {
820 let cache = FastArray::<i32, 4>::new();
821 assert!(cache.current().is_none());
822 }
823
824 #[test]
825 fn test_current_after_pushes() {
826 let cache = FastArray::<i32, 4>::new();
827 cache.push(10);
828 assert_eq!(cache.current(), Some(&10));
829 cache.push(20);
830 assert_eq!(cache.current(), Some(&20));
831 cache.push(30);
832 cache.push(40);
833 cache.push(50); assert_eq!(cache.current(), Some(&50));
835 }
836
837 #[test]
840 fn test_clear() {
841 let cache = make_cache(&[1, 2, 3, 4]);
842 assert_eq!(cache.len(), 4);
843 cache.clear();
844 assert_eq!(cache.len(), 0);
845 assert_eq!(cache.count, 0);
846 assert!(cache.is_empty());
847 assert!(cache.current().is_none());
848 assert_eq!(cache.iter().count(), 0);
849 }
850
851 #[test]
852 fn test_clear_then_push() {
853 let cache = make_cache(&[1, 2, 3, 4, 5]);
854 cache.clear();
855 cache.push(100);
856 assert_eq!(cache.len(), 1);
857 assert_eq!(cache.count, 1);
858 assert_eq!(cache.current(), Some(&100));
859 let items: Vec<&i32> = cache.iter().collect();
860 assert_eq!(items, vec![&100]);
861 }
862
863 #[test]
864 fn test_clear_overflow_then_refill() {
865 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
866 cache.clear();
867 cache.push(100);
868 cache.push(200);
869 assert_eq!(cache.len(), 2);
870 assert_eq!(cache.count, 2);
871 let items: Vec<&i32> = cache.iter().collect();
872 assert_eq!(items, vec![&200, &100]);
873 }
874
875 #[test]
878 fn test_default() {
879 let cache: FastArray<i32, 4> = Default::default();
880 assert!(cache.is_empty());
881 assert_eq!(cache.len(), 0);
882 }
883
884 #[test]
887 fn test_iter_index_consistency() {
888 let cache = make_cache(&[10, 20, 30, 40, 50, 60]);
890 let iter_items: Vec<&i32> = cache.iter().collect();
891 for (i, item) in iter_items.iter().enumerate() {
892 assert_eq!(**item, cache[i]);
893 }
894 }
895
896 #[test]
897 fn test_iter_find_vec_consistency() {
898 let cache = make_cache(&[10, 20, 30, 40, 50, 60]);
900 let iter_items: Vec<&i32> = cache.iter().collect();
901 let find_items = cache.find_vec(|_| true);
902 assert_eq!(iter_items, find_items);
903 }
904
905 #[test]
906 fn test_iter_find_vec_consistency_partial() {
907 let cache = make_cache(&[10, 20]);
908 let iter_items: Vec<&i32> = cache.iter().collect();
909 let find_items = cache.find_vec(|_| true);
910 assert_eq!(iter_items, find_items);
911 }
912
913 #[test]
914 fn test_iter_find_vec_consistency_exact_full() {
915 let cache = make_cache(&[1, 2, 3, 4]);
916 let iter_items: Vec<&i32> = cache.iter().collect();
917 let find_items = cache.find_vec(|_| true);
918 assert_eq!(iter_items, find_items);
919 }
920
921 #[test]
922 fn test_iter_find_vec_consistency_many_wraps() {
923 let values: Vec<i32> = (1..=100).collect();
924 let cache = make_cache(&values);
925 let iter_items: Vec<&i32> = cache.iter().collect();
926 let find_items = cache.find_vec(|_| true);
927 assert_eq!(iter_items, find_items);
928 }
929
930 #[test]
933 fn test_push_clear_push_cycle() {
934 let cache = FastArray::<i32, 4>::new();
935
936 for i in 1..=6 {
938 cache.push(i);
939 }
940 assert_eq!(cache.len(), 4);
941 let items: Vec<&i32> = cache.iter().collect();
942 assert_eq!(items, vec![&6, &5, &4, &3]);
943
944 cache.clear();
946 assert!(cache.is_empty());
947
948 for i in 100..=102 {
950 cache.push(i);
951 }
952 assert_eq!(cache.len(), 3);
953 let items: Vec<&i32> = cache.iter().collect();
954 assert_eq!(items, vec![&102, &101, &100]);
955
956 cache.push(103);
958 cache.push(104);
959 assert_eq!(cache.len(), 4);
960 let items: Vec<&i32> = cache.iter().collect();
961 assert_eq!(items, vec![&104, &103, &102, &101]);
962 }
963
964 #[test]
965 fn test_display_debug_consistency() {
966 let cache = make_cache(&[5, 10, 15]);
967 let display = format!("{}", cache);
968 assert_eq!(display, "[15, 10, 5]");
970 let debug = format!("{:?}", cache);
971 assert_eq!(debug, "[15, 10, 5]");
973 }
974
975 #[test]
976 fn test_all_apis_on_overflow_scenario() {
977 let cache = make_cache(&[1, 2, 3, 4, 5, 6, 7]);
978 assert_eq!(cache.len(), 4);
982 assert_eq!(cache.count, 7);
983 assert!(!cache.is_empty());
984
985 assert_eq!(cache.current(), Some(&7));
987
988 let items: Vec<&i32> = cache.iter().collect();
990 assert_eq!(items, vec![&7, &6, &5, &4]);
991
992 let items2: Vec<&i32> = (&cache).into_iter().collect();
994 assert_eq!(items2, vec![&7, &6, &5, &4]);
995
996 assert_eq!(cache[0], 7);
998 assert_eq!(cache[1], 6);
999 assert_eq!(cache[2], 5);
1000 assert_eq!(cache[3], 4);
1001
1002 assert_eq!(cache.find(|&v| v == 5), Some(&5));
1004 assert!(cache.find(|&v| v == 1).is_none());
1005
1006 let found = cache.find_vec(|&v| v >= 6);
1008 assert_eq!(found, vec![&7, &6]);
1009
1010 assert_eq!(format!("{:?}", cache), "[7, 6, 5, 4]");
1012 assert_eq!(format!("{}", cache), "[7, 6, 5, 4]");
1013 }
1014
1015 #[test]
1018 fn test_rev_empty() {
1019 let cache = FastArray::<i32, 4>::new();
1020 let items: Vec<&i32> = cache.iter().rev().collect();
1021 assert!(items.is_empty());
1022 }
1023
1024 #[test]
1025 fn test_rev_single() {
1026 let cache = make_cache(&[42]);
1027 let items: Vec<&i32> = cache.iter().rev().collect();
1028 assert_eq!(items, vec![&42]);
1029 }
1030
1031 #[test]
1032 fn test_rev_partial() {
1033 let cache = make_cache(&[10, 20, 30]);
1034 let items: Vec<&i32> = cache.iter().rev().collect();
1036 assert_eq!(items, vec![&10, &20, &30]);
1037 }
1038
1039 #[test]
1040 fn test_rev_exact_full() {
1041 let cache = make_cache(&[1, 2, 3, 4]);
1042 let items: Vec<&i32> = cache.iter().rev().collect();
1043 assert_eq!(items, vec![&1, &2, &3, &4]);
1044 }
1045
1046 #[test]
1047 fn test_rev_overflow() {
1048 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
1049 let items: Vec<&i32> = cache.iter().rev().collect();
1051 assert_eq!(items, vec![&3, &4, &5, &6]);
1052 }
1053
1054 #[test]
1055 fn test_rev_many_wraps() {
1056 let values: Vec<i32> = (1..=20).collect();
1057 let cache = make_cache(&values);
1058 let items: Vec<&i32> = cache.iter().rev().collect();
1060 assert_eq!(items, vec![&17, &18, &19, &20]);
1061 }
1062
1063 #[test]
1064 fn test_rev_len_one_cache() {
1065 let cache = FastArray::<i32, 1>::new();
1066 cache.push(1);
1067 cache.push(2);
1068 cache.push(3);
1069 let items: Vec<&i32> = cache.iter().rev().collect();
1070 assert_eq!(items, vec![&3]);
1071 }
1072
1073 #[test]
1074 fn test_rev_is_inverse_of_iter() {
1075 let cache = make_cache(&[1, 2, 3, 4, 5, 6, 7]);
1076 let forward: Vec<&i32> = cache.iter().collect();
1077 let mut backward: Vec<&i32> = cache.iter().rev().collect();
1078 backward.reverse();
1079 assert_eq!(forward, backward);
1080 }
1081
1082 #[test]
1083 fn test_mixed_next_and_next_back() {
1084 let cache = make_cache(&[1, 2, 3, 4]);
1085 let mut iter = cache.iter();
1086 assert_eq!(iter.next(), Some(&4));
1088 assert_eq!(iter.next_back(), Some(&1));
1089 assert_eq!(iter.next(), Some(&3));
1090 assert_eq!(iter.next_back(), Some(&2));
1091 assert_eq!(iter.next(), None);
1092 assert_eq!(iter.next_back(), None);
1093 }
1094
1095 #[test]
1098 fn test_into_iter_owned_empty() {
1099 let cache = FastArray::<i32, 4>::new();
1100 let items: Vec<i32> = cache.into_iter().collect();
1101 assert!(items.is_empty());
1102 }
1103
1104 #[test]
1105 fn test_into_iter_owned_partial() {
1106 let cache = make_cache(&[10, 20, 30]);
1107 let items: Vec<i32> = cache.into_iter().collect();
1108 assert_eq!(items, vec![30, 20, 10]);
1109 }
1110
1111 #[test]
1112 fn test_into_iter_owned_full() {
1113 let cache = make_cache(&[1, 2, 3, 4]);
1114 let items: Vec<i32> = cache.into_iter().collect();
1115 assert_eq!(items, vec![4, 3, 2, 1]);
1116 }
1117
1118 #[test]
1119 fn test_into_iter_owned_overflow() {
1120 let cache = make_cache(&[1, 2, 3, 4, 5, 6]);
1121 let items: Vec<i32> = cache.into_iter().collect();
1122 assert_eq!(items, vec![6, 5, 4, 3]);
1123 }
1124
1125 #[test]
1126 fn test_into_iter_owned_rev() {
1127 let cache = make_cache(&[1, 2, 3, 4, 5]);
1128 let items: Vec<i32> = cache.into_iter().rev().collect();
1130 assert_eq!(items, vec![2, 3, 4, 5]);
1131 }
1132
1133 #[test]
1134 fn test_into_iter_owned_for_loop() {
1135 let cache = make_cache(&[10, 20, 30]);
1136 let mut items = vec![];
1137 for item in cache {
1138 items.push(item);
1139 }
1140 assert_eq!(items, vec![30, 20, 10]);
1141 }
1142
1143 #[test]
1144 fn test_into_iter_owned_mixed() {
1145 let cache = make_cache(&[1, 2, 3, 4]);
1146 let mut iter = cache.into_iter();
1147 assert_eq!(iter.next(), Some(4));
1148 assert_eq!(iter.next_back(), Some(1));
1149 assert_eq!(iter.len(), 2);
1150 assert_eq!(iter.next(), Some(3));
1151 assert_eq!(iter.next_back(), Some(2));
1152 assert_eq!(iter.next(), None);
1153 }
1154}