Skip to main content

fast_able/
high_speed_cache.rs

1
2use std::fmt;
3use std::ops::{Deref, Index, IndexMut};
4use std::{default::Default, usize};
5
6use crate::unsafe_cell_type::U;
7
8/// 环形数组,适合高频数据,且数据量不大的场景。线程不安全,使用者请控制好访问时机。
9/// 1. 适合高频数据,且数据量不大的场景
10/// 2. 线程不安全,使用者请控制好访问时机
11/// 3. 设计上,push方法会覆盖掉旧数据,且不删除旧数据。find方法会从最新的数据项开始往前找,直到找到满足条件的项为止。
12///     3.1 例如,LEN=10,push了11项,那么第11项会覆盖掉第1项,但第1项仍然存在。find方法会先找第11项,再找第10项...直到找到满足条件的项为止。
13///     3.2 例如,LEN=10,push了9项,那么第1项到第9项都存在。find方法会先找第9项,再找第8项...直到找到满足条件的项为止。
14///     3.3 例如,LEN=10,push了10项,那么第1项到第10项都存在。find方法会先找第10项,再找第9项...直到找到满足条件的项为止。
15/// 4. 适合的场景:例如,某个接口的调用日志,push方法记录每次调用的日志,find方法根据条件找出满足条件的调用日志。
16pub 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    /// 添加1项
49    /// 请控制此方法不可并发访问
50    pub fn push(&self, item_new: T) {
51        let self_item = self.item_mut();
52
53        if self_item.count == 0 {
54            // 此时 index = 0, 对index不操作
55        } 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    /// 当前项
66    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    /// 请控制此方法不可并发访问
74    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            // 尚未走出一轮(填满 CAPACTIY 个项),后面没有值
101            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            // 尚未走出一轮(填满 CAPACTIY 个项),后面没有值
136            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    /// 实际存储的元素数量(最大为 LEN)
150    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    /// 返回迭代器,从最新到最旧的顺序遍历,支持 `.rev()` 反向遍历
163    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    /// 将逻辑索引(0=最新)转换为物理环形缓冲区索引
181    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
196/// FastVec 迭代器,从最新到最旧的顺序遍历,支持 `rev()` 反向(最旧到最新)遍历
197pub struct Iter<'a, T, const LEN: usize> {
198    data: &'a UnsafeData<T, LEN>,
199    remaining: usize,
200    /// 前端游标(最新侧),next() 从此处取值并向旧方向移动
201    front: usize,
202    /// 后端游标(最旧侧),next_back() 从此处取值并向新方向移动
203    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
247/// FastVec 所有权迭代器,消费 FastVec 并按从最新到最旧的顺序产出元素
248pub 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    // ==================== push 各种情况 ====================
368
369    #[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        // push 5 项到 LEN=4,第1项被覆盖
430        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        // push 20 项到 LEN=4(5 轮满)
451        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        // push 100 项到 LEN=4
463        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        // push 恰好 8 项到 LEN=4(2 轮满)
475        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    // ==================== LEN=1 边界 ====================
494
495    #[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    // ==================== iter ====================
518
519    #[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    // ==================== into_iter (&引用) ====================
555
556    #[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    // ==================== len / is_empty / count ====================
584
585    #[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); // 封顶 LEN
605        assert_eq!(cache.count, 5); // 总 push 次数
606
607        cache.push(6);
608        cache.push(7);
609        assert_eq!(cache.len(), 4);
610        assert_eq!(cache.count, 7);
611    }
612
613    // ==================== Debug ====================
614
615    #[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    // ==================== Display ====================
640
641    #[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    // ==================== Index ====================
666
667    #[test]
668    fn test_index_partial() {
669        let cache = make_cache(&[10, 20, 30]);
670        assert_eq!(cache[0], 30); // 最新
671        assert_eq!(cache[1], 20);
672        assert_eq!(cache[2], 10); // 最旧
673    }
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    // ==================== IndexMut ====================
715
716    #[test]
717    fn test_index_mut_partial() {
718        let mut cache = make_cache(&[10, 20, 30]);
719        cache[0] = 99; // 修改最新
720        assert_eq!(cache[0], 99);
721        assert_eq!(cache[1], 20);
722        assert_eq!(cache[2], 10);
723
724        cache[2] = 88; // 修改最旧
725        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; // 修改最新(原值5)
732        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; // 修改第2新的项(原值3)
742        let items: Vec<&i32> = cache.iter().collect();
743        assert_eq!(items, vec![&4, &33, &2, &1]);
744    }
745
746    // ==================== find ====================
747
748    #[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        // 从最新开始找
758        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)); // 最新的偶数
769    }
770
771    #[test]
772    fn test_find_overflow() {
773        let cache = make_cache(&[1, 2, 3, 4, 5]);
774        // 第1项已被第5项覆盖
775        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    // ==================== find_vec ====================
781
782    #[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    // ==================== current ====================
817
818    #[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); // overflow
834        assert_eq!(cache.current(), Some(&50));
835    }
836
837    // ==================== clear ====================
838
839    #[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    // ==================== Default ====================
876
877    #[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    // ==================== 一致性验证 ====================
885
886    #[test]
887    fn test_iter_index_consistency() {
888        // iter 的顺序和 index 的顺序完全一致
889        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        // iter(所有) 和 find_vec(|_| true) 结果一致
899        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    // ==================== 综合场景 ====================
931
932    #[test]
933    fn test_push_clear_push_cycle() {
934        let cache = FastArray::<i32, 4>::new();
935
936        // 第一轮
937        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        // 清空
945        cache.clear();
946        assert!(cache.is_empty());
947
948        // 第二轮
949        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        // 再满
957        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        // Display: [15, 10, 5]
969        assert_eq!(display, "[15, 10, 5]");
970        let debug = format!("{:?}", cache);
971        // Debug: [15, 10, 5]
972        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        // LEN=4, push了7项,保留 7,6,5,4
979
980        // len / count / is_empty
981        assert_eq!(cache.len(), 4);
982        assert_eq!(cache.count, 7);
983        assert!(!cache.is_empty());
984
985        // current
986        assert_eq!(cache.current(), Some(&7));
987
988        // iter
989        let items: Vec<&i32> = cache.iter().collect();
990        assert_eq!(items, vec![&7, &6, &5, &4]);
991
992        // into_iter
993        let items2: Vec<&i32> = (&cache).into_iter().collect();
994        assert_eq!(items2, vec![&7, &6, &5, &4]);
995
996        // index
997        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        // find
1003        assert_eq!(cache.find(|&v| v == 5), Some(&5));
1004        assert!(cache.find(|&v| v == 1).is_none());
1005
1006        // find_vec
1007        let found = cache.find_vec(|&v| v >= 6);
1008        assert_eq!(found, vec![&7, &6]);
1009
1010        // debug / display
1011        assert_eq!(format!("{:?}", cache), "[7, 6, 5, 4]");
1012        assert_eq!(format!("{}", cache), "[7, 6, 5, 4]");
1013    }
1014
1015    // ==================== rev ====================
1016
1017    #[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        // iter: 30, 20, 10 → rev: 10, 20, 30
1035        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        // 保留 6,5,4,3 → rev: 3, 4, 5, 6
1050        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        // 保留 20,19,18,17 → rev: 17, 18, 19, 20
1059        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        // front: 4, back: 1
1087        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    // ==================== into_iter (所有权) ====================
1096
1097    #[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        // 保留 5,4,3,2 → rev: 2,3,4,5
1129        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}