pub struct Root<S>where
S: SplaySpec,{
root: Option<NodeRef<Owned, S>>,
}Fields§
§root: Option<NodeRef<Owned, S>>Implementations§
Source§impl<S> Root<S>where
S: SplaySpec,
impl<S> Root<S>where
S: SplaySpec,
Sourcepub fn new(root: Option<NodeRef<Owned, S>>) -> Self
pub fn new(root: Option<NodeRef<Owned, S>>) -> Self
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 468)
466 unsafe fn from_single_nodes_inner(nodes: &[NodeRef<marker::Owned, S>]) -> Self {
467 if nodes.is_empty() {
468 Self::new(None)
469 } else {
470 let m = nodes.len() / 2;
471 let left = unsafe { Self::from_single_nodes_inner(&nodes[..m]) };
472 let right = unsafe { Self::from_single_nodes_inner(&nodes[m + 1..]) };
473 let mut node = NodeRef::new(nodes[m].node);
474 node.borrow_mut().set_left(left.root);
475 node.borrow_mut().set_right(right.root);
476 S::bottom_up(node.borrow_datamut());
477 Self::new(Some(node))
478 }
479 }
480 pub fn is_empty(&self) -> bool {
481 self.root.is_none()
482 }
483 pub fn root(&self) -> Option<NodeRef<marker::Immut<'_>, S>> {
484 Some(self.root.as_ref()?.reborrow())
485 }
486 pub fn root_data_mut(&mut self) -> Option<NodeRef<marker::DataMut<'_>, S>> {
487 Some(self.root.as_mut()?.borrow_datamut())
488 }
489 pub fn splay_by<Seeker>(&mut self, seeker: Seeker) -> Option<Ordering>
490 where
491 Seeker: SplaySeeker<S = S>,
492 {
493 let (ord, root) = self.root.take()?.splay_by(seeker);
494 self.root = Some(root);
495 Some(ord)
496 }
497 pub fn insert_left(&mut self, mut node: NodeRef<marker::Owned, S>) {
498 self.root = Some(match self.root.take() {
499 Some(root) => root.insert_left(node),
500 None => {
501 S::bottom_up(node.borrow_datamut());
502 node
503 }
504 });
505 }
506 pub fn insert_right(&mut self, mut node: NodeRef<marker::Owned, S>) {
507 self.root = Some(match self.root.take() {
508 Some(root) => root.insert_right(node),
509 None => {
510 S::bottom_up(node.borrow_datamut());
511 node
512 }
513 });
514 }
515 pub fn insert_first(&mut self, mut node: NodeRef<marker::Owned, S>) {
516 self.root = Some(match self.root.take() {
517 Some(root) => root.insert_first(node),
518 None => {
519 S::bottom_up(node.borrow_datamut());
520 node
521 }
522 });
523 }
524 pub fn insert_last(&mut self, mut node: NodeRef<marker::Owned, S>) {
525 self.root = Some(match self.root.take() {
526 Some(root) => root.insert_last(node),
527 None => {
528 S::bottom_up(node.borrow_datamut());
529 node
530 }
531 });
532 }
533 pub fn take_root(&mut self) -> Option<NodeRef<marker::Owned, S>> {
534 let mut root = self.root.take()?;
535 let right = root.borrow_mut().take_right();
536 self.root = root.borrow_mut().take_left();
537 self.append(&mut Self::new(right));
538 Some(root)
539 }
540 pub fn take_first(&mut self) -> Option<NodeRef<marker::Owned, S>> {
541 let mut root = self.root.take()?.splay_by(SeekLeft::new()).1;
542 let right = root.borrow_mut().take_right();
543 self.root = right;
544 Some(root)
545 }
546 pub fn take_last(&mut self) -> Option<NodeRef<marker::Owned, S>> {
547 let mut root = self.root.take()?.splay_by(SeekRight::new()).1;
548 let left = root.borrow_mut().take_left();
549 self.root = left;
550 Some(root)
551 }
552 pub fn split_left(&mut self) -> Option<NodeRef<marker::Owned, S>> {
553 let root = self.root.as_mut()?;
554 let left = root.borrow_mut().take_left();
555 S::bottom_up(root.borrow_datamut());
556 left
557 }
558 pub fn split_right(&mut self) -> Option<NodeRef<marker::Owned, S>> {
559 let root = self.root.as_mut()?;
560 let right = root.borrow_mut().take_right();
561 S::bottom_up(root.borrow_datamut());
562 right
563 }
564 pub fn split_left_eq(&mut self) -> Option<NodeRef<marker::Owned, S>> {
565 let right = self.split_right();
566 replace(&mut self.root, right)
567 }
568 pub fn split_right_eq(&mut self) -> Option<NodeRef<marker::Owned, S>> {
569 let left = self.split_left();
570 replace(&mut self.root, left)
571 }
572 pub fn append(&mut self, other: &mut Self) {
573 self.root = match (self.root.take(), other.root.take()) {
574 (Some(node), None) | (None, Some(node)) => Some(node),
575 (Some(left), Some(right)) => Some(left.merge(right)),
576 (None, None) => None,
577 }
578 }
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }
613}
614
615impl<S> Debug for Root<S>
616where
617 S: SplaySpec<T: Debug>,
618{
619 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
620 fn fmt_recurse<'a, S>(
621 node: NodeRef<marker::Immut<'a>, S>,
622 f: &mut fmt::Formatter<'_>,
623 ) -> fmt::Result
624 where
625 S: SplaySpec<T: 'a + Debug>,
626 {
627 write!(f, "[")?;
628 if let Some(left) = node.left() {
629 fmt_recurse(left, f)?;
630 }
631 node.data().fmt(f)?;
632 if let Some(right) = node.right() {
633 fmt_recurse(right, f)?;
634 }
635 write!(f, "]")?;
636 Ok(())
637 }
638 if let Some(root) = self.root.as_ref() {
639 let root = root.reborrow();
640 fmt_recurse(root, f)?;
641 }
642 Ok(())
643 }
644}
645
646pub struct NodeRange<'a, S>
647where
648 S: SplaySpec<T: 'a>,
649{
650 front: Root<S>,
651 back: Root<S>,
652 root: &'a mut Root<S>,
653}
654
655impl<'a, S> Debug for NodeRange<'a, S>
656where
657 S: SplaySpec<T: 'a + Debug>,
658{
659 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
660 f.debug_struct("NodeRange")
661 .field("front", &self.front)
662 .field("back", &self.back)
663 .field("root", &self.root)
664 .finish()
665 }
666}
667impl<'a, S> NodeRange<'a, S>
668where
669 S: SplaySpec<T: 'a>,
670{
671 pub fn new(root: &'a mut Root<S>) -> Self {
672 Self {
673 front: Default::default(),
674 back: Default::default(),
675 root,
676 }
677 }
678 pub fn three_way(
679 front: Option<NodeRef<marker::Owned, S>>,
680 root: &'a mut Root<S>,
681 back: Option<NodeRef<marker::Owned, S>>,
682 ) -> Self {
683 Self {
684 front: Root::new(front),
685 back: Root::new(back),
686 root,
687 }
688 }Sourcepub unsafe fn from_single_nodes(nodes: Vec<NodeRef<Owned, S>>) -> Self
pub unsafe fn from_single_nodes(nodes: Vec<NodeRef<Owned, S>>) -> Self
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 460)
438 fn extend<I>(&mut self, iter: I)
439 where
440 I: IntoIterator<Item = T::Key>,
441 {
442 let nodes: Vec<_> = unsafe {
443 iter.into_iter()
444 .map(|key| {
445 let agg = T::single_agg(&key);
446 NodeRef::from_data(
447 LazyAggElement {
448 key,
449 agg,
450 lazy: T::act_unit(),
451 size: 1,
452 rev: false,
453 },
454 self.alloc.deref_mut(),
455 )
456 })
457 .collect()
458 };
459 self.length += nodes.len();
460 let mut root = unsafe { Root::from_single_nodes(nodes) };
461 self.root.append(&mut root);
462 }Sourceunsafe fn from_single_nodes_inner(nodes: &[NodeRef<Owned, S>]) -> Self
unsafe fn from_single_nodes_inner(nodes: &[NodeRef<Owned, S>]) -> Self
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 464)
463 pub unsafe fn from_single_nodes(nodes: Vec<NodeRef<marker::Owned, S>>) -> Self {
464 unsafe { Self::from_single_nodes_inner(&nodes) }
465 }
466 unsafe fn from_single_nodes_inner(nodes: &[NodeRef<marker::Owned, S>]) -> Self {
467 if nodes.is_empty() {
468 Self::new(None)
469 } else {
470 let m = nodes.len() / 2;
471 let left = unsafe { Self::from_single_nodes_inner(&nodes[..m]) };
472 let right = unsafe { Self::from_single_nodes_inner(&nodes[m + 1..]) };
473 let mut node = NodeRef::new(nodes[m].node);
474 node.borrow_mut().set_left(left.root);
475 node.borrow_mut().set_right(right.root);
476 S::bottom_up(node.borrow_datamut());
477 Self::new(Some(node))
478 }
479 }Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 583)
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }Sourcepub fn root(&self) -> Option<NodeRef<Immut<'_>, S>>
pub fn root(&self) -> Option<NodeRef<Immut<'_>, S>>
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 334)
330 pub fn fold<R>(&mut self, range: R) -> T::Agg
331 where
332 R: RangeBounds<usize>,
333 {
334 if let Some(root) = self.range(range).root().root() {
335 root.data().agg.clone()
336 } else {
337 T::agg_unit()
338 }
339 }
340 pub fn reverse<R>(&mut self, range: R)
341 where
342 R: RangeBounds<usize>,
343 {
344 if let Some(root) = self.range(range).root_mut().root_data_mut() {
345 LazyAggSplay::<T>::reverse(root);
346 }
347 }
348 pub fn get(&mut self, index: usize) -> Option<&T::Key> {
349 self.root.splay_by(SeekBySize::new(index))?;
350 self.root.root().map(|root| &root.data().key)
351 }
352 pub fn modify<F>(&mut self, index: usize, f: F)
353 where
354 F: FnOnce(&T::Key) -> T::Key,
355 {
356 self.root.splay_by(SeekBySize::new(index)).unwrap();
357 let data = self.root.root_data_mut().unwrap().data_mut();
358 data.key = f(&data.key);
359 LazyAggSplay::<T>::bottom_up(self.root.root_data_mut().unwrap());
360 }
361 pub fn insert(&mut self, index: usize, x: T::Key) {
362 assert!(index <= self.length);
363 self.root.splay_by(SeekBySize::new(index));
364 let agg = T::single_agg(&x);
365 unsafe {
366 let node = NodeRef::from_data(
367 LazyAggElement {
368 key: x,
369 agg,
370 lazy: T::act_unit(),
371 size: 1,
372 rev: false,
373 },
374 self.alloc.deref_mut(),
375 );
376 if index == self.length {
377 self.root.insert_right(node);
378 } else {
379 self.root.insert_left(node);
380 }
381 }
382 self.length += 1;
383 }
384 pub fn remove(&mut self, index: usize) -> Option<T::Key> {
385 if index >= self.length {
386 return None;
387 }
388 self.root.splay_by(SeekBySize::new(index));
389 self.length -= 1;
390 let node = self.root.take_root().unwrap().into_dying();
391 unsafe { Some(node.into_data(self.alloc.deref_mut()).key) }
392 }
393 pub fn position_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
394 where
395 R: RangeBounds<usize>,
396 F: FnMut(&T::Agg) -> bool,
397 {
398 let mut range = self.range(range);
399 let ord = range.root_mut().splay_by(SeekByAccCond::new(f));
400 if !matches!(ord, Some(Ordering::Equal)) {
401 return None;
402 }
403 let front_size = range.front().size();
404 let left_size = range.root().left_size();
405 Some(front_size + left_size)
406 }
407 pub fn rposition_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
408 where
409 R: RangeBounds<usize>,
410 F: FnMut(&T::Agg) -> bool,
411 {
412 let mut range = self.range(range);
413 let ord = range.root_mut().splay_by(SeekByRaccCond::new(f));
414 if !matches!(ord, Some(Ordering::Equal)) {
415 return None;
416 }
417 let front_size = range.front().size();
418 let left_size = range.root().left_size();
419 Some(front_size + left_size)
420 }
421 pub fn rotate_left(&mut self, mid: usize) {
422 assert!(mid <= self.length);
423 if mid != 0 || mid != self.length {
424 self.range(mid..).drop_rotate_left()
425 }
426 }
427 pub fn rotate_right(&mut self, k: usize) {
428 assert!(k <= self.length);
429 self.rotate_left(self.length - k);
430 }
431}
432
433impl<T, A> Extend<T::Key> for SplaySequence<T, A>
434where
435 T: LazyMapMonoid,
436 A: Allocator<Node<LazyAggElement<T>>>,
437{
438 fn extend<I>(&mut self, iter: I)
439 where
440 I: IntoIterator<Item = T::Key>,
441 {
442 let nodes: Vec<_> = unsafe {
443 iter.into_iter()
444 .map(|key| {
445 let agg = T::single_agg(&key);
446 NodeRef::from_data(
447 LazyAggElement {
448 key,
449 agg,
450 lazy: T::act_unit(),
451 size: 1,
452 rev: false,
453 },
454 self.alloc.deref_mut(),
455 )
456 })
457 .collect()
458 };
459 self.length += nodes.len();
460 let mut root = unsafe { Root::from_single_nodes(nodes) };
461 self.root.append(&mut root);
462 }
463}
464
465impl<T> Root<LazyAggSplay<T>>
466where
467 T: LazyMapMonoid,
468{
469 fn size(&self) -> usize {
470 self.root().map(|root| root.data().size).unwrap_or_default()
471 }
472 fn left_size(&self) -> usize {
473 self.root()
474 .and_then(|root| root.left().map(|left| left.data().size))
475 .unwrap_or_default()
476 }More examples
crates/competitive/src/data_structure/splay_tree/sized_map.rs (line 171)
163 pub fn get_key_value<Q>(&mut self, key: &Q) -> Option<(&K, &V)>
164 where
165 K: Borrow<Q>,
166 Q: Ord + ?Sized,
167 {
168 if !matches!(self.splay_by_key(key)?, Ordering::Equal) {
169 return None;
170 }
171 self.root.root().map(|node| {
172 let ((k, v), _) = node.data();
173 (k, v)
174 })
175 }
176 fn splay_at(&mut self, index: usize) -> Option<Ordering> {
177 self.root.splay_by(SeekBySize::new(index))
178 }
179 pub fn get_key_value_at(&mut self, index: usize) -> Option<(&K, &V)> {
180 if index >= self.length {
181 return None;
182 }
183 self.splay_at(index);
184 self.root.root().map(|node| {
185 let ((k, v), _) = node.data();
186 (k, v)
187 })
188 }Sourcepub fn root_data_mut(&mut self) -> Option<NodeRef<DataMut<'_>, S>>
pub fn root_data_mut(&mut self) -> Option<NodeRef<DataMut<'_>, S>>
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 326)
322 pub fn update<R>(&mut self, range: R, x: T::Act)
323 where
324 R: RangeBounds<usize>,
325 {
326 if let Some(root) = self.range(range).root_mut().root_data_mut() {
327 LazyAggSplay::<T>::update_lazy(root, &x);
328 }
329 }
330 pub fn fold<R>(&mut self, range: R) -> T::Agg
331 where
332 R: RangeBounds<usize>,
333 {
334 if let Some(root) = self.range(range).root().root() {
335 root.data().agg.clone()
336 } else {
337 T::agg_unit()
338 }
339 }
340 pub fn reverse<R>(&mut self, range: R)
341 where
342 R: RangeBounds<usize>,
343 {
344 if let Some(root) = self.range(range).root_mut().root_data_mut() {
345 LazyAggSplay::<T>::reverse(root);
346 }
347 }
348 pub fn get(&mut self, index: usize) -> Option<&T::Key> {
349 self.root.splay_by(SeekBySize::new(index))?;
350 self.root.root().map(|root| &root.data().key)
351 }
352 pub fn modify<F>(&mut self, index: usize, f: F)
353 where
354 F: FnOnce(&T::Key) -> T::Key,
355 {
356 self.root.splay_by(SeekBySize::new(index)).unwrap();
357 let data = self.root.root_data_mut().unwrap().data_mut();
358 data.key = f(&data.key);
359 LazyAggSplay::<T>::bottom_up(self.root.root_data_mut().unwrap());
360 }More examples
crates/competitive/src/data_structure/splay_tree/sized_map.rs (line 198)
189 pub fn insert(&mut self, key: K, value: V) -> Option<V>
190 where
191 K: Ord,
192 {
193 let ord = self.splay_by_key(&key);
194 self.length += (ord != Some(Ordering::Equal)) as usize;
195 match ord {
196 Some(Ordering::Equal) => {
197 return Some(replace(
198 &mut (self.root.root_data_mut().unwrap().data_mut().0).1,
199 value,
200 ));
201 }
202 Some(Ordering::Less) => unsafe {
203 self.root.insert_left(NodeRef::from_data(
204 ((key, value), 1),
205 self.alloc.deref_mut(),
206 ));
207 },
208 _ => unsafe {
209 self.root.insert_right(NodeRef::from_data(
210 ((key, value), 1),
211 self.alloc.deref_mut(),
212 ));
213 },
214 }
215 None
216 }Sourcepub fn splay_by<Seeker>(&mut self, seeker: Seeker) -> Option<Ordering>where
Seeker: SplaySeeker<S = S>,
pub fn splay_by<Seeker>(&mut self, seeker: Seeker) -> Option<Ordering>where
Seeker: SplaySeeker<S = S>,
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 349)
348 pub fn get(&mut self, index: usize) -> Option<&T::Key> {
349 self.root.splay_by(SeekBySize::new(index))?;
350 self.root.root().map(|root| &root.data().key)
351 }
352 pub fn modify<F>(&mut self, index: usize, f: F)
353 where
354 F: FnOnce(&T::Key) -> T::Key,
355 {
356 self.root.splay_by(SeekBySize::new(index)).unwrap();
357 let data = self.root.root_data_mut().unwrap().data_mut();
358 data.key = f(&data.key);
359 LazyAggSplay::<T>::bottom_up(self.root.root_data_mut().unwrap());
360 }
361 pub fn insert(&mut self, index: usize, x: T::Key) {
362 assert!(index <= self.length);
363 self.root.splay_by(SeekBySize::new(index));
364 let agg = T::single_agg(&x);
365 unsafe {
366 let node = NodeRef::from_data(
367 LazyAggElement {
368 key: x,
369 agg,
370 lazy: T::act_unit(),
371 size: 1,
372 rev: false,
373 },
374 self.alloc.deref_mut(),
375 );
376 if index == self.length {
377 self.root.insert_right(node);
378 } else {
379 self.root.insert_left(node);
380 }
381 }
382 self.length += 1;
383 }
384 pub fn remove(&mut self, index: usize) -> Option<T::Key> {
385 if index >= self.length {
386 return None;
387 }
388 self.root.splay_by(SeekBySize::new(index));
389 self.length -= 1;
390 let node = self.root.take_root().unwrap().into_dying();
391 unsafe { Some(node.into_data(self.alloc.deref_mut()).key) }
392 }
393 pub fn position_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
394 where
395 R: RangeBounds<usize>,
396 F: FnMut(&T::Agg) -> bool,
397 {
398 let mut range = self.range(range);
399 let ord = range.root_mut().splay_by(SeekByAccCond::new(f));
400 if !matches!(ord, Some(Ordering::Equal)) {
401 return None;
402 }
403 let front_size = range.front().size();
404 let left_size = range.root().left_size();
405 Some(front_size + left_size)
406 }
407 pub fn rposition_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
408 where
409 R: RangeBounds<usize>,
410 F: FnMut(&T::Agg) -> bool,
411 {
412 let mut range = self.range(range);
413 let ord = range.root_mut().splay_by(SeekByRaccCond::new(f));
414 if !matches!(ord, Some(Ordering::Equal)) {
415 return None;
416 }
417 let front_size = range.front().size();
418 let left_size = range.root().left_size();
419 Some(front_size + left_size)
420 }More examples
crates/competitive/src/data_structure/splay_tree/sized_map.rs (line 161)
156 fn splay_by_key<Q>(&mut self, key: &Q) -> Option<Ordering>
157 where
158 K: Borrow<Q>,
159 Q: Ord + ?Sized,
160 {
161 self.root.splay_by(SeekByKey::new(key))
162 }
163 pub fn get_key_value<Q>(&mut self, key: &Q) -> Option<(&K, &V)>
164 where
165 K: Borrow<Q>,
166 Q: Ord + ?Sized,
167 {
168 if !matches!(self.splay_by_key(key)?, Ordering::Equal) {
169 return None;
170 }
171 self.root.root().map(|node| {
172 let ((k, v), _) = node.data();
173 (k, v)
174 })
175 }
176 fn splay_at(&mut self, index: usize) -> Option<Ordering> {
177 self.root.splay_by(SeekBySize::new(index))
178 }crates/competitive/src/data_structure/splay_tree/node.rs (line 587)
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }Sourcepub fn insert_left(&mut self, node: NodeRef<Owned, S>)
pub fn insert_left(&mut self, node: NodeRef<Owned, S>)
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 379)
361 pub fn insert(&mut self, index: usize, x: T::Key) {
362 assert!(index <= self.length);
363 self.root.splay_by(SeekBySize::new(index));
364 let agg = T::single_agg(&x);
365 unsafe {
366 let node = NodeRef::from_data(
367 LazyAggElement {
368 key: x,
369 agg,
370 lazy: T::act_unit(),
371 size: 1,
372 rev: false,
373 },
374 self.alloc.deref_mut(),
375 );
376 if index == self.length {
377 self.root.insert_right(node);
378 } else {
379 self.root.insert_left(node);
380 }
381 }
382 self.length += 1;
383 }More examples
crates/competitive/src/data_structure/splay_tree/sized_map.rs (lines 203-206)
189 pub fn insert(&mut self, key: K, value: V) -> Option<V>
190 where
191 K: Ord,
192 {
193 let ord = self.splay_by_key(&key);
194 self.length += (ord != Some(Ordering::Equal)) as usize;
195 match ord {
196 Some(Ordering::Equal) => {
197 return Some(replace(
198 &mut (self.root.root_data_mut().unwrap().data_mut().0).1,
199 value,
200 ));
201 }
202 Some(Ordering::Less) => unsafe {
203 self.root.insert_left(NodeRef::from_data(
204 ((key, value), 1),
205 self.alloc.deref_mut(),
206 ));
207 },
208 _ => unsafe {
209 self.root.insert_right(NodeRef::from_data(
210 ((key, value), 1),
211 self.alloc.deref_mut(),
212 ));
213 },
214 }
215 None
216 }Sourcepub fn insert_right(&mut self, node: NodeRef<Owned, S>)
pub fn insert_right(&mut self, node: NodeRef<Owned, S>)
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 377)
361 pub fn insert(&mut self, index: usize, x: T::Key) {
362 assert!(index <= self.length);
363 self.root.splay_by(SeekBySize::new(index));
364 let agg = T::single_agg(&x);
365 unsafe {
366 let node = NodeRef::from_data(
367 LazyAggElement {
368 key: x,
369 agg,
370 lazy: T::act_unit(),
371 size: 1,
372 rev: false,
373 },
374 self.alloc.deref_mut(),
375 );
376 if index == self.length {
377 self.root.insert_right(node);
378 } else {
379 self.root.insert_left(node);
380 }
381 }
382 self.length += 1;
383 }More examples
crates/competitive/src/data_structure/splay_tree/sized_map.rs (lines 209-212)
189 pub fn insert(&mut self, key: K, value: V) -> Option<V>
190 where
191 K: Ord,
192 {
193 let ord = self.splay_by_key(&key);
194 self.length += (ord != Some(Ordering::Equal)) as usize;
195 match ord {
196 Some(Ordering::Equal) => {
197 return Some(replace(
198 &mut (self.root.root_data_mut().unwrap().data_mut().0).1,
199 value,
200 ));
201 }
202 Some(Ordering::Less) => unsafe {
203 self.root.insert_left(NodeRef::from_data(
204 ((key, value), 1),
205 self.alloc.deref_mut(),
206 ));
207 },
208 _ => unsafe {
209 self.root.insert_right(NodeRef::from_data(
210 ((key, value), 1),
211 self.alloc.deref_mut(),
212 ));
213 },
214 }
215 None
216 }Sourcepub fn insert_first(&mut self, node: NodeRef<Owned, S>)
pub fn insert_first(&mut self, node: NodeRef<Owned, S>)
Sourcepub fn insert_last(&mut self, node: NodeRef<Owned, S>)
pub fn insert_last(&mut self, node: NodeRef<Owned, S>)
Sourcepub fn take_root(&mut self) -> Option<NodeRef<Owned, S>>
pub fn take_root(&mut self) -> Option<NodeRef<Owned, S>>
Examples found in repository?
More examples
crates/competitive/src/data_structure/splay_tree/sized_map.rs (line 226)
217 pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
218 where
219 K: Borrow<Q>,
220 Q: Ord + ?Sized,
221 {
222 if !matches!(self.splay_by_key(key)?, Ordering::Equal) {
223 return None;
224 }
225 self.length -= 1;
226 let node = self.root.take_root().unwrap().into_dying();
227 unsafe { Some((node.into_data(self.alloc.deref_mut()).0).1) }
228 }
229 pub fn remove_at(&mut self, index: usize) -> Option<(K, V)> {
230 if index >= self.length {
231 return None;
232 }
233 self.splay_at(index);
234 self.length -= 1;
235 let node = self.root.take_root().unwrap().into_dying();
236 unsafe { Some(node.into_data(self.alloc.deref_mut()).0) }
237 }Sourcepub fn take_first(&mut self) -> Option<NodeRef<Owned, S>>
pub fn take_first(&mut self) -> Option<NodeRef<Owned, S>>
Examples found in repository?
More examples
Sourcepub fn split_left(&mut self) -> Option<NodeRef<Owned, S>>
pub fn split_left(&mut self) -> Option<NodeRef<Owned, S>>
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 569)
568 pub fn split_right_eq(&mut self) -> Option<NodeRef<marker::Owned, S>> {
569 let left = self.split_left();
570 replace(&mut self.root, left)
571 }
572 pub fn append(&mut self, other: &mut Self) {
573 self.root = match (self.root.take(), other.root.take()) {
574 (Some(node), None) | (None, Some(node)) => Some(node),
575 (Some(left), Some(right)) => Some(left.merge(right)),
576 (None, None) => None,
577 }
578 }
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }Sourcepub fn split_right(&mut self) -> Option<NodeRef<Owned, S>>
pub fn split_right(&mut self) -> Option<NodeRef<Owned, S>>
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 565)
564 pub fn split_left_eq(&mut self) -> Option<NodeRef<marker::Owned, S>> {
565 let right = self.split_right();
566 replace(&mut self.root, right)
567 }
568 pub fn split_right_eq(&mut self) -> Option<NodeRef<marker::Owned, S>> {
569 let left = self.split_left();
570 replace(&mut self.root, left)
571 }
572 pub fn append(&mut self, other: &mut Self) {
573 self.root = match (self.root.take(), other.root.take()) {
574 (Some(node), None) | (None, Some(node)) => Some(node),
575 (Some(left), Some(right)) => Some(left.merge(right)),
576 (None, None) => None,
577 }
578 }
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }Sourcepub fn split_left_eq(&mut self) -> Option<NodeRef<Owned, S>>
pub fn split_left_eq(&mut self) -> Option<NodeRef<Owned, S>>
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 603)
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }Sourcepub fn split_right_eq(&mut self) -> Option<NodeRef<Owned, S>>
pub fn split_right_eq(&mut self) -> Option<NodeRef<Owned, S>>
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 589)
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }Sourcepub fn append(&mut self, other: &mut Self)
pub fn append(&mut self, other: &mut Self)
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/node.rs (line 537)
533 pub fn take_root(&mut self) -> Option<NodeRef<marker::Owned, S>> {
534 let mut root = self.root.take()?;
535 let right = root.borrow_mut().take_right();
536 self.root = root.borrow_mut().take_left();
537 self.append(&mut Self::new(right));
538 Some(root)
539 }
540 pub fn take_first(&mut self) -> Option<NodeRef<marker::Owned, S>> {
541 let mut root = self.root.take()?.splay_by(SeekLeft::new()).1;
542 let right = root.borrow_mut().take_right();
543 self.root = right;
544 Some(root)
545 }
546 pub fn take_last(&mut self) -> Option<NodeRef<marker::Owned, S>> {
547 let mut root = self.root.take()?.splay_by(SeekRight::new()).1;
548 let left = root.borrow_mut().take_left();
549 self.root = left;
550 Some(root)
551 }
552 pub fn split_left(&mut self) -> Option<NodeRef<marker::Owned, S>> {
553 let root = self.root.as_mut()?;
554 let left = root.borrow_mut().take_left();
555 S::bottom_up(root.borrow_datamut());
556 left
557 }
558 pub fn split_right(&mut self) -> Option<NodeRef<marker::Owned, S>> {
559 let root = self.root.as_mut()?;
560 let right = root.borrow_mut().take_right();
561 S::bottom_up(root.borrow_datamut());
562 right
563 }
564 pub fn split_left_eq(&mut self) -> Option<NodeRef<marker::Owned, S>> {
565 let right = self.split_right();
566 replace(&mut self.root, right)
567 }
568 pub fn split_right_eq(&mut self) -> Option<NodeRef<marker::Owned, S>> {
569 let left = self.split_left();
570 replace(&mut self.root, left)
571 }
572 pub fn append(&mut self, other: &mut Self) {
573 self.root = match (self.root.take(), other.root.take()) {
574 (Some(node), None) | (None, Some(node)) => Some(node),
575 (Some(left), Some(right)) => Some(left.merge(right)),
576 (None, None) => None,
577 }
578 }
579 pub fn range<Seeker>(&mut self, start: Bound<Seeker>, end: Bound<Seeker>) -> NodeRange<'_, S>
580 where
581 Seeker: SplaySeeker<S = S>,
582 {
583 if self.is_empty() {
584 return NodeRange::new(self);
585 }
586 let right = match end {
587 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
588 Ordering::Greater | Ordering::Equal => self.split_right(),
589 Ordering::Less => self.split_right_eq(),
590 },
591 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
592 Ordering::Greater => self.split_right(),
593 Ordering::Less | Ordering::Equal => self.split_right_eq(),
594 },
595 Bound::Unbounded => None,
596 };
597 if self.is_empty() {
598 return NodeRange::three_way(None, self, right);
599 }
600 let left = match start {
601 Bound::Included(seeker) => match self.splay_by(seeker).unwrap() {
602 Ordering::Less | Ordering::Equal => self.split_left(),
603 Ordering::Greater => self.split_left_eq(),
604 },
605 Bound::Excluded(seeker) => match self.splay_by(seeker).unwrap() {
606 Ordering::Less => self.split_left(),
607 Ordering::Greater | Ordering::Equal => self.split_left_eq(),
608 },
609 Bound::Unbounded => None,
610 };
611 NodeRange::three_way(left, self, right)
612 }
613}
614
615impl<S> Debug for Root<S>
616where
617 S: SplaySpec<T: Debug>,
618{
619 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
620 fn fmt_recurse<'a, S>(
621 node: NodeRef<marker::Immut<'a>, S>,
622 f: &mut fmt::Formatter<'_>,
623 ) -> fmt::Result
624 where
625 S: SplaySpec<T: 'a + Debug>,
626 {
627 write!(f, "[")?;
628 if let Some(left) = node.left() {
629 fmt_recurse(left, f)?;
630 }
631 node.data().fmt(f)?;
632 if let Some(right) = node.right() {
633 fmt_recurse(right, f)?;
634 }
635 write!(f, "]")?;
636 Ok(())
637 }
638 if let Some(root) = self.root.as_ref() {
639 let root = root.reborrow();
640 fmt_recurse(root, f)?;
641 }
642 Ok(())
643 }
644}
645
646pub struct NodeRange<'a, S>
647where
648 S: SplaySpec<T: 'a>,
649{
650 front: Root<S>,
651 back: Root<S>,
652 root: &'a mut Root<S>,
653}
654
655impl<'a, S> Debug for NodeRange<'a, S>
656where
657 S: SplaySpec<T: 'a + Debug>,
658{
659 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
660 f.debug_struct("NodeRange")
661 .field("front", &self.front)
662 .field("back", &self.back)
663 .field("root", &self.root)
664 .finish()
665 }
666}
667impl<'a, S> NodeRange<'a, S>
668where
669 S: SplaySpec<T: 'a>,
670{
671 pub fn new(root: &'a mut Root<S>) -> Self {
672 Self {
673 front: Default::default(),
674 back: Default::default(),
675 root,
676 }
677 }
678 pub fn three_way(
679 front: Option<NodeRef<marker::Owned, S>>,
680 root: &'a mut Root<S>,
681 back: Option<NodeRef<marker::Owned, S>>,
682 ) -> Self {
683 Self {
684 front: Root::new(front),
685 back: Root::new(back),
686 root,
687 }
688 }
689 pub fn next_checked(&mut self) -> Option<NodeRef<marker::DataMut<'a>, S>> {
690 let first = self.root.take_first()?;
691 let noderef = unsafe { NodeRef::new_unchecked(first.node) };
692 self.front.insert_last(first);
693 Some(noderef)
694 }
695 pub fn next_back_checked(&mut self) -> Option<NodeRef<marker::DataMut<'a>, S>> {
696 let last = self.root.take_last()?;
697 let noderef = unsafe { NodeRef::new_unchecked(last.node) };
698 self.back.insert_first(last);
699 Some(noderef)
700 }
701 pub fn root(&self) -> &Root<S> {
702 self.root
703 }
704 pub fn root_mut(&mut self) -> &mut Root<S> {
705 self.root
706 }
707 pub fn front(&self) -> &Root<S> {
708 &self.front
709 }
710 pub fn drop_rotate_left(mut self) {
711 self.root.append(&mut self.back);
712 self.root.append(&mut self.front);
713 }
714}
715impl<'a, S> Drop for NodeRange<'a, S>
716where
717 S: SplaySpec<T: 'a>,
718{
719 fn drop(&mut self) {
720 swap(self.root, &mut self.front);
721 self.root.append(&mut self.front);
722 self.root.append(&mut self.back);
723 }More examples
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 461)
438 fn extend<I>(&mut self, iter: I)
439 where
440 I: IntoIterator<Item = T::Key>,
441 {
442 let nodes: Vec<_> = unsafe {
443 iter.into_iter()
444 .map(|key| {
445 let agg = T::single_agg(&key);
446 NodeRef::from_data(
447 LazyAggElement {
448 key,
449 agg,
450 lazy: T::act_unit(),
451 size: 1,
452 rev: false,
453 },
454 self.alloc.deref_mut(),
455 )
456 })
457 .collect()
458 };
459 self.length += nodes.len();
460 let mut root = unsafe { Root::from_single_nodes(nodes) };
461 self.root.append(&mut root);
462 }Sourcepub fn range<Seeker>(
&mut self,
start: Bound<Seeker>,
end: Bound<Seeker>,
) -> NodeRange<'_, S>where
Seeker: SplaySeeker<S = S>,
pub fn range<Seeker>(
&mut self,
start: Bound<Seeker>,
end: Bound<Seeker>,
) -> NodeRange<'_, S>where
Seeker: SplaySeeker<S = S>,
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 320)
306 fn range<R>(&mut self, range: R) -> NodeRange<'_, LazyAggSplay<T>>
307 where
308 R: RangeBounds<usize>,
309 {
310 let start = match range.start_bound() {
311 Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
312 Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
313 Bound::Unbounded => Bound::Unbounded,
314 };
315 let end = match range.end_bound() {
316 Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
317 Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
318 Bound::Unbounded => Bound::Unbounded,
319 };
320 self.root.range(start, end)
321 }More examples
crates/competitive/src/data_structure/splay_tree/sized_map.rs (line 266)
249 pub fn range<Q, R>(&mut self, range: R) -> Iter<'_, K, V>
250 where
251 K: Borrow<Q>,
252 Q: Ord + ?Sized,
253 R: RangeBounds<Q>,
254 {
255 let start = match range.start_bound() {
256 Bound::Included(key) => Bound::Included(SeekByKey::new(key)),
257 Bound::Excluded(key) => Bound::Excluded(SeekByKey::new(key)),
258 Bound::Unbounded => Bound::Unbounded,
259 };
260 let end = match range.end_bound() {
261 Bound::Included(key) => Bound::Included(SeekByKey::new(key)),
262 Bound::Excluded(key) => Bound::Excluded(SeekByKey::new(key)),
263 Bound::Unbounded => Bound::Unbounded,
264 };
265 Iter {
266 iter: self.root.range(start, end),
267 }
268 }
269 pub fn range_at<R>(&mut self, range: R) -> Iter<'_, K, V>
270 where
271 R: RangeBounds<usize>,
272 {
273 let start = match range.start_bound() {
274 Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
275 Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
276 Bound::Unbounded => Bound::Unbounded,
277 };
278 let end = match range.end_bound() {
279 Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
280 Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
281 Bound::Unbounded => Bound::Unbounded,
282 };
283 Iter {
284 iter: self.root.range(start, end),
285 }
286 }Source§impl<T> Root<LazyAggSplay<T>>where
T: LazyMapMonoid,
impl<T> Root<LazyAggSplay<T>>where
T: LazyMapMonoid,
Sourcefn size(&self) -> usize
fn size(&self) -> usize
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 403)
393 pub fn position_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
394 where
395 R: RangeBounds<usize>,
396 F: FnMut(&T::Agg) -> bool,
397 {
398 let mut range = self.range(range);
399 let ord = range.root_mut().splay_by(SeekByAccCond::new(f));
400 if !matches!(ord, Some(Ordering::Equal)) {
401 return None;
402 }
403 let front_size = range.front().size();
404 let left_size = range.root().left_size();
405 Some(front_size + left_size)
406 }
407 pub fn rposition_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
408 where
409 R: RangeBounds<usize>,
410 F: FnMut(&T::Agg) -> bool,
411 {
412 let mut range = self.range(range);
413 let ord = range.root_mut().splay_by(SeekByRaccCond::new(f));
414 if !matches!(ord, Some(Ordering::Equal)) {
415 return None;
416 }
417 let front_size = range.front().size();
418 let left_size = range.root().left_size();
419 Some(front_size + left_size)
420 }Sourcefn left_size(&self) -> usize
fn left_size(&self) -> usize
Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 404)
393 pub fn position_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
394 where
395 R: RangeBounds<usize>,
396 F: FnMut(&T::Agg) -> bool,
397 {
398 let mut range = self.range(range);
399 let ord = range.root_mut().splay_by(SeekByAccCond::new(f));
400 if !matches!(ord, Some(Ordering::Equal)) {
401 return None;
402 }
403 let front_size = range.front().size();
404 let left_size = range.root().left_size();
405 Some(front_size + left_size)
406 }
407 pub fn rposition_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
408 where
409 R: RangeBounds<usize>,
410 F: FnMut(&T::Agg) -> bool,
411 {
412 let mut range = self.range(range);
413 let ord = range.root_mut().splay_by(SeekByRaccCond::new(f));
414 if !matches!(ord, Some(Ordering::Equal)) {
415 return None;
416 }
417 let front_size = range.front().size();
418 let left_size = range.root().left_size();
419 Some(front_size + left_size)
420 }Trait Implementations§
Auto Trait Implementations§
impl<S> Freeze for Root<S>
impl<S> RefUnwindSafe for Root<S>
impl<S> !Send for Root<S>
impl<S> !Sync for Root<S>
impl<S> Unpin for Root<S>
impl<S> UnwindSafe for Root<S>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more