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#[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 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 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 _ => 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 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 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 } 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 let items = &mut new.items;
324 items.reserve(cap);
325
326 let mut last_idx = index_of!(new,vec[0].collexate_ref());
328 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 for elem in vec {
338 let this_idx = index_of!(new,elem.collexate_ref());
341 if this_idx == last_idx {
343 match items[this_idx]
345 .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 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 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 { 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 pub fn size(&self) -> Option<usize> {
414 match self.span.size(){
416 Ok(Some(size)) => Some((size / self.unit).ceil().into_usize()),
417 _ => None
418 }
419 }
420
421 #[inline(always)]
425 pub fn len(&self) -> usize {
426 self.items.len()
427 }
428
429 pub fn capacity(&self) -> usize {
433 self.items.capacity()
434 }
435
436 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 #[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 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 last.clone()
468 }
469 }
470 };
471 self.expand_to(idx + 1, filler)
472 }
473
474 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 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 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 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 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 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 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 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 pub fn first(&self) -> Option<&E> {
594 Some(self.first_field()?.1.first())
595 }
596
597 pub fn last(&self) -> Option<&E> {
599 Some(self.last_field()?.1.last())
600 }
601
602
603 pub(crate) fn first_field(&self) -> Option<(usize,&FieldIn<E, V>)> {
605 Some(self.items[self.first_index()?].as_thing())
606 }
607
608 pub(crate) fn last_field(&self) -> Option<(usize,&FieldIn<E, V>)> {
610 Some(self.items[self.last_index()?].as_thing())
611 }
612
613
614 pub(crate) fn first_index(&self) -> Option<usize> {
616 let first = self.items.first()?;
617 first.thing_next()
618 }
619
620 pub(crate) fn last_index(&self) -> Option<usize> {
622 self.items.last()?.thing_prev()
623 }
624
625 pub(crate) fn is_in_index(&self, idx: usize, target: &V) -> bool {
627 self.index_range(idx).contains(target)
628 }
629
630 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 pub fn extend(&mut self, mut vec: Vec<E>) {
638 vec.sort_by(Collexetable::collex_cmp);
639 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 pub fn try_extend(&mut self, mut vec: Vec<E>) -> TryExtendResult<E> {
658 vec.sort_by(Collexetable::collex_cmp);
659 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 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 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 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 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 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 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 let len = self.len();
819 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 if idx != 0 && !matches!(items[idx-1], RawField::Thing(_)) {
827 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 if idx != len - 1 && !matches!(items[idx+1], RawField::Thing(_)) {
838 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 { self.insert_in_ob(idx, value)
851 }
852 }
853
854 pub(crate) fn remove_in(this: &mut Self, idx: usize ) -> (bool, RemoveResult<CollexField<E,V>>) {
856 let len = this.items.len();
858 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 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 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 let old = mem::replace(&mut this.items[idx], filler);
915
916 (false, Ok(old))
917 }
918
919 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 let sub = Self::remove_rec(collex,target,collex.idx_of(&target));
938 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 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 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 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 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 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 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 { 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 { 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 Equal => {prev}
1141 Greater => {next}
1142 }
1143 }
1144
1145 pub fn is_empty(&self) -> bool {
1149 self.items.is_empty() || matches!(self.items[0], RawField::Void)
1150 }
1151
1152 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 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 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 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 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 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 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 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 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 } else {
1323 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 #[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 #[test]
1362 fn test_basic_construction() {
1363 let finite_span = Span::new_finite(0u32, 100u32);
1365 let unit = 10u32;
1366
1367 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)); assert_eq!(collex.len(), 0);
1373 assert_eq!(collex.capacity(), 0);
1374 assert!(collex.is_empty());
1375
1376 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 let empty_span = Span::new_finite(5u32, 3u32); let err_empty_span = FieldCollex::<TestElem, u32>::new(empty_span, unit).unwrap_err();
1383 assert!(matches!(err_empty_span, NewFieldCollexError::EmptySpan(_, _)));
1384
1385 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 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 let span = Span::new_finite(0u32, 100u32);
1399 let unit = 10u32;
1400 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1401
1402 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 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 assert_eq!(collex.first(), Some(&elem1));
1417 assert_eq!(collex.last(), Some(&elem2));
1418
1419 assert!(!collex.is_empty());
1421 }
1422
1423 #[test]
1424 fn test_remove() {
1425 let span = Span::new_finite(0u32, 100u32);
1427 let unit = 10u32;
1428 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1429
1430 let elem = TestElem(5);
1432 collex.insert(elem).unwrap();
1433 let removed = collex.remove(5u32).unwrap();
1434 assert_eq!(removed, elem);
1435
1436 assert!(!collex.contains(&elem));
1438 assert!(!collex.contains_value(5u32));
1439 assert!(collex.is_empty());
1440
1441 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 let span = Span::new_finite(0u32, 100u32);
1450 let unit = 10u32;
1451 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1452
1453 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 let elems2 = vec![TestElem(25), TestElem(35), TestElem(105)]; let result = collex.try_extend(elems2);
1462 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 let span = Span::new_finite(0u32, 100u32);
1472 let unit = 10u32;
1473 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1474
1475 let elems = [TestElem(5), TestElem(15), TestElem(25)];
1477 for &e in &elems {
1478 collex.insert(e).unwrap();
1479 }
1480
1481 let gt = collex.find_gt(10u32).unwrap();
1483 assert_eq!(*gt, TestElem(15));
1484
1485 let ge = collex.find_ge(15u32).unwrap();
1487 assert_eq!(*ge, TestElem(15));
1488
1489 let lt = collex.find_lt(20u32).unwrap();
1491 assert_eq!(*lt, TestElem(15));
1492
1493 let le = collex.find_le(25u32).unwrap();
1495 assert_eq!(*le, TestElem(25));
1496
1497 let err_find = collex.find_gt(30u32);
1499 assert!(matches!(err_find, None));
1500 }
1501
1502 #[test]
1503 fn test_with_elements() {
1504 let span = Span::new_finite(0u32, 100u32);
1506 let unit = 50u32;
1508 let elems = vec![TestElem(5), TestElem(15), TestElem(25), TestElem(105)]; let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1512 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 let span = Span::new_finite(0u32, 100u32);
1525 let unit = 50u32;
1527 let elems = vec![TestElem(5), TestElem(15), TestElem(25), TestElem(105)]; let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1531 assert_eq!(collex.find_closest(5), Some(&TestElem(5)));
1533 assert_eq!(collex.find_closest(25), Some(&TestElem(25)));
1534 assert_eq!(collex.find_closest(10), Some(&TestElem(5)));
1536 assert_eq!(collex.find_closest(20), Some(&TestElem(15)));
1537 assert_eq!(collex.find_closest(114514), Some(&TestElem(25)));
1539 assert_eq!(collex.find_closest(0), Some(&TestElem(5)));
1541 assert_eq!(collex.find_closest(100), Some(&TestElem(25)));
1543 }
1544
1545 #[test]
1546 fn test_get() {
1547 let span = Span::new_finite(0u32, 100u32);
1549 let unit = 10u32;
1550 let elems = vec![TestElem(5), TestElem(15), TestElem(25)];
1551
1552 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 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 let mut collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1571
1572 assert_eq!(collex.first(), Some(&TestElem(5)));
1573
1574 collex.modify(5,|_| ()).unwrap();
1577 assert_eq!(collex.first(), Some(&TestElem(5)));
1578
1579 collex.modify(5,|v| v.0=1 ).unwrap();
1581 assert_eq!(collex.first(), Some(&TestElem(1)));
1582
1583 let _ans = collex.modify(1,|v| v.0=15 );
1585 assert_eq!(collex.first(), Some(&TestElem(15)));
1586
1587 collex.modify(15,|v| v.0=26 ).unwrap();
1589 assert_eq!(collex.first(), Some(&TestElem(25)));
1590
1591 let _ans = collex.modify(45,|v| v.0=0 );
1593 assert_eq!(collex.first(), Some(&TestElem(0)));
1594
1595 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 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}