Skip to main content

field_collex/
collex.rs

1pub mod iter;
2pub mod serialize;
3
4use span_core::Span;
5use std::mem;
6use std::ops::Range;
7use std::vec::Vec;
8use thiserror::Error;
9use crate::*;
10
11fn dist_cmp<T: FieldValue>(target:T, a:T, b:T) -> std::cmp::Ordering {
12    let dist_a = if a > target { a - target } else { target - a };
13    let dist_b = if b > target { b - target } else { target - b };
14    dist_a.cmp(&dist_b)
15}
16
17type FieldIn<E,V> = Field<E,FieldCollex<E,V>>;
18type CollexField<E,V> = RawField<Field<E,FieldCollex<E,V>>>;
19
20pub(crate) type NewResult<T,V> = Result<T, NewFieldCollexError<V>>;
21
22#[derive(Error, Debug)]
23pub enum NewFieldCollexError<V>{
24    #[error("提供的 span 为空(大小为0)")]
25    EmptySpan(Span<V>, V),
26    #[error("提供的 unit 为0")]
27    NonPositiveUnit(Span<V>, V),
28}
29
30impl<V> NewFieldCollexError<V>{
31    pub fn unwrap(self) -> (Span<V>, V) {
32        match self {
33            Self::NonPositiveUnit(span, unit)
34            | Self::EmptySpan(span, unit)
35            => (span, unit)
36        }
37    }
38}
39
40
41pub(crate) type WithCapacityResult<T,V> = Result<T, WithCapacityFieldCollexError<V>>;
42
43#[derive(Error, Debug)]
44pub enum WithCapacityFieldCollexError<V>{
45    #[error("提供的 span 为空(大小为0)")]
46    EmptySpan(Span<V>, V),
47    #[error("提供的 unit <= 0")]
48    NonPositiveUnit(Span<V>, V),
49    #[error("提供的 capacity 超过最大块数量")]
50    OutOfSize(Span<V>, V),
51}
52
53impl<V> From<WithCapacityFieldCollexError<V>> for WithElementsFieldCollexError<V> {
54    fn from(value: WithCapacityFieldCollexError<V>) -> Self {
55        match value {
56            WithCapacityFieldCollexError::EmptySpan(s, u) => {Self::EmptySpan(s,u)}
57            WithCapacityFieldCollexError::NonPositiveUnit(s, u) => {Self::NonPositiveUnit(s,u)}
58            WithCapacityFieldCollexError::OutOfSize(..) => {unreachable!()}
59        }
60    }
61}
62
63impl<V> From<NewFieldCollexError<V>> for WithElementsFieldCollexError<V> {
64    fn from(value: NewFieldCollexError<V>) -> Self {
65        match value {
66            NewFieldCollexError::EmptySpan(s, u) => {Self::EmptySpan(s,u)}
67            NewFieldCollexError::NonPositiveUnit(s, u) => {Self::NonPositiveUnit(s,u)}
68        }
69    }
70}
71
72pub(crate) type WithElementsResult<T,V> = Result<T, WithElementsFieldCollexError<V>>;
73
74#[derive(Error, Debug)]
75pub enum WithElementsFieldCollexError<V>{
76    #[error("提供的 span 为空(大小为0)")]
77    EmptySpan(Span<V>, V),
78    #[error("提供的 unit <= 0")]
79    NonPositiveUnit(Span<V>, V),
80}
81
82impl<V> WithCapacityFieldCollexError<V>{
83    pub fn unwrap(self) -> (Span<V>, V) {
84        match self {
85            Self::NonPositiveUnit(span, unit)
86            | Self::EmptySpan(span, unit)
87            | Self::OutOfSize(span, unit)
88            => (span, unit)
89        }
90    }
91}
92
93
94pub(crate) type GetIndexResult<T> = Result<T, GetIndexFieldCollexError>;
95
96#[derive(Error, Debug)]
97pub enum GetIndexFieldCollexError {
98    #[error("目标值超出了当前FieldCollex的span范围")]
99    OutOfSpan,
100    #[error("当前无数据可查询")]
101    Empty,
102}
103
104macro_rules! impl_from_get_index_err {
105    ($err: ident) => {
106        impl From<GetIndexFieldCollexError> for $err{
107            fn from(value: GetIndexFieldCollexError) -> Self {
108                match value {
109                    GetIndexFieldCollexError::OutOfSpan => {Self::OutOfSpan}
110                    GetIndexFieldCollexError::Empty => {Self::Empty}
111                }
112            }
113        }
114    };
115    ($err: ident, $empty: ident) => {
116        impl From<GetIndexFieldCollexError> for $err{
117            fn from(value: GetIndexFieldCollexError) -> Self {
118                match value {
119                    GetIndexFieldCollexError::OutOfSpan => {Self::OutOfSpan}
120                    GetIndexFieldCollexError::Empty => {Self::$empty}
121                }
122            }
123        }
124    };
125}
126
127impl_from_get_index_err!(RemoveFieldCollexError, NotExist);
128
129pub(crate) type RemoveResult<T> = Result<T, RemoveFieldCollexError>;
130
131#[derive(Error, Debug)]
132pub enum RemoveFieldCollexError {
133    #[error("目标值超出了当前FieldCollex的span范围")]
134    OutOfSpan,
135    #[error("无匹配的数据")]
136    NotExist,
137}
138
139
140pub(crate) type InsertResult<E> = Result<(), InsertFieldCollexError<E>>;
141#[derive(Error, Debug)]
142pub enum InsertFieldCollexError<E> {
143    #[error("提供值超出了当前FieldCollex的span范围")]
144    OutOfSpan(E),
145    #[error("已存在此元素")]
146    AlreadyExist(E)
147}
148
149impl<E> InsertFieldCollexError<E> {
150    pub fn unwrap(self) -> E {
151        match self {
152            Self::AlreadyExist(e) => e,
153            Self::OutOfSpan(e) => e,
154        }
155    }
156    
157    pub fn map<F,N>(self, f: F) -> InsertFieldCollexError<N>
158    where
159        F: FnOnce(E) -> N
160    {
161        use InsertFieldCollexError::*;
162        match self {
163            AlreadyExist(e) => AlreadyExist(f(e)),
164            OutOfSpan(e) => OutOfSpan(f(e)),
165        }
166    }
167}
168
169
170#[derive(Debug)]
171pub struct TryExtendResult<V> {
172    pub out_of_span: Vec<V>,
173    pub already_exist: Vec<V>
174}
175
176pub(crate) type ModifyResult<R,T> = Result<R,ModifyFieldCollexError<T>>;
177#[derive(Error)]
178#[derive(Debug)]
179pub enum ModifyFieldCollexError<T> {
180    #[error("找不到对应元素")]
181    CannotFind,
182    #[error("刷新元素位置失败")]
183    InsertError(InsertFieldCollexError<T>),
184}
185
186impl<T> ModifyFieldCollexError<T> {
187    pub fn map<F,N>(self, f: F) -> ModifyFieldCollexError<N>
188    where
189        F: FnOnce(T) -> N
190    {
191        use ModifyFieldCollexError::*;
192        match self {
193            CannotFind => CannotFind,
194            InsertError(err) => InsertError(err.map(f)),
195        }
196    }
197}
198
199pub trait Collexetable<V> {
200    fn collexate(&self) -> V;
201    fn collexate_ref(&self) -> &V;
202    fn collexate_mut(&mut self) -> &mut V;
203    
204    fn collex_cmp<O>(&self, other: &O) -> std::cmp::Ordering
205    where
206        O: Collexetable<V>,
207        V: Ord
208    {
209        self.collexate_ref().cmp(other.collexate_ref())
210    }
211    
212    fn collex_eq<O>(&self, other: &O) -> bool
213    where
214        O: Collexetable<V>,
215        V: Eq
216    {
217        self.collexate_ref().eq(other.collexate_ref())
218    }
219    
220    fn collex_mut_eq<O>(&mut self, other: &mut O) -> bool
221    where
222        O: Collexetable<V>,
223        V: Eq
224    {
225        self.collexate_ref().eq(other.collexate_ref())
226    }
227}
228
229/// 每个块可以存多个内容(通过递归结构实现)
230/// 非空块可为单个元素或一个FieldCollex,以[`Field`]类型存储。
231///
232/// 实际存入E,计算时通过Collexetable<V>中的方法得到V,剩余与FieldSet完全一致
233#[derive(Debug)]
234pub struct FieldCollex<E,V>
235where
236    E: Collexetable<V>,
237    V: FieldValue,
238{
239    pub(crate) span: Span<V>,
240    pub(crate) unit: V,
241    pub(crate) items: Vec<CollexField<E,V>>,
242}
243
244impl<E,V> FieldCollex<E,V>
245where
246    E: Collexetable<V>,
247    V: FieldValue
248{
249    const SUB_FACTOR: usize = 64;
250    /// 提供span与unit,构建一个FieldCollex
251    ///
252    /// span为Key的范围,unit为每个块的大小,同时也是每个块之间的间隔
253    ///
254    /// 若unit为0 或 span为空,通过返回Err返还提供的数据
255    pub fn new(span: Span<V>, unit: V) -> NewResult<Self,V> {
256        use NewFieldCollexError::*;
257        
258        if unit <= V::zero() {
259            Err(NonPositiveUnit(span, unit))
260        } else if span.is_empty() {
261            Err(EmptySpan(span, unit))
262        } else {
263            Ok(Self {
264                span,
265                unit,
266                items: Vec::new()
267            })
268        }
269    }
270    
271    /// 提供span与unit,构建一个FieldCollex
272    ///
273    /// span为Key的范围,unit为每个块的大小,同时也是每个块之间的间隔
274    ///
275    /// 若unit为0、span为空、capacity大于最大块数量,通过返回Err返还提供的数据
276    pub fn with_capacity(span: Span<V>, unit: V, capacity: usize) -> WithCapacityResult<Self,V> {
277        use WithCapacityFieldCollexError::*;
278        if unit <= V::zero() {
279            Err(NonPositiveUnit(span, unit))
280        } else if span.is_empty() {
281            Err(EmptySpan(span, unit))
282        } else if match span.size(){
283            Ok(Some(size)) => {
284                capacity > (size / unit).ceil().into_usize()
285            },
286            Ok(None) => {false}
287            // is_empty为真时,永远不可能出现Err,因为它绝对有长度
288            _ => unreachable!()
289        } {
290            Err(OutOfSize(span, unit))
291        } else {
292            Ok(Self {
293                span,
294                unit,
295                items: Vec::with_capacity(capacity),
296            })
297        }
298    }
299    
300    /// 根据Vec快速构造FieldCollex,忽略非法值
301    pub fn with_elements(span: Span<V>, unit: V, mut other: Vec<E>) -> WithElementsResult<Self,V> {
302        other.sort_by(Collexetable::collex_cmp);
303        other.dedup_by(Collexetable::collex_mut_eq);
304        
305        let mut new = Self::new(span, unit)?;
306        // 第一个非法值的索引
307        let first_oob_idx = other.iter().enumerate().rev().try_for_each(
308            |(idx,e)|
309                if new.span.contains(e.collexate_ref()) {
310                    Err(idx+1)
311                } else {
312                    Ok(())
313                }
314        ).err().unwrap_or(0);
315        let vec = &other[0..first_oob_idx];
316        if vec.len()==0 {
317            // do nothing
318        } else if vec.len()==1 {
319            let _ = new.insert(other.into_iter().next().unwrap());
320        } else {
321            let cap = new.idx_of(vec[first_oob_idx-1].collexate_ref()) + 1;
322            // 预分配
323            let items = &mut new.items;
324            items.reserve(cap);
325            
326            // 提前插入第一个的内容
327            let mut last_idx = index_of!(new,vec[0].collexate_ref());
328            // 存在前置空块(自己为起点(==0)就是不存在)
329            if last_idx != 0 {
330                items.resize(last_idx ,RawField::Next(last_idx));
331            }
332            let _ = other.split_off(first_oob_idx);
333            let mut vec = other.into_iter();
334            items.push(RawField::Thing((last_idx,Field::Elem(vec.next().unwrap()))));
335            
336            // 遍历插入。0在上面
337            for elem in vec {
338                // 与上一个完全相同的情况不存在,已经用了dedup。
339                
340                let this_idx = index_of!(new,elem.collexate_ref());
341                // 若此与上一个处于同一个区间,转为Collex
342                if this_idx == last_idx {
343                    // 确保至少存在一个元素。见上
344                    match items[this_idx]
345                        // 有序集合顺序push导致idx相同时最后一个必定是上一个插入的Thing
346                        .as_thing_mut().1
347                    {
348                        Field::Elem(_) => {
349                            let span = Span::Finite({
350                                let start = *new.span.start() + new.unit * V::from_usize(this_idx);
351                                start..start + new.unit
352                            });
353                            let mut unit = new.unit/V::from_usize(Self::SUB_FACTOR);
354                            if unit.is_zero() {
355                                unit = V::min_positive();
356                            }
357                            let collex =
358                                FieldCollex::with_capacity(
359                                    span,
360                                    unit,
361                                    2
362                                ).unwrap_or_else(|err|
363                                    panic!("Called `FieldCollex::with_capacity` in `FieldCollex::with_elements` to make a new sub FieldSet, but get a error {err}")
364                                );
365                            
366                            let old =
367                                match mem::replace(&mut items[this_idx], RawField::Thing((this_idx ,Field::Collex(collex)))).unwrap() {
368                                    Field::Elem(e) => e,
369                                    Field::Collex(_) => unreachable!(),
370                                };
371                            let collex =
372                                match items[this_idx]
373                                    .as_thing_mut().1 {
374                                    Field::Elem(_) => unreachable!(),
375                                    Field::Collex(collex) => collex,
376                                };
377                            // TODO:改掉这个insert
378                            if let Err(_) = collex.insert(old) {
379                                panic!("Called `FieldCollex::insert` in `FieldCollex::with_elements` but get an unexpected error");
380                            }
381                            if let Err(_) = collex.insert(elem) {
382                                panic!("Called `FieldCollex::insert` in `FieldCollex::with_elements` but get an unexpected error");
383                            }
384                        }
385                        Field::Collex(collex) => {
386                            // TODO:改掉这个insert
387                            if let Err(_) = collex.insert(elem) {
388                                panic!("Called `FieldCollex::insert` in `FieldCollex::with_elements` but get an unexpected error");
389                            }
390                        }
391                    };
392                } else { // 与上一个处于不同区间,先填充Among再push自己
393                    items.resize(this_idx, RawField::Among(last_idx, this_idx));
394                    items.push(RawField::Thing((this_idx, Field::Elem(elem))))
395                }
396                last_idx = this_idx;
397            }
398        }
399        Ok(new)
400    }
401    
402    pub fn span(&self) -> &Span<V> {
403        &self.span
404    }
405    
406    pub fn unit(&self) -> &V {
407        &self.unit
408    }
409    
410    /// 返回最大块数量
411    ///
412    /// 若Span是无限区间,返回None
413    pub fn size(&self) -> Option<usize> {
414        // 确保在创建时就不可能为空区间。详见那些构造函数
415        match self.span.size(){
416            Ok(Some(size)) => Some((size / self.unit).ceil().into_usize()),
417            _ => None
418        }
419    }
420    
421    /// 返回已存在的块的数量
422    ///
423    /// 此值应小于等于最大块数量
424    #[inline(always)]
425    pub fn len(&self) -> usize {
426        self.items.len()
427    }
428    
429    /// Returns the total number of elements the inner vector can hold without reallocating.
430    ///
431    /// 此值应小于等于最大块数量
432    pub fn capacity(&self) -> usize {
433        self.items.capacity()
434    }
435    
436    /// 判断对应块是非空
437    pub(crate) fn is_thing(&self, idx: usize) -> bool {
438        if idx < self.items.len() {
439            matches!(self.items[idx], RawField::Thing(_))
440        } else { false }
441    }
442    
443    /// 计算指定值对应的块索引
444    ///
445    /// 此无任何前置检查,只会机械地返回目标相对于初始位置(区间的左端点)可能处于第几个块,但不确保这个块是否合法。<br>
446    /// 包含前置检查的版本是[`get_index`]
447    #[inline(always)]
448    pub(crate) fn idx_of(&self, target: &V) -> usize {
449        target.sub(*self.span.start()).div(self.unit).into_usize()
450    }
451    
452    /// 将内部Vec大小扩大到 idx+1
453    ///
454    /// 自动填充后继元素
455    ///
456    /// 返回值意味着是否进行了大小修改: <br>
457    /// 当前大小已达标时,没有进行大小修改,返回false
458    pub(crate) fn expand_to_idx(&mut self, idx: usize) -> bool {
459        let filler = match self.items.last() {
460            None =>
461                RawField::Void,
462            Some(last) => {
463                if let RawField::Thing(t) = last {
464                    RawField::prev_from(t)
465                } else {
466                    // 上面确保不是thing
467                    last.clone()
468                }
469            }
470        };
471        self.expand_to(idx + 1, filler)
472    }
473    
474    /// 将内部Vec大小扩大到 new_size
475    ///
476    /// 返回值意味着是否进行了大小修改: <br>
477    /// 当前大小已达标时,没有进行大小修改,返回false
478    pub(crate) fn expand_to_with(&mut self, new_size: usize, maker: impl Fn() -> CollexField<E,V>) -> bool {
479        if self.items.len() < new_size {
480            self.items.resize_with(new_size, maker);
481            true
482        } else { false }
483    }
484    
485    pub(crate) fn expand_to(&mut self, new_size: usize, filler: CollexField<E,V>) -> bool {
486        if self.items.len() < new_size {
487            self.items.resize(new_size, filler);
488            true
489        } else { false }
490    }
491    
492    #[inline(always)]
493    #[must_use]
494    pub(crate) fn contains_idx(&self, idx: usize) -> bool {
495        idx < self.items.len()
496    }
497    
498    /// 查找对应是否存在与其collexate()值相同的元素
499    ///
500    pub fn contains(&self, elem: &E) -> bool {
501        let idx = self.idx_of(elem.collexate_ref());
502        if self.contains_idx(idx) {
503            match &self.items[idx] {
504                RawField::Thing((_, k)) =>
505                    match k {
506                        Field::Elem(e) => { elem.collex_eq(e) }
507                        Field::Collex(collex) => { collex.contains(elem) }
508                    }
509                _ => false
510            }
511        } else { false }
512    }
513    
514    /// 查找对应值是否存在
515    ///
516    pub fn contains_value(&self, value: V) -> bool {
517        let idx = self.idx_of(&value);
518        if self.contains_idx(idx) {
519            match &self.items[idx] {
520                RawField::Thing((_, k)) =>
521                    match k {
522                        Field::Elem(e) => { value.eq(e.collexate_ref())}
523                        Field::Collex(collex) => { collex.contains_value(value) }
524                    }
525                _ => false
526            }
527        } else { false }
528    }
529    
530    /// 通过索引返回块引用
531    ///
532    /// 索引对应块是非空则返回Some,带边界检查,越界视为None
533    pub(crate) fn get_field(&self, idx: usize) -> Option<&FieldIn<E, V>> {
534        if idx < self.items.len() {
535            match self.items[idx] {
536                RawField::Thing(ref v) => Some(&v.1),
537                _ => None
538            }
539        } else { None }
540    }
541    
542    
543    /// 通过索引得到当前或上一个非空块的(索引,块引用)
544    ///
545    /// 若块不为空,返回自己 <br>
546    /// 若块为空且有前一个非空块,返回该块 <br>
547    /// 若块为空且没有前一个非空块,返回None <br>
548    /// 提供的索引大于最后一个块,相当于最后一个块 <br>
549    pub(crate) fn get_prev_field(&self, idx: usize) -> Option<(usize,&FieldIn<E, V>)> {
550        Some(self.items[self.get_prev_index(idx)?].as_thing())
551    }
552    
553    /// 通过索引得到当前或下一个非空块的(索引,块引用)
554    ///
555    /// 若块不为空,返回自己 <br>
556    /// 若块为空且有后一个非空块,返回该块 <br>
557    /// 若块为空且没有后一个非空块,返回None <br>
558    /// 提供的索引大于最后一个块,返回None <br>
559    pub(crate) fn get_next_field(&self,idx: usize) -> Option<(usize,&FieldIn<E, V>)> {
560        Some(self.items[self.get_next_index(idx)?].as_thing())
561    }
562    
563    
564    /// 通过索引得到当前或上一个非空块的索引
565    ///
566    /// 若块不为空,返回自己 <br>
567    /// 若块为空且有前一个非空块,返回该块 <br>
568    /// 若块为空且没有前一个非空块,返回None <br>
569    /// 提供的索引大于最后一个块,相当于最后一个块 <br>
570    pub(crate) fn get_prev_index(&self, idx: usize) -> Option<usize> {
571        if idx < self.items.len() {
572            self.items[idx].thing_prev()
573        } else {
574            self.items.last()?.thing_prev()
575        }
576        
577    }
578    
579    /// 通过索引得到当前或下一个非空块的索引
580    ///
581    /// 若块不为空,返回自己 <br>
582    /// 若块为空且有后一个非空块,返回该块 <br>
583    /// 若块为空且没有后一个非空块,返回None <br>
584    /// 提供的索引大于最后一个块,返回None <br>
585    pub(crate) fn get_next_index(&self,idx: usize) -> Option<usize> {
586        if idx < self.items.len() {
587            self.items[idx].thing_next()
588        } else { None }
589    }
590    
591    
592    /// 找到第一个值的引用
593    pub fn first(&self) -> Option<&E> {
594        Some(self.first_field()?.1.first())
595    }
596    
597    /// 找最后一个值的引用
598    pub fn last(&self) -> Option<&E> {
599        Some(self.last_field()?.1.last())
600    }
601    
602    
603    /// 找到第一个非空块的(键,块引用)
604    pub(crate) fn first_field(&self) -> Option<(usize,&FieldIn<E, V>)> {
605        Some(self.items[self.first_index()?].as_thing())
606    }
607    
608    /// 找到最后一个非空块的(键,块引用)
609    pub(crate) fn last_field(&self) -> Option<(usize,&FieldIn<E, V>)> {
610        Some(self.items[self.last_index()?].as_thing())
611    }
612    
613    
614    /// 找到第一个非空块的索引
615    pub(crate) fn first_index(&self) -> Option<usize> {
616        let first = self.items.first()?;
617        first.thing_next()
618    }
619    
620    /// 找到最后一个非空块的索引
621    pub(crate) fn last_index(&self) -> Option<usize> {
622        self.items.last()?.thing_prev()
623    }
624    
625    /// target是否可置入idx
626    pub(crate) fn is_in_index(&self, idx: usize, target: &V) -> bool {
627        self.index_range(idx).contains(target)
628    }
629    
630    /// idx块的范围
631    pub(crate) fn index_range(&self, idx: usize) -> Range<V> {
632        let start = *self.span.start() + self.unit * V::from_usize(idx);
633        start..start + self.unit
634    }
635    
636    /// 批量插入元素,忽略错误值。
637    pub fn extend(&mut self, mut vec: Vec<E>) {
638        vec.sort_by(Collexetable::collex_cmp);
639        // 逐个插入
640        
641        for v in vec {
642            match self.insert(v) {
643                Err(err) => {
644                    match err {
645                        InsertFieldCollexError::OutOfSpan(_) => {
646                            break;
647                        }
648                        InsertFieldCollexError::AlreadyExist(_) => {}
649                    }
650                }
651                _ => {}
652            }
653        }
654    }
655    
656    /// 批量插入元素,返回插入的情况。
657    pub fn try_extend(&mut self, mut vec: Vec<E>) -> TryExtendResult<E> {
658        vec.sort_by(Collexetable::collex_cmp);
659        // 逐个检查并插入
660        
661        let mut out_of_span: Vec<E> = Vec::new();
662        let mut already_exist = Vec::new();
663        let mut vec = vec.into_iter();
664        while let Some(v) = vec.next() {
665            match self.insert(v) {
666                Ok(_) => {
667                }
668                Err(err) => {
669                    match err {
670                        InsertFieldCollexError::OutOfSpan(e) => {
671                            out_of_span.push(e);
672                            out_of_span.extend(vec);
673                            break;
674                        }
675                        InsertFieldCollexError::AlreadyExist(e) => {
676                            already_exist.push(e);
677                        }
678                    }
679                }
680            }
681        }
682        TryExtendResult {
683            out_of_span, already_exist
684        }
685    }
686    
687    pub(crate) fn insert_in_ib(&mut self, idx: usize, value: E) -> (bool, InsertResult<E>) {
688        use InsertFieldCollexError::*;
689        let items = &mut self.items;
690        
691        let mut need_fill = false;
692        // 插入处
693            match &items[idx] {
694                RawField::Thing(t) => {
695                    match &t.1 {
696                        Field::Elem(e) => {
697                            if e.collex_eq(&value){
698                                return (false,Err(AlreadyExist(value)));
699                            }
700                            let span = Span::Finite({
701                                let start = *self.span.start() + self.unit * V::from_usize(idx);
702                                start..start + self.unit
703                            });
704                            let mut unit = self.unit/V::from_usize(Self::SUB_FACTOR);
705                            if unit.is_zero() {
706                                unit = V::min_positive();
707                            }
708                            let collex =
709                                FieldCollex::with_capacity(
710                                    span,
711                                    unit,
712                                    2
713                                ).unwrap_or_else(|err|
714                                    panic!("Called `FieldCollex::with_capacity` in `FieldCollex::insert_in_ib` to make a new sub FieldSet, but get a error {err}")
715                                );
716                            let old =
717                                match mem::replace(&mut items[idx], RawField::Thing((idx ,Field::Collex(collex)))).unwrap() {
718                                    Field::Elem(e) => e,
719                                    Field::Collex(_) => unreachable!(),
720                                };
721                            let collex =
722                                match items[idx]
723                                    .as_thing_mut().1 {
724                                    Field::Elem(_) => unreachable!(),
725                                    Field::Collex(collex) => collex,
726                                };
727                            // 此处不用传递,因为二者都必然插入成功:属于span且不相等
728                            if let Err(_) = collex.insert(old){
729                                panic!("Called `FieldCollex::insert` in `FieldCollex::insert_in_ib` but get an unexpected error");
730                            }
731                            if let Err(_) = collex.insert(value) {
732                                panic!("Called `FieldCollex::insert` in `FieldCollex::insert_in_ib` but get an unexpected error");
733                            }
734                        }
735                        Field::Collex(_) => {
736                            let old = mem::replace(&mut items[idx], RawField::Void);
737                            match old {
738                                RawField::Thing((_,mut t)) => {
739                                    match t {
740                                        Field::Collex(ref mut collex) => {
741                                            let ans = collex.insert(value);
742                                            match &ans {
743                                                Ok(_) => {}
744                                                Err(_) => {return (false,ans)}
745                                            }
746                                            let _ = mem::replace(
747                                                &mut items[idx],
748                                                RawField::Thing((idx,t))
749                                            );
750                                        }
751                                        _ => unreachable!()
752                                    }
753                                }
754                                _ => unreachable!()
755                            }
756                        }
757                    }
758                }
759                _ => {
760                    need_fill = true;
761                    let _ = mem::replace(
762                        &mut items[idx],
763                        RawField::Thing((idx,Field::Elem(value)))
764                    );
765                }
766            }
767        (need_fill,Ok(()))
768    }
769    
770    pub(crate) fn insert_in_ob(&mut self, idx: usize, value: E) -> InsertResult<E> {
771        let items = &mut self.items;
772        let len = items.len();
773        
774        // 修改未越界部分
775        let prev =
776            if len != 0{
777                match &items[len - 1]{
778                    RawField::Thing(t) => {
779                        debug_assert_eq!(t.0, len-1);
780                        RawField::Among(t.0,idx)
781                    }
782                    _ => {
783                        // 计算前导填充物与填充端点
784                        let (first_idx,prev) = match items[len - 1] {
785                            RawField::Prev(prev) | RawField::Among(prev, _) => (prev+1, RawField::Among(prev, idx)),
786                            RawField::Void => (0,RawField::Next(idx)),
787                            RawField::Next(_) | RawField::Thing(_) => unreachable!()
788                        };
789                        
790                        items[first_idx..len].fill(prev.clone());
791                        prev
792                    }
793                }
794            } else {
795                RawField::Next(idx)
796            }
797            ;
798        
799        // 补充越界部分
800        // reserve expand push
801        let need_cap  = idx + 1 - len;
802        items.reserve(need_cap);
803        items.resize(idx, prev);
804        items.push(RawField::Thing((idx, Field::Elem(value))));
805        Ok(())
806    }
807    
808    /// 插入值
809    ///
810    pub fn insert(&mut self, value: E) -> InsertResult<E> {
811        use InsertFieldCollexError::*;
812        let span = self.span();
813        if !span.contains(value.collexate_ref()) { return Err(OutOfSpan(value)) }
814        
815        let idx = self.idx_of(value.collexate_ref());
816        // 目标索引越界 -> 根据当前最后一个非空块计算前导 -> reserve expand push
817        // 目标索引不越界 -> 填充
818        let len = self.len();
819        // 未越界(这里同时杜绝了len==0的情况)
820        if idx < len {
821            let (need_fill,ans) = self.insert_in_ib(idx, value);
822            if need_fill {
823                let items = &mut self.items;
824                // 当前为Thing时,并不需要修改其他块,因为他们存储的索引正常指向当前位置,不需要修改
825                // 非第一且前一个非Thing
826                if idx != 0 && !matches!(items[idx-1], RawField::Thing(_)) {
827                    // 计算前导填充物与填充端点
828                    let (first_idx, prev) = match items[idx - 1] {
829                        RawField::Prev(prev) | RawField::Among(prev, _) => (prev + 1, RawField::Among(prev, idx)),
830                        RawField::Next(_) | RawField::Void => (0, RawField::Next(idx)),
831                        RawField::Thing(_) => unreachable!()
832                    };
833                    
834                    items[first_idx..idx].fill(prev);
835                }
836                // 非最后且后一个非Thing
837                if idx != len - 1 && !matches!(items[idx+1], RawField::Thing(_)) {
838                    // 计算前导填充物与填充端点
839                    let (last_idx, next) = match items[idx + 1] {
840                        RawField::Next(next) | RawField::Among(_, next) => (next, RawField::Among(idx, next)),
841                        RawField::Prev(_) | RawField::Void => (len, RawField::Prev(idx)),
842                        RawField::Thing(_) => unreachable!()
843                    };
844                    
845                    items[idx+1..last_idx].fill(next);
846                }
847            }
848            ans
849        } else { // 越界
850            self.insert_in_ob(idx, value)
851        }
852    }
853    
854    /// 返回(是否置空当前块,删除的块)
855    pub(crate) fn remove_in(this: &mut Self, idx: usize ) -> (bool, RemoveResult<CollexField<E,V>>) {
856        // 删除的逻辑
857        let len = this.items.len();
858        // 根据上一个元素与下一个元素,生成填充元素
859        let next =
860            if idx == len-1 {
861                None
862            } else {
863                match &this.items[idx + 1] {
864                    RawField::Thing(thing) => Some(thing.0),
865                    RawField::Prev(_)
866                    | RawField::Void => None,
867                    RawField::Among(_, next)
868                    | RawField::Next(next) => Some(*next),
869                }
870            };
871        
872        let prev =
873            if idx == 0 {
874                None
875            } else {
876                match &this.items[idx - 1] {
877                    RawField::Thing(thing) => Some(thing.0),
878                    RawField::Next(_)
879                    | RawField::Void => None,
880                    RawField::Among(prev, _)
881                    | RawField::Prev(prev) => Some(*prev),
882                }
883            };
884        
885        let filler =
886            match next {
887                None =>
888                    match prev {
889                        None => return (true, Ok(mem::replace(&mut this.items[idx], RawField::Void))),
890                        Some(prev) => RawField::Prev(prev),
891                    },
892                Some(next) =>
893                    match prev {
894                        None => RawField::Next(next),
895                        Some(prev) => RawField::Among(prev, next),
896                    },
897            };
898        
899        // 向前更新
900        this.items[0..idx].iter_mut().rev()
901            .take_while(|v| !matches!(v, RawField::Thing(_)) )
902            .for_each(|v| {
903                *v = filler.clone();
904            });
905        
906        // 向后更新
907        this.items[idx+1..len].iter_mut()
908            .take_while(|v| !matches!(v, RawField::Thing(_)) )
909            .for_each(|v| {
910                *v = filler.clone();
911            });
912        
913        // 更新自己
914        let old = mem::replace(&mut this.items[idx], filler);
915        
916        (false, Ok(old))
917    }
918    
919    /// (需要清空,Result(值))
920    pub(crate) fn remove_rec(this: &mut Self, target: V, idx: usize) -> (bool, RemoveResult<E>) {
921        use RemoveFieldCollexError::*;
922        let items = &mut this.items;
923        (false,
924         if let RawField::Thing(ref mut t) = items[idx] {
925             match &mut t.1 {
926                 Field::Elem(e) => {
927                     if target.ne(e.collexate_ref()) {
928                         Err(NotExist)
929                     } else {
930                         let ans = Self::remove_in(this, idx);
931                         return (ans.0, ans.1.map(|cf| cf.unwrap().into_elem()))
932                     }
933                 }
934                 Field::Collex(collex) => {
935                     // 循环直到到最里面那层。
936                     // 用idx_of是因为不可能出现超出span或空的情况
937                     let sub = Self::remove_rec(collex,target,collex.idx_of(&target));
938                     // 错误时 sub.0 是 false,不用额外判断
939                     return if sub.0 {
940                         (Self::remove_in(this, idx).0, sub.1)
941                     } else {sub}
942                 }
943             }
944         } else {
945             Err(NotExist)
946         }
947        )
948    }
949    
950    /// 删除对应值
951    pub fn remove(&mut self, target: V) -> RemoveResult<E> {
952        let idx = self.get_index(&target)
953            .map_err(Into::<RemoveFieldCollexError>::into)?;
954        let ans = Self::remove_rec(self,target,idx);
955        if ans.0 {
956            self.items.clear()
957        }
958        ans.1
959    }
960    
961    pub fn find_gt(&self, target: V) -> Option<&E> {
962        let last_idx = self.len() - 1;
963        self.find_in(
964            target,
965            |idx| idx+1 ,
966            |f| f.thing_or_next(),
967            |f,v| f.last().collexate_ref().gt(v),
968            move |idx| idx == last_idx,
969        )
970    }
971    
972    
973    pub fn find_ge(&self, target: V) -> Option<&E> {
974        let last_idx = self.len() - 1;
975        self.find_in(
976            target,
977            |idx| idx+1 ,
978            |f| f.thing_or_next(),
979            |f,v| f.last().collexate_ref().ge(v),
980            move |idx| idx == last_idx,
981        )
982    }
983    
984    pub fn find_lt(&self, target: V) -> Option<&E> {
985        self.find_in(
986            target,
987            |idx| idx-1 ,
988            |f| f.thing_or_prev(),
989            |f,v| f.first().collexate_ref().lt(v),
990            |idx| idx == 0,
991        )
992    }
993    
994    
995    pub fn find_le(&self, target: V) -> Option<&E> {
996        self.find_in(
997            target,
998            |idx| idx-1 ,
999            |f| f.thing_or_prev(),
1000            |f,v| f.first().collexate_ref().le(v),
1001            |idx| idx == 0,
1002        )
1003    }
1004    
1005    /// 找到最近的大于 target 的值
1006    ///
1007    pub(crate) fn find_in(
1008        &self,
1009        target: V,
1010        next: fn(usize) -> usize,
1011        thing_idx: fn(&CollexField<E, V>) -> Option<Result<usize, usize>>,
1012        cmp: fn(&FieldIn<E, V>, &V) -> bool,
1013        is_edge: impl Fn(usize) -> bool,
1014    ) -> Option<&E> {
1015        let t_idx =
1016            if self.span().start().ge(&target) {
1017                0
1018            } else if self.span().end().map(|v|v.le(&target)).unwrap_or(false) {
1019                self.len()-1
1020            } else {
1021                self.get_index(&target).ok()?
1022            };
1023        // 上面get_index内已经判空。
1024        // 结果落在t位 -> t位的最大值(大于)t -> t位已经足够,进入t位
1025        //           -> t位的最大值不(大于)t -> t+1位必然超过t位,进入下一位
1026        // 结果落在非t位 -> 必然超过t位,进入此位
1027        let f_idx = match thing_idx(&self.items[t_idx])? {
1028            Ok(idx) => {
1029                if cmp(&self.items[idx].as_thing().1, &target) {
1030                    idx
1031                } else {
1032                    if is_edge(idx) {
1033                        return None
1034                    } else {
1035                        next(idx)
1036                    }
1037                }
1038            }
1039            Err(idx) => {
1040                idx
1041            }
1042        };
1043        
1044        // 必然是thing
1045        match self.items[f_idx].as_thing().1 {
1046            Field::Elem(e) => {Some(e)}
1047            Field::Collex(collex) => {
1048                collex.find_in(
1049                    target,
1050                    next,
1051                    thing_idx,
1052                    cmp,
1053                    is_edge
1054                )}
1055        }
1056    }
1057    
1058    /// 找到最近的
1059    ///
1060    /// 两边距离相等时返回更小的
1061    pub fn find_closest(&self, target: V) -> Option<&E> {
1062        use RawField::*;
1063        use Field::*;
1064        
1065        let t_idx =
1066            if self.span().start().ge(&target) {
1067                0
1068            } else if self.span().end().map(|v|v.le(&target)).unwrap_or(false) {
1069                self.len()-1
1070            } else {
1071                self.get_index(&target).ok()?
1072            };
1073        // 上面get_index内已经判空。
1074        // t位是thing -> t位属于t位 -> 是Collex则进入
1075        //                        -> 是Elem返回其
1076        //           -> t大于最大 -> t+1最小值与t最大值比较
1077        //           -> t小于最小 -> t-1最大值与t最小值比较
1078        // t位不是Thing -> 下一个最小值与上一个最大值比较
1079        
1080        match &self.items[t_idx] {
1081            Thing(field) => {
1082                let first = field.1.first();
1083                if target.ge(first.collexate_ref()){
1084                    let last = field.1.last();
1085                    if target.le(last.collexate_ref()) {
1086                        match &field.1 {
1087                            Collex(c) => {
1088                                c.find_closest(target)
1089                            }
1090                            Elem(e) => Some(&e),
1091                        }
1092                    } else { // 大于最大
1093                        Some(
1094                            if t_idx < self.len() {
1095                                self.items.get(t_idx + 1)
1096                                    .map(|v|
1097                                        self.thing_dist_cmp_get(target, last,
1098                                                                v.as_thing().1.first()
1099                                        )
1100                                    )
1101                                    .unwrap_or(last)
1102                            } else{
1103                                last
1104                            }
1105                        )
1106                    }
1107                } else { // 小于最小
1108                    Some(
1109                        if t_idx != 0 {
1110                            self.items.get(t_idx-1)
1111                                .map(|v|
1112                                    self.thing_dist_cmp_get(target,
1113                                                            v.as_thing().1.last(),
1114                                                            first
1115                                    )
1116                                )
1117                                .unwrap_or(first)
1118                        } else {
1119                            first
1120                        }
1121                    )
1122                }
1123            } 
1124            Next(ans) => Some(&self.items[*ans].as_thing().1.first()),
1125            Prev(ans) => Some(&self.items[*ans].as_thing().1.last()),
1126            Among(prev,next) => {
1127                let prev = self.items[*prev].as_thing().1.last();
1128                let next = self.items[*next].as_thing().1.first();
1129                Some(self.thing_dist_cmp_get(target, prev, next))
1130            }
1131            Void => None,
1132        }
1133    }
1134    
1135    pub(crate) fn thing_dist_cmp_get<'a>(&'a self, target:V, prev: &'a E, next: &'a E) -> &'a E{
1136        use std::cmp::Ordering::*;
1137        match dist_cmp(target, prev.collexate(), next.collexate()){
1138            Less => {prev}
1139            // 不可能存储value相同的元素
1140            Equal => {prev}
1141            Greater => {next}
1142        }
1143    }
1144    
1145    /// 判断本容器是否为空
1146    ///
1147    /// 为空不意味着内存占用为0。
1148    pub fn is_empty(&self) -> bool {
1149        self.items.is_empty() || matches!(self.items[0], RawField::Void)
1150    }
1151    
1152    /// 计算指定值对应的块索引,但是带通用前置检查
1153    ///
1154    /// 获取值对应的索引。
1155    pub(crate) fn get_index(
1156        &self,
1157        target: &V,
1158    ) -> GetIndexResult<usize> {
1159        use GetIndexFieldCollexError::*;
1160        if self.is_empty() { return Err(Empty) }
1161        let span = &self.span;
1162        if !span.contains(&target) { return Err(OutOfSpan); }
1163        // is_empty 已检查len>0
1164        Ok(self.idx_of(target).min(self.len() - 1))
1165    }
1166    
1167    pub fn get(&self, value: V) -> Option<&E> {
1168        let idx = self.idx_of(&value);
1169        if self.contains_idx(idx) {
1170            match &self.items[idx] {
1171                RawField::Thing((_, k)) =>
1172                    match k {
1173                        Field::Elem(e) => {
1174                            if value.eq(e.collexate_ref()) {
1175                                Some(e)
1176                            } else {
1177                                None
1178                            }
1179                        }
1180                        Field::Collex(collex) => { collex.get(value) }
1181                    }
1182                _ => None
1183            }
1184        } else { None }
1185    }
1186    
1187    /// # Panics
1188    /// 找不到panic
1189    pub fn unchecked_get(&self, value: V) -> &E {
1190        let idx = self.idx_of(&value);
1191        match &self.items[idx] {
1192            RawField::Thing((_, k)) =>
1193                match k {
1194                    Field::Elem(e) => {
1195                        if value.eq(e.collexate_ref()) {
1196                            e
1197                        } else {
1198                            panic!("Called `FieldCollex::unchecked_get_mut()` on a value is not eq to where it points an field's value")
1199                        }
1200                    }
1201                    Field::Collex(collex) => { collex.unchecked_get(value) }
1202                }
1203            _ => panic!("Called `FieldCollex::unchecked_get()` on a value points an empty field")
1204        }
1205    }
1206    
1207    
1208    pub(crate) fn get_mut(&mut self, value: V) -> Option<&mut E> {
1209        let idx = self.idx_of(&value);
1210        if self.contains_idx(idx) {
1211            match &mut self.items[idx] {
1212                RawField::Thing((_, k)) =>
1213                    match k {
1214                        Field::Elem(e) => {
1215                            if value.eq(e.collexate_ref()) {
1216                                Some(e)
1217                            } else {
1218                                None
1219                            }
1220                        }
1221                        Field::Collex(collex) => { collex.get_mut(value) }
1222                    }
1223                _ => None
1224            }
1225        } else { None }
1226    }
1227    
1228    pub(crate) fn unchecked_get_mut(&mut self, value: V) -> &mut E {
1229        let idx = self.idx_of(&value);
1230        match &mut self.items[idx] {
1231            RawField::Thing((_, k)) =>
1232                match k {
1233                    Field::Elem(e) => {
1234                        if value.eq(e.collexate_ref()) {
1235                            e
1236                        } else {
1237                            panic!("Called `FieldCollex::unchecked_get_mut()` on a value is not eq to where it points an field's value")
1238                        }
1239                    }
1240                    Field::Collex(collex) => { collex.unchecked_get_mut(value) }
1241                }
1242            _ => panic!("Called `FieldCollex::unchecked_get_mut()` on a value points an empty field")
1243        }
1244    }
1245    
1246    /// 闭包结束后,会根据Value是否发生变化来决定是否更新其在Collex中的位置
1247    ///
1248    /// 若更新后的值(仅指collexate值)无法容纳于本Collex,将报错并重置值。
1249    pub fn try_modify<F,R>(&mut self, value: V, op: F) -> ModifyResult<R,R>
1250    where
1251        F: Fn(&mut E) -> R
1252    {
1253        use ModifyFieldCollexError::*;
1254        
1255        let elem = self.get_mut(value).ok_or(CannotFind)?;
1256        let old_v = elem.collexate();
1257        let result = op(elem);
1258        if old_v.eq(elem.collexate_ref()) {
1259            Ok(result)
1260        } else {
1261            // TODO: 优化逻辑
1262            let new_v = elem.collexate();
1263            *elem.collexate_mut() = old_v;
1264            let mut new_e = self.remove(old_v).unwrap();
1265            *new_e.collexate_mut() = new_v;
1266            match self.insert(new_e) {
1267                Ok(()) => Ok(result),
1268                Err(err) => Err(InsertError(err.map(|mut e| {
1269                    *e.collexate_mut() = old_v;
1270                    // 刚删除一模一样的东西,理应可以重新插入
1271                    if let Err(_) = self.insert(e) {
1272                        panic!("Called `FieldCollex::insert` in `FieldCollex::try_modify` but get an **unexpected** error");
1273                    }
1274                    result
1275                }))),
1276            }
1277        }
1278    }
1279    
1280    /// 闭包结束后,会根据Value是否发生变化来决定是否更新其在Collex中的位置
1281    ///
1282    /// 若更新后的值(仅指collexate值)无法容纳于本Collex,将直接通过错误类型的变体返还
1283    pub fn modify<F,R>(&mut self, value: V, op: F) -> ModifyResult<R,(R,E)>
1284    where
1285        F: Fn(&mut E) -> R
1286    {
1287        use ModifyFieldCollexError::*;
1288        
1289        let elem = self.get_mut(value).ok_or(CannotFind)?;
1290        let old_v = elem.collexate();
1291        let result = op(elem);
1292        if old_v.eq(elem.collexate_ref()) {
1293            Ok(result)
1294        } else {
1295            // TODO: 优化逻辑
1296            let new_v = elem.collexate();
1297            *elem.collexate_mut() = old_v;
1298            let mut new_e = self.remove(old_v).unwrap();
1299            *new_e.collexate_mut() = new_v;
1300            match self.insert(new_e) {
1301                Ok(()) => Ok(result),
1302                Err(err) => Err(InsertError(err.map(|e| (result,e)))),
1303            }
1304        }
1305    }
1306    
1307    /// 闭包结束后,会根据Value是否发生变化来决定是否更新其在Collex中的位置
1308    ///
1309    /// # Panics
1310    /// 若无法找到对应的元素,panic
1311    ///
1312    /// 若更新后的值(仅指collexate值)无法容纳于本Collex,将直接Panic
1313    pub fn unchecked_modify<F,R>(&mut self, value: V, op: F) -> R
1314    where
1315        F: Fn(&mut E) -> R
1316    {
1317        let elem = self.unchecked_get_mut(value);
1318        let old_v = elem.collexate();
1319        let result = op(elem);
1320        if old_v.eq(elem.collexate_ref()) {
1321            // do nothing
1322        } else {
1323            // TODO: 优化逻辑
1324            let new_v = elem.collexate();
1325            *elem.collexate_mut() = old_v;
1326            let mut new_e = self.remove(old_v).unwrap();
1327            *new_e.collexate_mut() = new_v;
1328            if let Err(_) = self.insert(new_e) {
1329                panic!("Called `FieldCollex::insert` in `FieldCollex::unchecked_modify` but get an error");
1330            }
1331        }
1332        result
1333    }
1334    
1335}
1336
1337#[cfg(test)]
1338mod tests {
1339    use super::*;
1340    use span_core::Span;
1341    
1342    // ===================== 测试用元素类型(实现Collexetable<u32>) =====================
1343    #[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
1344    struct TestElem(u32);
1345    
1346    impl Collexetable<u32> for TestElem {
1347        fn collexate(&self) -> u32 {
1348            self.0
1349        }
1350        
1351        fn collexate_ref(&self) -> &u32 {
1352            &self.0
1353        }
1354        
1355        fn collexate_mut(&mut self) -> &mut u32 {
1356            &mut self.0
1357        }
1358    }
1359    
1360    // ===================== Pub方法测试用例 =====================
1361    #[test]
1362    fn test_basic_construction() {
1363        // 测试:new / with_capacity / span / unit / size / len / capacity / is_empty
1364        let finite_span = Span::new_finite(0u32, 100u32);
1365        let unit = 10u32;
1366        
1367        // 1. new方法(正常场景)
1368        let collex = FieldCollex::<TestElem, u32>::new(finite_span.clone(), unit).unwrap();
1369        assert_eq!(collex.span(), &finite_span);
1370        assert_eq!(*collex.unit(), unit);
1371        assert_eq!(collex.size(), Some(10)); // 100/10=10块
1372        assert_eq!(collex.len(), 0);
1373        assert_eq!(collex.capacity(), 0);
1374        assert!(collex.is_empty());
1375        
1376        // 2. new方法(错误场景:unit=0)
1377        let err_unit_zero = FieldCollex::<TestElem, u32>::new(finite_span.clone(), 0u32).unwrap_err();
1378        assert!(matches!(err_unit_zero, NewFieldCollexError::NonPositiveUnit(_, 0)));
1379        
1380        // 3. new方法(错误场景:空span)
1381        let empty_span = Span::new_finite(5u32, 3u32); // start >= end 为空
1382        let err_empty_span = FieldCollex::<TestElem, u32>::new(empty_span, unit).unwrap_err();
1383        assert!(matches!(err_empty_span, NewFieldCollexError::EmptySpan(_, _)));
1384        
1385        // 4. with_capacity方法(正常场景)
1386        let collex_with_cap = FieldCollex::<TestElem, u32>::with_capacity(finite_span, unit, 5).unwrap();
1387        assert_eq!(collex_with_cap.capacity(), 5);
1388        assert!(collex_with_cap.is_empty());
1389        
1390        // 5. with_capacity方法(错误场景:capacity超限)
1391        let err_cap_out = FieldCollex::<TestElem, u32>::with_capacity(Span::new_finite(0u32, 100u32), 10u32, 11).unwrap_err();
1392        assert!(matches!(err_cap_out, WithCapacityFieldCollexError::OutOfSize(_, _)));
1393    }
1394    
1395    #[test]
1396    fn test_insert_contains() {
1397        // 测试:insert / contains / contains_value / first / last
1398        let span = Span::new_finite(0u32, 100u32);
1399        let unit = 10u32;
1400        let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1401        
1402        // 插入元素
1403        let elem1 = TestElem(5);
1404        let elem2 = TestElem(15);
1405        assert!(collex.insert(elem1).is_ok());
1406        assert!(collex.insert(elem2).is_ok());
1407        
1408        // 验证包含性
1409        assert!(collex.contains(&elem1));
1410        assert!(collex.contains_value(5u32));
1411        assert!(collex.contains(&elem2));
1412        assert!(!collex.contains(&TestElem(25)));
1413        assert!(!collex.contains_value(25u32));
1414        
1415        // 验证首尾元素
1416        assert_eq!(collex.first(), Some(&elem1));
1417        assert_eq!(collex.last(), Some(&elem2));
1418        
1419        // 验证非空
1420        assert!(!collex.is_empty());
1421    }
1422    
1423    #[test]
1424    fn test_remove() {
1425        // 测试:remove
1426        let span = Span::new_finite(0u32, 100u32);
1427        let unit = 10u32;
1428        let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1429        
1430        // 插入后删除
1431        let elem = TestElem(5);
1432        collex.insert(elem).unwrap();
1433        let removed = collex.remove(5u32).unwrap();
1434        assert_eq!(removed, elem);
1435        
1436        // 验证删除后不包含
1437        assert!(!collex.contains(&elem));
1438        assert!(!collex.contains_value(5u32));
1439        assert!(collex.is_empty());
1440        
1441        // 错误场景:删除不存在的值
1442        let err_remove = collex.remove(10u32).unwrap_err();
1443        assert!(matches!(err_remove, RemoveFieldCollexError::NotExist));
1444    }
1445    
1446    #[test]
1447    fn test_extend_try_extend() {
1448        // 测试:extend / try_extend
1449        let span = Span::new_finite(0u32, 100u32);
1450        let unit = 10u32;
1451        let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1452        
1453        // 1. extend:批量插入
1454        let elems = vec![TestElem(5), TestElem(15), TestElem(25)];
1455        collex.extend(elems.clone());
1456        assert!(collex.contains(&TestElem(5)));
1457        assert!(collex.contains(&TestElem(15)));
1458        
1459        // 2. try_extend:批量插入并返回结果
1460        let elems2 = vec![TestElem(25), TestElem(35), TestElem(105)]; // 105超出span范围
1461        let result = collex.try_extend(elems2);
1462        // 验证:105超出span,25已存在,35插入成功
1463        assert!(!result.out_of_span.is_empty() && result.out_of_span[0].0 == 105);
1464        assert!(!result.already_exist.is_empty() && result.already_exist[0].0 == 25);
1465        assert!(collex.contains(&TestElem(35)));
1466    }
1467    
1468    #[test]
1469    fn test_find_methods() {
1470        // 测试:find_gt / find_ge / find_lt / find_le
1471        let span = Span::new_finite(0u32, 100u32);
1472        let unit = 10u32;
1473        let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1474        
1475        // 插入测试元素
1476        let elems = [TestElem(5), TestElem(15), TestElem(25)];
1477        for &e in &elems {
1478            collex.insert(e).unwrap();
1479        }
1480        
1481        // 测试find_gt(大于)
1482        let gt = collex.find_gt(10u32).unwrap();
1483        assert_eq!(*gt, TestElem(15));
1484        
1485        // 测试find_ge(大于等于)
1486        let ge = collex.find_ge(15u32).unwrap();
1487        assert_eq!(*ge, TestElem(15));
1488        
1489        // 测试find_lt(小于)
1490        let lt = collex.find_lt(20u32).unwrap();
1491        assert_eq!(*lt, TestElem(15));
1492        
1493        // 测试find_le(小于等于)
1494        let le = collex.find_le(25u32).unwrap();
1495        assert_eq!(*le, TestElem(25));
1496        
1497        // 错误场景:找不到匹配值
1498        let err_find = collex.find_gt(30u32);
1499        assert!(matches!(err_find, None));
1500    }
1501    
1502    #[test]
1503    fn test_with_elements() {
1504        // 测试:with_elements(批量构造)
1505        let span = Span::new_finite(0u32, 100u32);
1506        // 实际运用场景建议使用5或10(即使目前没这么多元素)要保持尽量不分层!
1507        let unit = 50u32;
1508        let elems = vec![TestElem(5), TestElem(15), TestElem(25), TestElem(105)]; // 105超出span
1509        
1510        // 构造FieldCollex
1511        let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1512        // 验证:105被忽略,5/15/25插入成功
1513        assert!(collex.contains(&TestElem(5)));
1514        assert!(collex.contains(&TestElem(15)));
1515        assert!(!collex.contains(&TestElem(105)));
1516        assert_eq!(collex.first(), Some(&TestElem(5)));
1517        assert_eq!(collex.last(), Some(&TestElem(25)));
1518    }
1519    
1520    
1521    #[test]
1522    fn test_find_closest() {
1523        // 测试:find_closest
1524        let span = Span::new_finite(0u32, 100u32);
1525        // 实际运用场景建议使用5或10(即使目前没这么多元素)要保持尽量不分层!
1526        let unit = 50u32;
1527        let elems = vec![TestElem(5), TestElem(15), TestElem(25), TestElem(105)]; // 105超出span
1528        
1529        // 构造FieldCollex
1530        let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1531        // 相等直接取
1532        assert_eq!(collex.find_closest(5), Some(&TestElem(5)));
1533        assert_eq!(collex.find_closest(25), Some(&TestElem(25)));
1534        // 俩距相同取更小
1535        assert_eq!(collex.find_closest(10), Some(&TestElem(5)));
1536        assert_eq!(collex.find_closest(20), Some(&TestElem(15)));
1537        // 越界取边界
1538        assert_eq!(collex.find_closest(114514), Some(&TestElem(25)));
1539        // 边界仅1值
1540        assert_eq!(collex.find_closest(0), Some(&TestElem(5)));
1541        // 未分配时取边界
1542        assert_eq!(collex.find_closest(100), Some(&TestElem(25)));
1543    }
1544    
1545    #[test]
1546    fn test_get() {
1547        // 测试:get系列函数
1548        let span = Span::new_finite(0u32, 100u32);
1549        let unit = 10u32;
1550        let elems = vec![TestElem(5), TestElem(15), TestElem(25)];
1551        
1552        // 构造FieldCollex
1553        let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1554        assert_eq!(collex.get(5), Some(&TestElem(5)));
1555        assert_eq!(collex.unchecked_get(15), &TestElem(15));
1556        assert_eq!(collex.get(25), Some(&TestElem(25)));
1557        assert_eq!(collex.get(0), None);
1558        assert_eq!(collex.get(10), None);
1559        assert_eq!(collex.get(114514), None);
1560    }
1561    
1562    #[test]
1563    fn test_modify() {
1564        // 测试:modify系列函数
1565        let span = Span::new_finite(0u32, 100u32);
1566        let unit = 10u32;
1567        let elems = vec![TestElem(5),  TestElem(25),  TestElem(35),  TestElem(45)];
1568        
1569        // 构造FieldCollex
1570        let mut collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1571        
1572        assert_eq!(collex.first(), Some(&TestElem(5)));
1573        
1574        // Value未修改
1575        // ... edit other field (but there we do nothing)
1576        collex.modify(5,|_| ()).unwrap();
1577        assert_eq!(collex.first(), Some(&TestElem(5)));
1578        
1579        // 修改Value但依旧在此位置
1580        collex.modify(5,|v| v.0=1 ).unwrap();
1581        assert_eq!(collex.first(), Some(&TestElem(1)));
1582        
1583        // 修改Value,改变位置
1584        let _ans = collex.modify(1,|v| v.0=15 );
1585        assert_eq!(collex.first(), Some(&TestElem(15)));
1586        
1587        // 修改Value,移到别的后面
1588        collex.modify(15,|v| v.0=26 ).unwrap();
1589        assert_eq!(collex.first(), Some(&TestElem(25)));
1590        
1591        // 改改别的吧
1592        let _ans = collex.modify(45,|v| v.0=0 );
1593        assert_eq!(collex.first(), Some(&TestElem(0)));
1594        
1595        // modify会在值非法时弹出元素(当然是你修改后的)
1596        let ans = collex.modify(0,|v| v.0=123 );
1597        assert!(matches!(ans, Err(ModifyFieldCollexError::InsertError(InsertFieldCollexError::OutOfSpan(((),TestElem(123)))))));
1598        assert_eq!(collex.first(), Some(&TestElem(25)));
1599        
1600        // try_modify会在值非法时还原值
1601        let ans = collex.try_modify(25,|v| v.0=123 );
1602        assert!(matches!(ans, Err(ModifyFieldCollexError::InsertError(InsertFieldCollexError::OutOfSpan(()) )) ));
1603        assert_eq!(collex.first(), Some(&TestElem(25)));
1604    }
1605}