use crossbeam::atomic::AtomicCell;
use crate::unsafe_cell_type::U;
use std::ops::Deref;
use std::{default::Default, usize};
use chrono::NaiveTime;
use crate::fasttime::b2_time::TimeExt;
use crate::fasttime::a8_micros;
use std::iter::{IntoIterator, Iterator, ExactSizeIterator};
use std::ops::{Index, IndexMut};
pub trait CacheData: Default + Clone {
fn time(&self) -> NaiveTime;
}
pub struct HighSpeedCache<T, const LEN: usize> {
item: U<UnsafeData<T, LEN>>,
}
impl<T, const LEN: usize> Deref for HighSpeedCache<T, LEN> {
type Target = UnsafeData<T, LEN>;
fn deref(&self) -> &Self::Target {
self.item.as_ref()
}
}
pub struct UnsafeData<T, const LEN: usize> {
items: [T; LEN],
index: usize,
defalut_val: T,
pub count: usize,
待补数据: AtomicCell<Option<(usize, T)>>,
}
pub struct HighSpeedCacheIter<'a, T, const LEN: usize> {
cache: &'a HighSpeedCache<T, LEN>,
current_index: usize,
items_seen: usize,
total_items: usize,
}
pub struct HighSpeedCacheIterMut<'a, T, const LEN: usize> {
cache: &'a mut HighSpeedCache<T, LEN>,
current_index: usize,
items_seen: usize,
total_items: usize,
}
trait CacheIteratorCore {
fn get_cache_count(&self) -> usize;
fn get_cache_index(&self) -> usize;
fn get_current_index(&self) -> usize;
fn get_items_seen(&self) -> usize;
fn get_total_items(&self) -> usize;
fn increment_counters(&mut self);
fn calculate_actual_index<const LEN: usize>(&self) -> Option<usize> {
if self.get_items_seen() >= self.get_total_items() {
return None;
}
let idx = if self.get_cache_count() <= LEN {
if self.get_current_index() >= self.get_cache_count() {
return None;
}
let newest_idx = self.get_cache_index();
if self.get_current_index() <= newest_idx {
newest_idx - self.get_current_index()
} else {
LEN - (self.get_current_index() - newest_idx)
}
} else {
let newest_idx = self.get_cache_index();
(newest_idx + LEN - self.get_current_index()) % LEN
};
Some(idx)
}
fn calculate_actual_index_for_back<const LEN: usize>(&self, back_index: usize) -> Option<usize> {
let cache_index = self.get_cache_index();
let cache_count = self.get_cache_count();
if back_index >= self.get_total_items() {
return None;
}
let actual_index = if cache_count <= LEN {
if back_index >= cache_count {
return None; }
let oldest_index = if cache_index + 1 >= cache_count {
0
} else {
(cache_index + 1) % LEN
};
(oldest_index + back_index) % LEN
} else {
(cache_index + 1 + back_index) % LEN
};
Some(actual_index)
}
}
impl<'a, T, const LEN: usize> CacheIteratorCore for HighSpeedCacheIter<'a, T, LEN> {
fn get_cache_count(&self) -> usize {
self.cache.count
}
fn get_cache_index(&self) -> usize {
self.cache.index
}
fn get_current_index(&self) -> usize {
self.current_index
}
fn get_items_seen(&self) -> usize {
self.items_seen
}
fn get_total_items(&self) -> usize {
self.total_items
}
fn increment_counters(&mut self) {
self.current_index += 1;
self.items_seen += 1;
}
}
impl<'a, T, const LEN: usize> CacheIteratorCore for HighSpeedCacheIterMut<'a, T, LEN> {
fn get_cache_count(&self) -> usize {
self.cache.count
}
fn get_cache_index(&self) -> usize {
self.cache.index
}
fn get_current_index(&self) -> usize {
self.current_index
}
fn get_items_seen(&self) -> usize {
self.items_seen
}
fn get_total_items(&self) -> usize {
self.total_items
}
fn increment_counters(&mut self) {
self.current_index += 1;
self.items_seen += 1;
}
}
impl<'a, T, const LEN: usize> Iterator for HighSpeedCacheIter<'a, T, LEN>
where
T: CacheData,
{
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if let Some(idx) = self.calculate_actual_index::<LEN>() {
let item = &self.cache.items[idx];
self.increment_counters();
Some(item)
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.get_total_items() - self.get_items_seen();
(remaining, Some(remaining))
}
}
impl<'a, T, const LEN: usize> DoubleEndedIterator for HighSpeedCacheIter<'a, T, LEN>
where
T: CacheData,
{
fn next_back(&mut self) -> Option<Self::Item> {
if self.items_seen >= self.total_items {
return None;
}
let back_index = self.total_items - self.items_seen - 1;
self.items_seen += 1;
self.cache.get(back_index)
}
}
impl<'a, T, const LEN: usize> Iterator for HighSpeedCacheIterMut<'a, T, LEN>
where
T: CacheData,
{
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
if let Some(idx) = self.calculate_actual_index::<LEN>() {
let item = unsafe {
let items_ptr = self.cache.item_mut().items.as_mut_ptr();
&mut *items_ptr.add(idx)
};
self.increment_counters();
Some(item)
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.get_total_items() - self.get_items_seen();
(remaining, Some(remaining))
}
}
impl<'a, T, const LEN: usize> ExactSizeIterator for HighSpeedCacheIter<'a, T, LEN>
where
T: CacheData,
{
fn len(&self) -> usize {
self.get_total_items() - self.get_items_seen()
}
}
impl<'a, T, const LEN: usize> ExactSizeIterator for HighSpeedCacheIterMut<'a, T, LEN>
where
T: CacheData,
{
fn len(&self) -> usize {
self.get_total_items() - self.get_items_seen()
}
}
impl<'a, T, const LEN: usize> DoubleEndedIterator for HighSpeedCacheIterMut<'a, T, LEN>
where
T: CacheData,
{
fn next_back(&mut self) -> Option<Self::Item> {
if self.items_seen >= self.total_items {
return None;
}
let back_index = self.total_items - self.items_seen - 1;
if let Some(actual_index) = self.calculate_actual_index_for_back::<LEN>(back_index) {
let item = unsafe {
let items_ptr = self.cache.item_mut().items.as_mut_ptr();
&mut *items_ptr.add(actual_index)
};
self.items_seen += 1;
Some(item)
} else {
None
}
}
}
pub struct HighSpeedCacheIntoIter<T, const LEN: usize> {
cache: HighSpeedCache<T, LEN>,
current_index: usize,
items_seen: usize,
total_items: usize,
}
impl<T, const LEN: usize> CacheIteratorCore for HighSpeedCacheIntoIter<T, LEN> {
fn get_cache_count(&self) -> usize {
self.cache.count
}
fn get_cache_index(&self) -> usize {
self.cache.index
}
fn get_current_index(&self) -> usize {
self.current_index
}
fn get_items_seen(&self) -> usize {
self.items_seen
}
fn get_total_items(&self) -> usize {
self.total_items
}
fn increment_counters(&mut self) {
self.current_index += 1;
self.items_seen += 1;
}
}
impl<T, const LEN: usize> Iterator for HighSpeedCacheIntoIter<T, LEN>
where
T: CacheData + Clone,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if let Some(idx) = self.calculate_actual_index::<LEN>() {
let item = self.cache.items[idx].clone();
self.increment_counters();
Some(item)
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.get_total_items() - self.get_items_seen();
(remaining, Some(remaining))
}
}
impl<T, const LEN: usize> ExactSizeIterator for HighSpeedCacheIntoIter<T, LEN>
where
T: CacheData + Clone,
{
fn len(&self) -> usize {
self.get_total_items() - self.get_items_seen()
}
}
impl<T, const LEN: usize> HighSpeedCache<T, LEN>
where
T: CacheData,
{
pub fn with_capacity(_capacity: usize) -> Self {
Self::new()
}
pub fn new() -> Self {
let items: [T; LEN] = std::array::from_fn(|_i| T::default());
let item = UnsafeData {
items,
index: 0,
count: 0,
defalut_val: T::default(),
待补数据: AtomicCell::new(None),
};
Self { item: item.into() }
}
fn item_mut(&self) -> &mut UnsafeData<T, LEN> {
self.item.as_mut()
}
pub fn push(&self, item_new: T) {
let self_item = self.item_mut();
if let Some((i, d)) = self.待补数据.swap(None) {
self_item.items[i] = d;
}
if self_item.count == 0 {
} else {
self_item.index += 1;
if self_item.index == LEN {
self_item.index = 0;
}
}
self_item.items[self.index] = item_new;
self_item.count += 1;
}
pub fn current(&self) -> &T {
if self.count == 0 {
return &self.item.as_ref().defalut_val;
}
&self.items[self.index]
}
pub fn clear(&self) {
let self_item = self.item_mut();
self_item.index = 0;
self_item.count = 0;
self_item.items[0] = T::default();
}
pub fn find_找之前的项(&self, 毫秒数: i64, is_找不到即取最新数据: bool) -> Option<&T> {
if self.count == 0 {
return None;
}
let capacity = self.items.len();
let 微秒数 = if 毫秒数 >= 0 {
毫秒数 as u64 * a8_micros::MICROS_PER_MILLIS
} else {
0
};
let ticks_当前项 = self.items[self.index].time().micros_of_day();
let index_当前索引 = self.index;
let mut find_最新 = Option::<&T>::None;
for idx in (0..index_当前索引).rev() {
let ticks_往前项 = self.items[idx].time().micros_of_day();
if ticks_往前项 == 0 {
continue;
}
let delta_往前微秒数 = ticks_当前项 - ticks_往前项;
if delta_往前微秒数 > 微秒数 {
return Some(&self.items[idx]);
}
if is_找不到即取最新数据 {
match &find_最新 {
None => {
find_最新 = Some(&self.items[idx]);
}
_ => (),
}
}
}
if self.count <= LEN {
return Some(find_最新.unwrap_or_else(|| &self.item.as_ref().defalut_val));
}
for idx in ((index_当前索引 + 1)..capacity).rev() {
let item = &self.items[idx];
let ticks_往前项 = item.time().micros_of_day();
let delta_往前微秒数 = ticks_当前项 - ticks_往前项;
if ticks_往前项 > 0 && delta_往前微秒数 > 微秒数 {
return Some(item);
}
}
return find_最新;
}
pub fn find_limit<F: Fn(&T, &T) -> bool>(
&self,
n: i64,
is_return_last: bool,
compare: F,
) -> T {
let items = self.list_items(n);
let 补一个数据 = None;
if (items.is_empty() || items.len() == 1) && is_return_last {
}
if items.is_empty() {
return 补一个数据.unwrap_or_else(|| self.defalut_val.clone());
}
let mut find_v = items[0];
for item in items.iter().skip(1) {
if compare(&find_v, item) {
find_v = item;
}
}
if let Some(v) = &补一个数据 {
if compare(&find_v, v) {
find_v = v;
}
}
return find_v.clone();
}
pub fn list_items_len(&self, mut count: usize) -> Vec<&T> {
if self.count == 0 {
return vec![];
}
let mut items = vec![];
let 当前项 = &self.items[self.index];
items.push(当前项);
let index_当前索引 = self.index;
for idx in (0..index_当前索引).rev() {
if count == 0 {
return items;
}
items.push(&self.items[idx]);
count -= 1;
}
if self.count <= LEN {
return items;
}
for idx in ((index_当前索引 + 1)..self.items.len()).rev() {
if count == 0 {
return items;
}
items.push(&self.items[idx]);
count -= 1;
}
items
}
pub fn list_items(&self, 毫秒数: i64) -> Vec<&T> {
if self.count == 0 {
return vec![];
}
let mut items = vec![];
let 微秒数 = if 毫秒数 as i64 >= 0 {
毫秒数 as u64 * a8_micros::MICROS_PER_MILLIS
} else {
0
};
let 当前项 = &self.items[self.index];
items.push(当前项);
let ticks_当前项 = 当前项.time().micros_of_day();
let index_当前索引 = self.index;
for idx in (0..index_当前索引).rev() {
let ticks_往前项 = self.items[idx].time().micros_of_day();
let delta_往前微秒数 = ticks_当前项 - ticks_往前项;
if delta_往前微秒数 > 微秒数 {
break;
}
items.push(&self.items[idx]);
}
if self.count <= LEN {
return items;
}
for idx in ((index_当前索引 + 1)..self.items.len()).rev() {
let ticks_往前项 = self.items[idx].time().micros_of_day();
let delta_往前微秒数 = ticks_当前项 - ticks_往前项;
if delta_往前微秒数 > 微秒数 {
return items;
}
items.push(&self.items[idx]);
}
items
}
}
impl<T: CacheData, const LEN: usize> Default for HighSpeedCache<T, LEN> {
fn default() -> Self {
Self::new()
}
}
impl<T, const LEN: usize> HighSpeedCache<T, LEN>
where
T: CacheData,
{
pub fn len(&self) -> usize {
self.count.min(LEN)
}
pub fn is_empty(&self) -> bool {
self.count == 0
}
pub fn capacity(&self) -> usize {
LEN
}
pub fn get(&self, index: usize) -> Option<&T> {
if index >= self.count {
return None;
}
let actual_index = if self.count <= LEN {
if index <= self.index {
self.index - index
} else {
LEN - (index - self.index)
}
} else {
(self.index + LEN - index) % LEN
};
Some(&self.item.as_ref().items[actual_index])
}
pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
if index >= self.count {
return None;
}
let actual_index = if self.count <= LEN {
if index >= self.count {
return None; }
if index <= self.index {
self.index - index
} else {
LEN - (index - self.index)
}
} else {
(self.index + LEN - index) % LEN
};
Some(&mut self.item_mut().items[actual_index])
}
pub fn iter(&self) -> HighSpeedCacheIter<T, LEN> {
HighSpeedCacheIter {
cache: self,
current_index: 0,
items_seen: 0,
total_items: self.len(),
}
}
pub fn iter_mut(&mut self) -> HighSpeedCacheIterMut<T, LEN> {
let total = self.len();
HighSpeedCacheIterMut {
cache: self,
current_index: 0,
items_seen: 0,
total_items: total,
}
}
pub fn to_vec(&self) -> Vec<T>
where
T: Clone,
{
self.iter().cloned().collect()
}
}
impl<'a, T, const LEN: usize> IntoIterator for &'a HighSpeedCache<T, LEN>
where
T: CacheData,
{
type Item = &'a T;
type IntoIter = HighSpeedCacheIter<'a, T, LEN>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<'a, T, const LEN: usize> IntoIterator for &'a mut HighSpeedCache<T, LEN>
where
T: CacheData,
{
type Item = &'a mut T;
type IntoIter = HighSpeedCacheIterMut<'a, T, LEN>;
fn into_iter(self) -> Self::IntoIter {
self.iter_mut()
}
}
impl<T, const LEN: usize> Index<usize> for HighSpeedCache<T, LEN>
where
T: CacheData,
{
type Output = T;
fn index(&self, index: usize) -> &Self::Output {
self.get(index).expect("索引超出范围")
}
}
impl<T, const LEN: usize> IndexMut<usize> for HighSpeedCache<T, LEN>
where
T: CacheData,
{
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
self.get_mut(index).expect("索引超出范围")
}
}
impl<T, const LEN: usize> IntoIterator for HighSpeedCache<T, LEN>
where
T: CacheData + Clone,
{
type Item = T;
type IntoIter = HighSpeedCacheIntoIter<T, LEN>;
fn into_iter(self) -> Self::IntoIter {
let total = self.len();
HighSpeedCacheIntoIter {
cache: self,
current_index: 0,
items_seen: 0,
total_items: total,
}
}
}
#[cfg(test)]
mod test_高频数据 {
use chrono::NaiveTime;
use crate::fasttime::b2_time::TimeExt;
use super::{CacheData, HighSpeedCache};
#[derive(Debug, Default, Clone, PartialEq, Eq)]
struct Demo_高频数据 {
pub time_发生时间: NaiveTime,
pub time_接收时间: NaiveTime,
pub val: i32,
}
impl CacheData for Demo_高频数据 {
fn time(&self) -> NaiveTime {
self.time_发生时间
}
}
#[test]
fn test_demo_高频数据() {
let HighSpeedCache = HighSpeedCache::<Demo_高频数据, 1000>::new();
let mut micros = NaiveTime::from_hmsi_friendly_unsafe(93000_000).micros_of_day();
for val in 1..1000 {
let time_发生时间 = NaiveTime::from_micros_day_unsafe(micros);
micros += 100;
HighSpeedCache.push(Demo_高频数据 {
time_发生时间,
time_接收时间: time_发生时间,
val,
});
_ = HighSpeedCache.find_找之前的项(30_000, false);
}
}
#[test]
fn test_高频数据_迭代器() {
let cache_empty = HighSpeedCache::<Demo_高频数据, 10>::new();
assert_eq!(cache_empty.len(), 0);
assert!(cache_empty.is_empty());
assert_eq!(cache_empty.capacity(), 10);
let mut iter_count = 0;
for _ in &cache_empty {
iter_count += 1;
}
assert_eq!(iter_count, 0, "空缓存不应该有任何元素可迭代");
assert_eq!(cache_empty.get(0), None, "空缓存的get应返回None");
let cache_partial = HighSpeedCache::<Demo_高频数据, 10>::new();
let base_micros = NaiveTime::from_hmsi_friendly_unsafe(93000_000).micros_of_day();
for val in 1..6 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache_partial.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
assert_eq!(cache_partial.len(), 5);
assert!(!cache_partial.is_empty());
let items: Vec<i32> = cache_partial.iter().map(|item| item.val).collect();
assert_eq!(items, vec![5, 4, 3, 2, 1]);
let items_rev: Vec<i32> = cache_partial.iter().rev().map(|item| item.val).collect();
assert_eq!(items_rev, vec![1, 2, 3, 4, 5]);
assert_eq!(cache_partial.get(0).map(|item| item.val), Some(5)); assert_eq!(cache_partial.get(4).map(|item| item.val), Some(1)); assert_eq!(cache_partial.get(5), None);
assert_eq!(cache_partial[0].val, 5);
assert_eq!(cache_partial[4].val, 1);
let cache_full = HighSpeedCache::<Demo_高频数据, 3>::new();
for val in 1..6 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache_full.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
assert_eq!(cache_full.len(), 3);
assert_eq!(cache_full.count, 5);
let items_full: Vec<i32> = cache_full.iter().map(|item| item.val).collect();
assert_eq!(items_full, vec![5, 4, 3]);
let cache_with_cap = HighSpeedCache::<Demo_高频数据, 5>::with_capacity(100);
assert_eq!(cache_with_cap.capacity(), 5);
let vec_items = cache_full.to_vec();
assert_eq!(vec_items.len(), 3);
assert_eq!(vec_items[0].val, 5);
assert_eq!(vec_items[2].val, 3);
let cache_consume = HighSpeedCache::<Demo_高频数据, 3>::new();
for val in 1..4 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache_consume.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
let consumed: Vec<Demo_高频数据> = cache_consume.into_iter().collect();
assert_eq!(consumed.len(), 3);
assert_eq!(consumed[0].val, 3); assert_eq!(consumed[2].val, 1);
let mut cache_mut = HighSpeedCache::<Demo_高频数据, 3>::new();
for val in 1..4 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache_mut.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
cache_mut[0].val = 100;
assert_eq!(cache_mut[0].val, 100);
let cache_exact = HighSpeedCache::<Demo_高频数据, 5>::new();
for val in 1..4 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache_exact.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
let iter = cache_exact.iter();
assert_eq!(iter.len(), 3);
let mut iter2 = cache_exact.iter();
iter2.next(); assert_eq!(iter2.len(), 2); }
#[test]
fn test_索引器_异常处理() {
{
let cache = HighSpeedCache::<Demo_高频数据, 5>::new();
assert_eq!(cache.len(), 0);
assert!(cache.is_empty());
assert_eq!(cache.get(0), None);
}
let base_micros = NaiveTime::from_hmsi_friendly_unsafe(93000_000).micros_of_day();
let cache_with_data = HighSpeedCache::<Demo_高频数据, 5>::new();
for val in 1..4 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache_with_data.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
assert_eq!(cache_with_data.get(0).map(|item| item.val), Some(3));
assert_eq!(cache_with_data.get(1).map(|item| item.val), Some(2));
assert_eq!(cache_with_data.get(2).map(|item| item.val), Some(1));
assert_eq!(cache_with_data.get(3), None, "超范围索引应该返回 None");
assert_eq!(cache_with_data.get(100), None, "远超范围索引应该返回 None");
}
#[test]
fn test_iter_mut() {
let base_micros = NaiveTime::from_hmsi_friendly_unsafe(93000_000).micros_of_day();
let mut cache = HighSpeedCache::<Demo_高频数据, 5>::new();
for val in 1..6 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
for item in cache.iter_mut() {
let val = &mut item.val;
*val *= 10; }
let values: Vec<i32> = cache.iter().map(|item| item.val).collect();
assert_eq!(values, vec![50, 40, 30, 20, 10]);
let mut iter = cache.iter_mut();
if let Some(item) = iter.next() {
item.val = 100; }
if let Some(item) = iter.next() {
item.val = 200; }
assert_eq!(cache[0].val, 100); assert_eq!(cache[1].val, 200); assert_eq!(cache[2].val, 30);
let mut iter_mut = cache.iter_mut();
assert_eq!(iter_mut.len(), 5);
iter_mut.next();
assert_eq!(iter_mut.len(), 4);
iter_mut.next();
assert_eq!(iter_mut.len(), 3);
}
#[test]
fn test_iter_rev() {
let base_micros = NaiveTime::from_hmsi_friendly_unsafe(93000_000).micros_of_day();
let cache = HighSpeedCache::<Demo_高频数据, 5>::new();
for val in 1..6 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
let values: Vec<i32> = cache.iter().rev().map(|item| item.val).collect();
assert_eq!(values, vec![1, 2, 3, 4, 5]);
let mut cache_mut = HighSpeedCache::<Demo_高频数据, 5>::new();
for val in 1..6 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache_mut.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
for item in cache_mut.iter_mut().rev() {
let val = &mut item.val;
*val *= 10; }
let values: Vec<i32> = cache_mut.iter().map(|item| item.val).collect();
assert_eq!(values, vec![50, 40, 30, 20, 10]);
let mut cache2 = HighSpeedCache::<Demo_高频数据, 3>::new();
for val in 1..4 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
cache2.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
});
}
for item in &mut cache2 {
item.val += 100;
}
assert_eq!(cache2[0].val, 103); assert_eq!(cache2[1].val, 102); assert_eq!(cache2[2].val, 101); }
#[test]
fn test_完整迭代器行为() {
let base_micros = NaiveTime::from_hmsi_friendly_unsafe(93000_000).micros_of_day();
let mut cache = HighSpeedCache::<Demo_高频数据, 10>::new();
let mut original_values = Vec::new();
for val in 1..11 {
let time = NaiveTime::from_micros_day_unsafe(base_micros + (val as u64 * 100));
let item = Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val,
};
original_values.push(item.clone());
cache.push(item);
}
assert_eq!(cache.capacity(), 10);
assert_eq!(cache.len(), 10);
assert!(!cache.is_empty());
let mut iter_values = Vec::new();
for item in &cache {
iter_values.push(item.val);
}
assert_eq!(iter_values, vec![10, 9, 8, 7, 6, 5, 4, 3, 2, 1]);
let mut rev_iter_values = Vec::new();
for item in cache.iter().rev() {
rev_iter_values.push(item.val);
}
assert_eq!(rev_iter_values, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
let mut modified_values = Vec::new();
for item in cache.iter_mut() {
item.val *= 2; modified_values.push(item.val);
}
assert_eq!(modified_values, vec![20, 18, 16, 14, 12, 10, 8, 6, 4, 2]);
let mut rev_modified_values = Vec::new();
for item in cache.iter_mut().rev() {
item.val += 5; rev_modified_values.push(item.val);
}
assert_eq!(rev_modified_values, vec![25, 23, 21, 19, 17, 15, 13, 11, 9, 7]);
for i in 0..cache.len() {
assert_eq!(cache[i].val, 25 - i as i32 * 2);
}
assert!(cache.get(cache.len()).is_none());
assert!(cache.get(100).is_none());
let new_val = 100;
let time = NaiveTime::from_micros_day_unsafe(base_micros + (new_val as u64 * 100));
cache.push(Demo_高频数据 {
time_发生时间: time,
time_接收时间: time,
val: new_val,
});
assert_eq!(cache[0].val, new_val);
let values: Vec<i32> = cache.iter().map(|item| item.val).collect();
assert_eq!(values.len(), 10); assert_eq!(values[0], new_val); assert_eq!(values[9], 9);
let mut iter = cache.iter();
assert_eq!(iter.len(), 10);
iter.next();
assert_eq!(iter.len(), 9);
let empty_cache = HighSpeedCache::<Demo_高频数据, 5>::new();
assert_eq!(empty_cache.len(), 0);
assert!(empty_cache.is_empty());
assert_eq!(empty_cache.iter().count(), 0);
assert_eq!(empty_cache.iter().rev().count(), 0);
}
}