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, Clone)]
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, Clone)]
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, Clone)]
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, Clone)]
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, Clone)]
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, Clone)]
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, Clone)]
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, Clone, Debug)]
178pub enum ModifyFieldCollexError<T> {
179 #[error("找不到对应元素")]
180 CannotFind,
181 #[error("刷新元素位置失败")]
182 InsertError(InsertFieldCollexError<T>),
183}
184
185impl<T> ModifyFieldCollexError<T> {
186 pub fn map<F,N>(self, f: F) -> ModifyFieldCollexError<N>
187 where
188 F: FnOnce(T) -> N
189 {
190 use ModifyFieldCollexError::*;
191 match self {
192 CannotFind => CannotFind,
193 InsertError(err) => InsertError(err.map(f)),
194 }
195 }
196}
197
198pub trait Collexetable<V> {
199 fn collexate(&self) -> V;
200 fn collexate_ref(&self) -> &V;
201 fn collexate_mut(&mut self) -> &mut V;
202
203 fn collex_cmp<O>(&self, other: &O) -> std::cmp::Ordering
204 where
205 O: Collexetable<V>,
206 V: Ord
207 {
208 self.collexate_ref().cmp(other.collexate_ref())
209 }
210
211 fn collex_eq<O>(&self, other: &O) -> bool
212 where
213 O: Collexetable<V>,
214 V: Eq
215 {
216 self.collexate_ref().eq(other.collexate_ref())
217 }
218
219 fn collex_mut_eq<O>(&mut self, other: &mut O) -> bool
220 where
221 O: Collexetable<V>,
222 V: Eq
223 {
224 self.collexate_ref().eq(other.collexate_ref())
225 }
226}
227
228#[derive(Debug, Clone)]
233pub struct FieldCollex<E,V>
234where
235 E: Collexetable<V>,
236 V: FieldValue,
237{
238 pub(crate) span: Span<V>,
239 pub(crate) unit: V,
240 pub(crate) items: Vec<CollexField<E,V>>,
241}
242
243impl<E,V> FieldCollex<E,V>
244where
245 E: Collexetable<V>,
246 V: FieldValue
247{
248 const SUB_FACTOR: usize = 64;
249 pub fn new(span: Span<V>, unit: V) -> NewResult<Self,V> {
255 use NewFieldCollexError::*;
256
257 if unit <= V::zero() {
258 Err(NonPositiveUnit(span, unit))
259 } else if span.is_empty() {
260 Err(EmptySpan(span, unit))
261 } else {
262 Ok(Self {
263 span,
264 unit,
265 items: Vec::new()
266 })
267 }
268 }
269
270 pub fn with_capacity(span: Span<V>, unit: V, capacity: usize) -> WithCapacityResult<Self,V> {
276 use WithCapacityFieldCollexError::*;
277 if unit <= V::zero() {
278 Err(NonPositiveUnit(span, unit))
279 } else if span.is_empty() {
280 Err(EmptySpan(span, unit))
281 } else if match span.size(){
282 Ok(Some(size)) => {
283 capacity > (size / unit).ceil().into_usize()
284 },
285 Ok(None) => {false}
286 _ => unreachable!()
288 } {
289 Err(OutOfSize(span, unit))
290 } else {
291 Ok(Self {
292 span,
293 unit,
294 items: Vec::with_capacity(capacity),
295 })
296 }
297 }
298
299 pub fn with_elements(span: Span<V>, unit: V, mut other: Vec<E>) -> WithElementsResult<Self,V> {
301 other.sort_by(Collexetable::collex_cmp);
302 other.dedup_by(Collexetable::collex_mut_eq);
303
304 let mut new = Self::new(span, unit)?;
305 let first_oob_idx = other.iter().enumerate().rev().try_for_each(
307 |(idx,e)|
308 if new.span.contains(e.collexate_ref()) {
309 Err(idx+1)
310 } else {
311 Ok(())
312 }
313 ).err().unwrap_or(0);
314 let vec = &other[0..first_oob_idx];
315 if vec.len()==0 {
316 } else if vec.len()==1 {
318 let _ = new.insert(other.into_iter().next().unwrap());
319 } else {
320 let cap = new.idx_of(vec[first_oob_idx-1].collexate_ref()) + 1;
321 let items = &mut new.items;
323 items.reserve(cap);
324
325 let mut last_idx = index_of!(new,vec[0].collexate_ref());
327 if last_idx != 0 {
329 items.resize_with(last_idx ,|| RawField::Next(last_idx));
330 }
331 let _ = other.split_off(first_oob_idx);
332 let mut vec = other.into_iter();
333 items.push(RawField::Thing((last_idx,Field::Elem(vec.next().unwrap()))));
334
335 for elem in vec {
337 let this_idx = index_of!(new,elem.collexate_ref());
340 if this_idx == last_idx {
342 match items[this_idx]
344 .as_thing_mut().1
346 {
347 Field::Elem(_) => {
348 let span = Span::Finite({
349 let start = *new.span.start() + new.unit * V::from_usize(this_idx);
350 start..start + new.unit
351 });
352 let mut unit = new.unit/V::from_usize(Self::SUB_FACTOR);
353 if unit.is_zero() {
354 unit = V::min_positive();
355 }
356 let collex =
357 FieldCollex::with_capacity(
358 span,
359 unit,
360 2
361 ).unwrap_or_else(|err|
362 panic!("Called `FieldCollex::with_capacity` in `FieldCollex::with_elements` to make a new sub FieldSet, but get a error {err}")
363 );
364
365 let old =
366 match mem::replace(&mut items[this_idx], RawField::Thing((this_idx ,Field::Collex(collex)))).unwrap() {
367 Field::Elem(e) => e,
368 Field::Collex(_) => unreachable!(),
369 };
370 let collex =
371 match items[this_idx]
372 .as_thing_mut().1 {
373 Field::Elem(_) => unreachable!(),
374 Field::Collex(collex) => collex,
375 };
376 if let Err(_) = collex.insert(old) {
378 panic!("Called `FieldCollex::insert` in `FieldCollex::with_elements` but get an unexpected error");
379 }
380 if let Err(_) = collex.insert(elem) {
381 panic!("Called `FieldCollex::insert` in `FieldCollex::with_elements` but get an unexpected error");
382 }
383 }
384 Field::Collex(collex) => {
385 if let Err(_) = collex.insert(elem) {
387 panic!("Called `FieldCollex::insert` in `FieldCollex::with_elements` but get an unexpected error");
388 }
389 }
390 };
391 } else { items.resize_with(this_idx, ||RawField::Among(last_idx, this_idx));
393 items.push(RawField::Thing((this_idx, Field::Elem(elem))))
394 }
395 last_idx = this_idx;
396 }
397 }
398 Ok(new)
399 }
400
401 pub fn span(&self) -> &Span<V> {
402 &self.span
403 }
404
405 pub fn unit(&self) -> &V {
406 &self.unit
407 }
408
409 pub fn size(&self) -> Option<usize> {
413 match self.span.size(){
415 Ok(Some(size)) => Some((size / self.unit).ceil().into_usize()),
416 _ => None
417 }
418 }
419
420 #[inline(always)]
424 pub fn len(&self) -> usize {
425 self.items.len()
426 }
427
428 pub fn capacity(&self) -> usize {
432 self.items.capacity()
433 }
434
435 pub(crate) fn is_thing(&self, idx: usize) -> bool {
437 if idx < self.items.len() {
438 matches!(self.items[idx], RawField::Thing(_))
439 } else { false }
440 }
441
442 #[inline(always)]
447 pub(crate) fn idx_of(&self, target: &V) -> usize {
448 target.sub(*self.span.start()).div(self.unit).into_usize()
449 }
450
451 pub(crate) fn expand_to_idx(&mut self, idx: usize) -> bool {
458 let filler = match self.items.last() {
459 None =>
460 RawField::Void,
461 Some(last) => {
462 if let RawField::Thing(t) = last {
463 RawField::prev_from(t)
464 } else {
465 last.unchecked_clone()
467 }
468 }
469 };
470 self.expand_to(idx + 1, filler)
471 }
472
473 pub(crate) fn expand_to_with(&mut self, new_size: usize, maker: impl Fn() -> CollexField<E,V>) -> bool {
478 if self.items.len() < new_size {
479 self.items.resize_with(new_size, maker);
480 true
481 } else { false }
482 }
483
484 pub(crate) fn expand_to(&mut self, new_size: usize, filler: CollexField<E,V>) -> bool {
485 if self.items.len() < new_size {
486 self.items.resize_with(new_size, ||filler.unchecked_clone());
487 true
488 } else { false }
489 }
490
491 #[inline(always)]
492 #[must_use]
493 pub(crate) fn contains_idx(&self, idx: usize) -> bool {
494 idx < self.items.len()
495 }
496
497 pub fn contains(&self, elem: &E) -> bool {
500 let idx = self.idx_of(elem.collexate_ref());
501 if self.contains_idx(idx) {
502 match &self.items[idx] {
503 RawField::Thing((_, k)) =>
504 match k {
505 Field::Elem(e) => { elem.collex_eq(e) }
506 Field::Collex(collex) => { collex.contains(elem) }
507 }
508 _ => false
509 }
510 } else { false }
511 }
512
513 pub fn contains_value(&self, value: V) -> bool {
516 let idx = self.idx_of(&value);
517 if self.contains_idx(idx) {
518 match &self.items[idx] {
519 RawField::Thing((_, k)) =>
520 match k {
521 Field::Elem(e) => { value.eq(e.collexate_ref())}
522 Field::Collex(collex) => { collex.contains_value(value) }
523 }
524 _ => false
525 }
526 } else { false }
527 }
528
529 pub(crate) fn get_field(&self, idx: usize) -> Option<&FieldIn<E, V>> {
533 if idx < self.items.len() {
534 match self.items[idx] {
535 RawField::Thing(ref v) => Some(&v.1),
536 _ => None
537 }
538 } else { None }
539 }
540
541
542 pub(crate) fn get_prev_field(&self, idx: usize) -> Option<(usize,&FieldIn<E, V>)> {
549 Some(self.items[self.get_prev_index(idx)?].as_thing())
550 }
551
552 pub(crate) fn get_next_field(&self,idx: usize) -> Option<(usize,&FieldIn<E, V>)> {
559 Some(self.items[self.get_next_index(idx)?].as_thing())
560 }
561
562
563 pub(crate) fn get_prev_index(&self, idx: usize) -> Option<usize> {
570 if idx < self.items.len() {
571 self.items[idx].thing_prev()
572 } else {
573 self.items.last()?.thing_prev()
574 }
575
576 }
577
578 pub(crate) fn get_next_index(&self,idx: usize) -> Option<usize> {
585 if idx < self.items.len() {
586 self.items[idx].thing_next()
587 } else { None }
588 }
589
590
591 pub fn first(&self) -> Option<&E> {
593 Some(self.first_field()?.1.first())
594 }
595
596 pub fn last(&self) -> Option<&E> {
598 Some(self.last_field()?.1.last())
599 }
600
601
602 pub(crate) fn first_field(&self) -> Option<(usize,&FieldIn<E, V>)> {
604 Some(self.items[self.first_index()?].as_thing())
605 }
606
607 pub(crate) fn last_field(&self) -> Option<(usize,&FieldIn<E, V>)> {
609 Some(self.items[self.last_index()?].as_thing())
610 }
611
612
613 pub(crate) fn first_index(&self) -> Option<usize> {
615 let first = self.items.first()?;
616 first.thing_next()
617 }
618
619 pub(crate) fn last_index(&self) -> Option<usize> {
621 self.items.last()?.thing_prev()
622 }
623
624 pub(crate) fn is_in_index(&self, idx: usize, target: &V) -> bool {
626 self.index_range(idx).contains(target)
627 }
628
629 pub(crate) fn index_range(&self, idx: usize) -> Range<V> {
631 let start = *self.span.start() + self.unit * V::from_usize(idx);
632 start..start + self.unit
633 }
634
635 pub fn extend(&mut self, mut vec: Vec<E>) {
637 vec.sort_by(Collexetable::collex_cmp);
638 for v in vec {
641 match self.insert(v) {
642 Err(err) => {
643 match err {
644 InsertFieldCollexError::OutOfSpan(_) => {
645 break;
646 }
647 InsertFieldCollexError::AlreadyExist(_) => {}
648 }
649 }
650 _ => {}
651 }
652 }
653 }
654
655 pub fn try_extend(&mut self, mut vec: Vec<E>) -> TryExtendResult<E> {
657 vec.sort_by(Collexetable::collex_cmp);
658 let mut out_of_span: Vec<E> = Vec::new();
661 let mut already_exist = Vec::new();
662 let mut vec = vec.into_iter();
663 while let Some(v) = vec.next() {
664 match self.insert(v) {
665 Ok(_) => {
666 }
667 Err(err) => {
668 match err {
669 InsertFieldCollexError::OutOfSpan(e) => {
670 out_of_span.push(e);
671 out_of_span.extend(vec);
672 break;
673 }
674 InsertFieldCollexError::AlreadyExist(e) => {
675 already_exist.push(e);
676 }
677 }
678 }
679 }
680 }
681 TryExtendResult {
682 out_of_span, already_exist
683 }
684 }
685
686 pub(crate) fn insert_in_ib(&mut self, idx: usize, value: E) -> (bool, InsertResult<E>) {
687 use InsertFieldCollexError::*;
688 let items = &mut self.items;
689
690 let mut need_fill = false;
691 match &items[idx] {
693 RawField::Thing(t) => {
694 match &t.1 {
695 Field::Elem(e) => {
696 if e.collex_eq(&value){
697 return (false,Err(AlreadyExist(value)));
698 }
699 let span = Span::Finite({
700 let start = *self.span.start() + self.unit * V::from_usize(idx);
701 start..start + self.unit
702 });
703 let mut unit = self.unit/V::from_usize(Self::SUB_FACTOR);
704 if unit.is_zero() {
705 unit = V::min_positive();
706 }
707 let collex =
708 FieldCollex::with_capacity(
709 span,
710 unit,
711 2
712 ).unwrap_or_else(|err|
713 panic!("Called `FieldCollex::with_capacity` in `FieldCollex::insert_in_ib` to make a new sub FieldSet, but get a error {err}")
714 );
715 let old =
716 match mem::replace(&mut items[idx], RawField::Thing((idx ,Field::Collex(collex)))).unwrap() {
717 Field::Elem(e) => e,
718 Field::Collex(_) => unreachable!(),
719 };
720 let collex =
721 match items[idx]
722 .as_thing_mut().1 {
723 Field::Elem(_) => unreachable!(),
724 Field::Collex(collex) => collex,
725 };
726 if let Err(_) = collex.insert(old){
728 panic!("Called `FieldCollex::insert` in `FieldCollex::insert_in_ib` but get an unexpected error");
729 }
730 if let Err(_) = collex.insert(value) {
731 panic!("Called `FieldCollex::insert` in `FieldCollex::insert_in_ib` but get an unexpected error");
732 }
733 }
734 Field::Collex(_) => {
735 let old = mem::replace(&mut items[idx], RawField::Void);
736 match old {
737 RawField::Thing((_,mut t)) => {
738 match t {
739 Field::Collex(ref mut collex) => {
740 let ans = collex.insert(value);
741 match &ans {
742 Ok(_) => {}
743 Err(_) => {return (false,ans)}
744 }
745 let _ = mem::replace(
746 &mut items[idx],
747 RawField::Thing((idx,t))
748 );
749 }
750 _ => unreachable!()
751 }
752 }
753 _ => unreachable!()
754 }
755 }
756 }
757 }
758 _ => {
759 need_fill = true;
760 let _ = mem::replace(
761 &mut items[idx],
762 RawField::Thing((idx,Field::Elem(value)))
763 );
764 }
765 }
766 (need_fill,Ok(()))
767 }
768
769 pub(crate) fn insert_in_ob(&mut self, idx: usize, value: E) -> InsertResult<E> {
770 let items = &mut self.items;
771 let len = items.len();
772
773 let prev =
775 if len != 0{
776 match &items[len - 1]{
777 RawField::Thing(t) => {
778 debug_assert_eq!(t.0, len-1);
779 RawField::Among(t.0,idx)
780 }
781 _ => {
782 let (first_idx,prev) = match items[len - 1] {
784 RawField::Prev(prev) | RawField::Among(prev, _) => (prev+1, RawField::Among(prev, idx)),
785 RawField::Void => (0,RawField::Next(idx)),
786 RawField::Next(_) | RawField::Thing(_) => unreachable!()
787 };
788
789 items[first_idx..len].fill_with(||prev.unchecked_clone());
790 prev
791 }
792 }
793 } else {
794 RawField::Next(idx)
795 }
796 ;
797
798 let need_cap = idx + 1 - len;
801 items.reserve(need_cap);
802 items.resize_with(idx, || prev.unchecked_clone());
803 items.push(RawField::Thing((idx, Field::Elem(value))));
804 Ok(())
805 }
806
807 pub fn insert(&mut self, value: E) -> InsertResult<E> {
810 use InsertFieldCollexError::*;
811 let span = self.span();
812 if !span.contains(value.collexate_ref()) { return Err(OutOfSpan(value)) }
813
814 let idx = self.idx_of(value.collexate_ref());
815 let len = self.len();
818 if idx < len {
820 let (need_fill,ans) = self.insert_in_ib(idx, value);
821 if need_fill {
822 let items = &mut self.items;
823 if idx != 0 && !matches!(items[idx-1], RawField::Thing(_)) {
826 let (first_idx, prev) = match items[idx - 1] {
828 RawField::Prev(prev) | RawField::Among(prev, _) => (prev + 1, RawField::Among(prev, idx)),
829 RawField::Next(_) | RawField::Void => (0, RawField::Next(idx)),
830 RawField::Thing(_) => unreachable!()
831 };
832
833 items[first_idx..idx].fill_with(||prev.unchecked_clone());
834 }
835 if idx != len - 1 && !matches!(items[idx+1], RawField::Thing(_)) {
837 let (last_idx, next) = match items[idx + 1] {
839 RawField::Next(next) | RawField::Among(_, next) => (next, RawField::Among(idx, next)),
840 RawField::Prev(_) | RawField::Void => (len, RawField::Prev(idx)),
841 RawField::Thing(_) => unreachable!()
842 };
843
844 items[idx+1..last_idx].fill_with(||next.unchecked_clone());
845 }
846 }
847 ans
848 } else { self.insert_in_ob(idx, value)
850 }
851 }
852
853 pub(crate) fn remove_in(this: &mut Self, idx: usize ) -> (bool, RemoveResult<CollexField<E,V>>) {
855 let len = this.items.len();
857 let next =
859 if idx == len-1 {
860 None
861 } else {
862 match &this.items[idx + 1] {
863 RawField::Thing(thing) => Some(thing.0),
864 RawField::Prev(_)
865 | RawField::Void => None,
866 RawField::Among(_, next)
867 | RawField::Next(next) => Some(*next),
868 }
869 };
870
871 let prev =
872 if idx == 0 {
873 None
874 } else {
875 match &this.items[idx - 1] {
876 RawField::Thing(thing) => Some(thing.0),
877 RawField::Next(_)
878 | RawField::Void => None,
879 RawField::Among(prev, _)
880 | RawField::Prev(prev) => Some(*prev),
881 }
882 };
883
884 let filler =
885 match next {
886 None =>
887 match prev {
888 None => return (true, Ok(mem::replace(&mut this.items[idx], RawField::Void))),
889 Some(prev) => RawField::Prev(prev),
890 },
891 Some(next) =>
892 match prev {
893 None => RawField::Next(next),
894 Some(prev) => RawField::Among(prev, next),
895 },
896 };
897
898 this.items[0..idx].iter_mut().rev()
900 .take_while(|v| !matches!(v, RawField::Thing(_)) )
901 .for_each(|v| {
902 *v = filler.unchecked_clone();
903 });
904
905 this.items[idx+1..len].iter_mut()
907 .take_while(|v| !matches!(v, RawField::Thing(_)) )
908 .for_each(|v| {
909 *v = filler.unchecked_clone();
910 });
911
912 let old = mem::replace(&mut this.items[idx], filler);
914
915 (false, Ok(old))
916 }
917
918 pub(crate) fn remove_rec(this: &mut Self, target: V, idx: usize) -> (bool, RemoveResult<E>) {
920 use RemoveFieldCollexError::*;
921 let items = &mut this.items;
922 (false,
923 if let RawField::Thing(ref mut t) = items[idx] {
924 match &mut t.1 {
925 Field::Elem(e) => {
926 if target.ne(e.collexate_ref()) {
927 Err(NotExist)
928 } else {
929 let ans = Self::remove_in(this, idx);
930 return (ans.0, ans.1.map(|cf| cf.unwrap().into_elem()))
931 }
932 }
933 Field::Collex(collex) => {
934 let sub = Self::remove_rec(collex,target,collex.idx_of(&target));
937 return if sub.0 {
939 (Self::remove_in(this, idx).0, sub.1)
940 } else {sub}
941 }
942 }
943 } else {
944 Err(NotExist)
945 }
946 )
947 }
948
949 pub fn remove(&mut self, target: V) -> RemoveResult<E> {
951 let idx = self.get_index(&target)
952 .map_err(Into::<RemoveFieldCollexError>::into)?;
953 let ans = Self::remove_rec(self,target,idx);
954 if ans.0 {
955 self.items.clear()
956 }
957 ans.1
958 }
959
960 pub fn find_gt(&self, target: V) -> Option<&E> {
961 let last_idx = self.len() - 1;
962 self.find_in(
963 target,
964 |idx| idx+1 ,
965 |f| f.thing_or_next(),
966 |f,v| f.last().collexate_ref().gt(v),
967 move |idx| idx == last_idx,
968 )
969 }
970
971
972 pub fn find_ge(&self, target: V) -> Option<&E> {
973 let last_idx = self.len() - 1;
974 self.find_in(
975 target,
976 |idx| idx+1 ,
977 |f| f.thing_or_next(),
978 |f,v| f.last().collexate_ref().ge(v),
979 move |idx| idx == last_idx,
980 )
981 }
982
983 pub fn find_lt(&self, target: V) -> Option<&E> {
984 self.find_in(
985 target,
986 |idx| idx-1 ,
987 |f| f.thing_or_prev(),
988 |f,v| f.first().collexate_ref().lt(v),
989 |idx| idx == 0,
990 )
991 }
992
993
994 pub fn find_le(&self, target: V) -> Option<&E> {
995 self.find_in(
996 target,
997 |idx| idx-1 ,
998 |f| f.thing_or_prev(),
999 |f,v| f.first().collexate_ref().le(v),
1000 |idx| idx == 0,
1001 )
1002 }
1003
1004 pub(crate) fn find_in(
1007 &self,
1008 target: V,
1009 next: fn(usize) -> usize,
1010 thing_idx: fn(&CollexField<E, V>) -> Option<Result<usize, usize>>,
1011 cmp: fn(&FieldIn<E, V>, &V) -> bool,
1012 is_edge: impl Fn(usize) -> bool,
1013 ) -> Option<&E> {
1014 let t_idx =
1015 if self.span().start().ge(&target) {
1016 0
1017 } else if self.span().end().map(|v|v.le(&target)).unwrap_or(false) {
1018 self.len()-1
1019 } else {
1020 self.get_index(&target).ok()?
1021 };
1022 let f_idx = match thing_idx(&self.items[t_idx])? {
1027 Ok(idx) => {
1028 if cmp(&self.items[idx].as_thing().1, &target) {
1029 idx
1030 } else {
1031 if is_edge(idx) {
1032 return None
1033 } else {
1034 next(idx)
1035 }
1036 }
1037 }
1038 Err(idx) => {
1039 idx
1040 }
1041 };
1042
1043 match self.items[f_idx].as_thing().1 {
1045 Field::Elem(e) => {Some(e)}
1046 Field::Collex(collex) => {
1047 collex.find_in(
1048 target,
1049 next,
1050 thing_idx,
1051 cmp,
1052 is_edge
1053 )}
1054 }
1055 }
1056
1057 pub fn find_closest(&self, target: V) -> Option<&E> {
1061 use RawField::*;
1062 use Field::*;
1063
1064 let t_idx =
1065 if self.span().start().ge(&target) {
1066 0
1067 } else if self.span().end().map(|v|v.le(&target)).unwrap_or(false) {
1068 self.len()-1
1069 } else {
1070 self.get_index(&target).ok()?
1071 };
1072 match &self.items[t_idx] {
1080 Thing(field) => {
1081 let first = field.1.first();
1082 if target.ge(first.collexate_ref()){
1083 let last = field.1.last();
1084 if target.le(last.collexate_ref()) {
1085 match &field.1 {
1086 Collex(c) => {
1087 c.find_closest(target)
1088 }
1089 Elem(e) => Some(&e),
1090 }
1091 } else { Some(
1093 if t_idx < self.len() {
1094 self.items.get(t_idx + 1)
1095 .map(|v|
1096 self.thing_dist_cmp_get(target, last,
1097 v.as_thing().1.first()
1098 )
1099 )
1100 .unwrap_or(last)
1101 } else{
1102 last
1103 }
1104 )
1105 }
1106 } else { Some(
1108 if t_idx != 0 {
1109 self.items.get(t_idx-1)
1110 .map(|v|
1111 self.thing_dist_cmp_get(target,
1112 v.as_thing().1.last(),
1113 first
1114 )
1115 )
1116 .unwrap_or(first)
1117 } else {
1118 first
1119 }
1120 )
1121 }
1122 }
1123 Next(ans) => Some(&self.items[*ans].as_thing().1.first()),
1124 Prev(ans) => Some(&self.items[*ans].as_thing().1.last()),
1125 Among(prev,next) => {
1126 let prev = self.items[*prev].as_thing().1.last();
1127 let next = self.items[*next].as_thing().1.first();
1128 Some(self.thing_dist_cmp_get(target, prev, next))
1129 }
1130 Void => None,
1131 }
1132 }
1133
1134 pub(crate) fn thing_dist_cmp_get<'a>(&'a self, target:V, prev: &'a E, next: &'a E) -> &'a E{
1135 use std::cmp::Ordering::*;
1136 match dist_cmp(target, prev.collexate(), next.collexate()){
1137 Less => {prev}
1138 Equal => {prev}
1140 Greater => {next}
1141 }
1142 }
1143
1144 pub fn is_empty(&self) -> bool {
1148 self.items.is_empty() || matches!(self.items[0], RawField::Void)
1149 }
1150
1151 pub(crate) fn get_index(
1155 &self,
1156 target: &V,
1157 ) -> GetIndexResult<usize> {
1158 use GetIndexFieldCollexError::*;
1159 if self.is_empty() { return Err(Empty) }
1160 let span = &self.span;
1161 if !span.contains(&target) { return Err(OutOfSpan); }
1162 Ok(self.idx_of(target).min(self.len() - 1))
1164 }
1165
1166 pub fn get(&self, value: V) -> Option<&E> {
1167 let idx = self.idx_of(&value);
1168 if self.contains_idx(idx) {
1169 match &self.items[idx] {
1170 RawField::Thing((_, k)) =>
1171 match k {
1172 Field::Elem(e) => {
1173 if value.eq(e.collexate_ref()) {
1174 Some(e)
1175 } else {
1176 None
1177 }
1178 }
1179 Field::Collex(collex) => { collex.get(value) }
1180 }
1181 _ => None
1182 }
1183 } else { None }
1184 }
1185
1186 pub fn unchecked_get(&self, value: V) -> &E {
1189 let idx = self.idx_of(&value);
1190 match &self.items[idx] {
1191 RawField::Thing((_, k)) =>
1192 match k {
1193 Field::Elem(e) => {
1194 if value.eq(e.collexate_ref()) {
1195 e
1196 } else {
1197 panic!("Called `FieldCollex::unchecked_get_mut()` on a value is not eq to where it points an field's value")
1198 }
1199 }
1200 Field::Collex(collex) => { collex.unchecked_get(value) }
1201 }
1202 _ => panic!("Called `FieldCollex::unchecked_get()` on a value points an empty field")
1203 }
1204 }
1205
1206
1207 pub(crate) fn get_mut(&mut self, value: V) -> Option<&mut E> {
1208 let idx = self.idx_of(&value);
1209 if self.contains_idx(idx) {
1210 match &mut self.items[idx] {
1211 RawField::Thing((_, k)) =>
1212 match k {
1213 Field::Elem(e) => {
1214 if value.eq(e.collexate_ref()) {
1215 Some(e)
1216 } else {
1217 None
1218 }
1219 }
1220 Field::Collex(collex) => { collex.get_mut(value) }
1221 }
1222 _ => None
1223 }
1224 } else { None }
1225 }
1226
1227 pub(crate) fn unchecked_get_mut(&mut self, value: V) -> &mut E {
1228 let idx = self.idx_of(&value);
1229 match &mut self.items[idx] {
1230 RawField::Thing((_, k)) =>
1231 match k {
1232 Field::Elem(e) => {
1233 if value.eq(e.collexate_ref()) {
1234 e
1235 } else {
1236 panic!("Called `FieldCollex::unchecked_get_mut()` on a value is not eq to where it points an field's value")
1237 }
1238 }
1239 Field::Collex(collex) => { collex.unchecked_get_mut(value) }
1240 }
1241 _ => panic!("Called `FieldCollex::unchecked_get_mut()` on a value points an empty field")
1242 }
1243 }
1244
1245 pub fn try_modify<F,R>(&mut self, value: V, op: F) -> ModifyResult<R,R>
1249 where
1250 F: Fn(&mut E) -> R
1251 {
1252 use ModifyFieldCollexError::*;
1253
1254 let elem = self.get_mut(value).ok_or(CannotFind)?;
1255 let old_v = elem.collexate();
1256 let result = op(elem);
1257 if old_v.eq(elem.collexate_ref()) {
1258 Ok(result)
1259 } else {
1260 let new_v = elem.collexate();
1262 *elem.collexate_mut() = old_v;
1263 let mut new_e = self.remove(old_v).unwrap();
1264 *new_e.collexate_mut() = new_v;
1265 match self.insert(new_e) {
1266 Ok(()) => Ok(result),
1267 Err(err) => Err(InsertError(err.map(|mut e| {
1268 *e.collexate_mut() = old_v;
1269 if let Err(_) = self.insert(e) {
1271 panic!("Called `FieldCollex::insert` in `FieldCollex::try_modify` but get an **unexpected** error");
1272 }
1273 result
1274 }))),
1275 }
1276 }
1277 }
1278
1279 pub fn modify<F,R>(&mut self, value: V, op: F) -> ModifyResult<R,(R,E)>
1283 where
1284 F: Fn(&mut E) -> R
1285 {
1286 use ModifyFieldCollexError::*;
1287
1288 let elem = self.get_mut(value).ok_or(CannotFind)?;
1289 let old_v = elem.collexate();
1290 let result = op(elem);
1291 if old_v.eq(elem.collexate_ref()) {
1292 Ok(result)
1293 } else {
1294 let new_v = elem.collexate();
1296 *elem.collexate_mut() = old_v;
1297 let mut new_e = self.remove(old_v).unwrap();
1298 *new_e.collexate_mut() = new_v;
1299 match self.insert(new_e) {
1300 Ok(()) => Ok(result),
1301 Err(err) => Err(InsertError(err.map(|e| (result,e)))),
1302 }
1303 }
1304 }
1305
1306 pub fn unchecked_modify<F,R>(&mut self, value: V, op: F) -> R
1313 where
1314 F: Fn(&mut E) -> R
1315 {
1316 let elem = self.unchecked_get_mut(value);
1317 let old_v = elem.collexate();
1318 let result = op(elem);
1319 if old_v.eq(elem.collexate_ref()) {
1320 } else {
1322 let new_v = elem.collexate();
1324 *elem.collexate_mut() = old_v;
1325 let mut new_e = self.remove(old_v).unwrap();
1326 *new_e.collexate_mut() = new_v;
1327 if let Err(_) = self.insert(new_e) {
1328 panic!("Called `FieldCollex::insert` in `FieldCollex::unchecked_modify` but get an error");
1329 }
1330 }
1331 result
1332 }
1333
1334}
1335
1336#[cfg(test)]
1337mod tests {
1338 use super::*;
1339 use span_core::Span;
1340
1341 #[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
1343 struct TestElem(u32);
1344
1345 impl Collexetable<u32> for TestElem {
1346 fn collexate(&self) -> u32 {
1347 self.0
1348 }
1349
1350 fn collexate_ref(&self) -> &u32 {
1351 &self.0
1352 }
1353
1354 fn collexate_mut(&mut self) -> &mut u32 {
1355 &mut self.0
1356 }
1357 }
1358
1359 #[test]
1361 fn test_basic_construction() {
1362 let finite_span = Span::new_finite(0u32, 100u32);
1364 let unit = 10u32;
1365
1366 let collex = FieldCollex::<TestElem, u32>::new(finite_span.clone(), unit).unwrap();
1368 assert_eq!(collex.span(), &finite_span);
1369 assert_eq!(*collex.unit(), unit);
1370 assert_eq!(collex.size(), Some(10)); assert_eq!(collex.len(), 0);
1372 assert_eq!(collex.capacity(), 0);
1373 assert!(collex.is_empty());
1374
1375 let err_unit_zero = FieldCollex::<TestElem, u32>::new(finite_span.clone(), 0u32).unwrap_err();
1377 assert!(matches!(err_unit_zero, NewFieldCollexError::NonPositiveUnit(_, 0)));
1378
1379 let empty_span = Span::new_finite(5u32, 3u32); let err_empty_span = FieldCollex::<TestElem, u32>::new(empty_span, unit).unwrap_err();
1382 assert!(matches!(err_empty_span, NewFieldCollexError::EmptySpan(_, _)));
1383
1384 let collex_with_cap = FieldCollex::<TestElem, u32>::with_capacity(finite_span, unit, 5).unwrap();
1386 assert_eq!(collex_with_cap.capacity(), 5);
1387 assert!(collex_with_cap.is_empty());
1388
1389 let err_cap_out = FieldCollex::<TestElem, u32>::with_capacity(Span::new_finite(0u32, 100u32), 10u32, 11).unwrap_err();
1391 assert!(matches!(err_cap_out, WithCapacityFieldCollexError::OutOfSize(_, _)));
1392 }
1393
1394 #[test]
1395 fn test_insert_contains() {
1396 let span = Span::new_finite(0u32, 100u32);
1398 let unit = 10u32;
1399 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1400
1401 let elem1 = TestElem(5);
1403 let elem2 = TestElem(15);
1404 assert!(collex.insert(elem1).is_ok());
1405 assert!(collex.insert(elem2).is_ok());
1406
1407 assert!(collex.contains(&elem1));
1409 assert!(collex.contains_value(5u32));
1410 assert!(collex.contains(&elem2));
1411 assert!(!collex.contains(&TestElem(25)));
1412 assert!(!collex.contains_value(25u32));
1413
1414 assert_eq!(collex.first(), Some(&elem1));
1416 assert_eq!(collex.last(), Some(&elem2));
1417
1418 assert!(!collex.is_empty());
1420 }
1421
1422 #[test]
1423 fn test_remove() {
1424 let span = Span::new_finite(0u32, 100u32);
1426 let unit = 10u32;
1427 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1428
1429 let elem = TestElem(5);
1431 collex.insert(elem).unwrap();
1432 let removed = collex.remove(5u32).unwrap();
1433 assert_eq!(removed, elem);
1434
1435 assert!(!collex.contains(&elem));
1437 assert!(!collex.contains_value(5u32));
1438 assert!(collex.is_empty());
1439
1440 let err_remove = collex.remove(10u32).unwrap_err();
1442 assert!(matches!(err_remove, RemoveFieldCollexError::NotExist));
1443 }
1444
1445 #[test]
1446 fn test_extend_try_extend() {
1447 let span = Span::new_finite(0u32, 100u32);
1449 let unit = 10u32;
1450 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1451
1452 let elems = vec![TestElem(5), TestElem(15), TestElem(25)];
1454 collex.extend(elems.clone());
1455 assert!(collex.contains(&TestElem(5)));
1456 assert!(collex.contains(&TestElem(15)));
1457
1458 let elems2 = vec![TestElem(25), TestElem(35), TestElem(105)]; let result = collex.try_extend(elems2);
1461 assert!(!result.out_of_span.is_empty() && result.out_of_span[0].0 == 105);
1463 assert!(!result.already_exist.is_empty() && result.already_exist[0].0 == 25);
1464 assert!(collex.contains(&TestElem(35)));
1465 }
1466
1467 #[test]
1468 fn test_find_methods() {
1469 let span = Span::new_finite(0u32, 100u32);
1471 let unit = 10u32;
1472 let mut collex = FieldCollex::<TestElem, u32>::new(span, unit).unwrap();
1473
1474 let elems = [TestElem(5), TestElem(15), TestElem(25)];
1476 for &e in &elems {
1477 collex.insert(e).unwrap();
1478 }
1479
1480 let gt = collex.find_gt(10u32).unwrap();
1482 assert_eq!(*gt, TestElem(15));
1483
1484 let ge = collex.find_ge(15u32).unwrap();
1486 assert_eq!(*ge, TestElem(15));
1487
1488 let lt = collex.find_lt(20u32).unwrap();
1490 assert_eq!(*lt, TestElem(15));
1491
1492 let le = collex.find_le(25u32).unwrap();
1494 assert_eq!(*le, TestElem(25));
1495
1496 let err_find = collex.find_gt(30u32);
1498 assert!(matches!(err_find, None));
1499 }
1500
1501 #[test]
1502 fn test_with_elements() {
1503 let span = Span::new_finite(0u32, 100u32);
1505 let unit = 50u32;
1507 let elems = vec![TestElem(5), TestElem(15), TestElem(25), TestElem(105)]; let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1511 assert!(collex.contains(&TestElem(5)));
1513 assert!(collex.contains(&TestElem(15)));
1514 assert!(!collex.contains(&TestElem(105)));
1515 assert_eq!(collex.first(), Some(&TestElem(5)));
1516 assert_eq!(collex.last(), Some(&TestElem(25)));
1517 }
1518
1519
1520 #[test]
1521 fn test_find_closest() {
1522 let span = Span::new_finite(0u32, 100u32);
1524 let unit = 50u32;
1526 let elems = vec![TestElem(5), TestElem(15), TestElem(25), TestElem(105)]; let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1530 assert_eq!(collex.find_closest(5), Some(&TestElem(5)));
1532 assert_eq!(collex.find_closest(25), Some(&TestElem(25)));
1533 assert_eq!(collex.find_closest(10), Some(&TestElem(5)));
1535 assert_eq!(collex.find_closest(20), Some(&TestElem(15)));
1536 assert_eq!(collex.find_closest(114514), Some(&TestElem(25)));
1538 assert_eq!(collex.find_closest(0), Some(&TestElem(5)));
1540 assert_eq!(collex.find_closest(100), Some(&TestElem(25)));
1542 }
1543
1544 #[test]
1545 fn test_get() {
1546 let span = Span::new_finite(0u32, 100u32);
1548 let unit = 10u32;
1549 let elems = vec![TestElem(5), TestElem(15), TestElem(25)];
1550
1551 let collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1553 assert_eq!(collex.get(5), Some(&TestElem(5)));
1554 assert_eq!(collex.unchecked_get(15), &TestElem(15));
1555 assert_eq!(collex.get(25), Some(&TestElem(25)));
1556 assert_eq!(collex.get(0), None);
1557 assert_eq!(collex.get(10), None);
1558 assert_eq!(collex.get(114514), None);
1559 }
1560
1561 #[test]
1562 fn test_modify() {
1563 let span = Span::new_finite(0u32, 100u32);
1565 let unit = 10u32;
1566 let elems = vec![TestElem(5), TestElem(25), TestElem(35), TestElem(45)];
1567
1568 let mut collex = FieldCollex::<TestElem, u32>::with_elements(span, unit, elems).unwrap();
1570
1571 assert_eq!(collex.first(), Some(&TestElem(5)));
1572
1573 collex.modify(5,|_| ()).unwrap();
1576 assert_eq!(collex.first(), Some(&TestElem(5)));
1577
1578 collex.modify(5,|v| v.0=1 ).unwrap();
1580 assert_eq!(collex.first(), Some(&TestElem(1)));
1581
1582 let _ans = collex.modify(1,|v| v.0=15 );
1584 assert_eq!(collex.first(), Some(&TestElem(15)));
1585
1586 collex.modify(15,|v| v.0=26 ).unwrap();
1588 assert_eq!(collex.first(), Some(&TestElem(25)));
1589
1590 let _ans = collex.modify(45,|v| v.0=0 );
1592 assert_eq!(collex.first(), Some(&TestElem(0)));
1593
1594 let ans = collex.modify(0,|v| v.0=123 );
1596 assert!(matches!(ans, Err(ModifyFieldCollexError::InsertError(InsertFieldCollexError::OutOfSpan(((),TestElem(123)))))));
1597 assert_eq!(collex.first(), Some(&TestElem(25)));
1598
1599 let ans = collex.try_modify(25,|v| v.0=123 );
1601 assert!(matches!(ans, Err(ModifyFieldCollexError::InsertError(InsertFieldCollexError::OutOfSpan(()) )) ));
1602 assert_eq!(collex.first(), Some(&TestElem(25)));
1603 }
1604}