pub struct WithParent<Data> {
pub parent: Option<NonNull<BstNode<Data, Self>>>,
}Fields§
§parent: Option<NonNull<BstNode<Data, Self>>>Implementations§
Source§impl<Data> WithParent<Data>
impl<Data> WithParent<Data>
Sourcepub fn resolve_top_down<Spec>(node: BstNodeRef<DataMut<'_>, Spec>)where
Spec: BstSpec<Data = Data, Parent = Self>,
pub fn resolve_top_down<Spec>(node: BstNodeRef<DataMut<'_>, Spec>)where
Spec: BstSpec<Data = Data, Parent = Self>,
Examples found in repository?
crates/competitive/src/data_structure/treap.rs (lines 318-320)
313 pub fn get(&mut self, node_id: BstNodeId<TreapSpec<M, L>>) -> Option<(&M::Key, &L::Key)> {
314 if !self.node_id_manager.contains(&node_id) {
315 return None;
316 }
317 unsafe {
318 WithParent::resolve_top_down::<TreapSpec<M, L>>(
319 node_id.reborrow_datamut(&mut self.root),
320 );
321 let data = node_id.reborrow(&self.root).into_data();
322 Some((&data.key.key, &data.value.key))
323 }
324 }
325
326 pub fn change(
327 &mut self,
328 node_id: BstNodeId<TreapSpec<M, L>>,
329 f: impl FnOnce(&mut L::Key),
330 ) -> bool {
331 if !self.node_id_manager.contains(&node_id) {
332 return false;
333 }
334 unsafe {
335 WithParent::resolve_top_down::<TreapSpec<M, L>>(
336 node_id.reborrow_datamut(&mut self.root),
337 );
338 let data = node_id.reborrow_datamut(&mut self.root).into_data_mut();
339 f(&mut data.value.key);
340 WithParent::resolve_bottom_up::<TreapSpec<M, L>>(
341 node_id.reborrow_datamut(&mut self.root),
342 );
343 }
344 true
345 }
346
347 pub fn change_key_value(
348 &mut self,
349 node_id: BstNodeId<TreapSpec<M, L>>,
350 f: impl FnOnce(&mut M::Key, &mut L::Key),
351 ) -> bool {
352 if !self.node_id_manager.contains(&node_id) {
353 return false;
354 }
355 unsafe {
356 WithParent::resolve_top_down::<TreapSpec<M, L>>(
357 node_id.reborrow_datamut(&mut self.root),
358 );
359 let mut node = if WithParent::is_root(node_id.reborrow(&self.root)) {
360 WithParent::remove_root(&mut self.root).unwrap_unchecked()
361 } else {
362 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
363 };
364 let data = node.borrow_datamut().into_data_mut();
365 f(&mut data.key.key, &mut data.value.key);
366 self.root = TreapSpec::merge_ordered(self.root.take(), Some(node));
367 true
368 }
369 }
370
371 pub fn insert(&mut self, key: M::Key, value: L::Key) -> BstNodeId<TreapSpec<M, L>> {
372 let (left, right) = TreapSpec::split(self.root.take(), SeekByKey::new(&key), false);
373 let data = TreapData {
374 priority: self.rng.rand64(),
375 key: MonoidActElement::from_key(key),
376 value: LazyMapElement::from_key(value),
377 };
378 let node = BstRoot::from_data(data, self.allocator.deref_mut());
379 let node_id = self.node_id_manager.register(&node);
380 self.root = TreapSpec::merge(TreapSpec::merge(left, Some(node)), right);
381 node_id
382 }
383
384 pub fn remove(&mut self, node_id: BstNodeId<TreapSpec<M, L>>) -> Option<(M::Key, L::Key)> {
385 if !self.node_id_manager.contains(&node_id) {
386 return None;
387 }
388 unsafe {
389 WithParent::resolve_top_down::<TreapSpec<M, L>>(
390 node_id.reborrow_datamut(&mut self.root),
391 );
392 let node = if WithParent::is_root(node_id.reborrow(&self.root)) {
393 WithParent::remove_root(&mut self.root).unwrap_unchecked()
394 } else {
395 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
396 };
397 self.node_id_manager.unregister(node_id);
398 let data = node.into_dying().into_data(self.allocator.deref_mut());
399 Some((data.key.key, data.value.key))
400 }
401 }Sourcepub fn resolve_bottom_up<Spec>(node: BstNodeRef<DataMut<'_>, Spec>)where
Spec: BstSpec<Data = Data, Parent = Self>,
pub fn resolve_bottom_up<Spec>(node: BstNodeRef<DataMut<'_>, Spec>)where
Spec: BstSpec<Data = Data, Parent = Self>,
Examples found in repository?
crates/competitive/src/data_structure/treap.rs (lines 340-342)
326 pub fn change(
327 &mut self,
328 node_id: BstNodeId<TreapSpec<M, L>>,
329 f: impl FnOnce(&mut L::Key),
330 ) -> bool {
331 if !self.node_id_manager.contains(&node_id) {
332 return false;
333 }
334 unsafe {
335 WithParent::resolve_top_down::<TreapSpec<M, L>>(
336 node_id.reborrow_datamut(&mut self.root),
337 );
338 let data = node_id.reborrow_datamut(&mut self.root).into_data_mut();
339 f(&mut data.value.key);
340 WithParent::resolve_bottom_up::<TreapSpec<M, L>>(
341 node_id.reborrow_datamut(&mut self.root),
342 );
343 }
344 true
345 }More examples
crates/competitive/src/data_structure/binary_search_tree/node.rs (line 201)
177 pub unsafe fn remove_not_root<Spec>(
178 mut node: BstNodeRef<marker::Mut<'_>, Spec>,
179 ) -> BstNodeRef<marker::Owned, Spec>
180 where
181 Spec: BstSpec<Data = Data, Parent = Self>,
182 {
183 assert!(!Self::is_root(node.reborrow()));
184 unsafe {
185 let left = node.left_mut().take();
186 let right = node.right_mut().take();
187 let merged = Spec::merge(left, right);
188 let node_inner = node.node;
189 let mut parent = node.ascend().unwrap_unchecked();
190 let mut node = if let Some(merged) = merged {
191 let node = if parent
192 .reborrow()
193 .left()
194 .descend()
195 .is_ok_and(|n| n.node == node_inner)
196 {
197 parent.left_mut().replace(merged)
198 } else {
199 parent.right_mut().replace(merged)
200 };
201 Self::resolve_bottom_up(parent.reborrow_datamut());
202 node.unwrap_unchecked()
203 } else {
204 let node = if parent
205 .reborrow()
206 .left()
207 .descend()
208 .is_ok_and(|n| n.node == node_inner)
209 {
210 parent.left_mut().take()
211 } else {
212 parent.right_mut().take()
213 };
214 Self::resolve_bottom_up(parent.reborrow_datamut());
215 node.unwrap_unchecked()
216 };
217 Spec::bottom_up(node.borrow_datamut());
218 node
219 }
220 }Sourcepub fn is_root<Spec>(node: BstNodeRef<Immut<'_>, Spec>) -> boolwhere
Spec: BstSpec<Data = Data, Parent = Self>,
pub fn is_root<Spec>(node: BstNodeRef<Immut<'_>, Spec>) -> boolwhere
Spec: BstSpec<Data = Data, Parent = Self>,
Examples found in repository?
crates/competitive/src/data_structure/treap.rs (line 359)
347 pub fn change_key_value(
348 &mut self,
349 node_id: BstNodeId<TreapSpec<M, L>>,
350 f: impl FnOnce(&mut M::Key, &mut L::Key),
351 ) -> bool {
352 if !self.node_id_manager.contains(&node_id) {
353 return false;
354 }
355 unsafe {
356 WithParent::resolve_top_down::<TreapSpec<M, L>>(
357 node_id.reborrow_datamut(&mut self.root),
358 );
359 let mut node = if WithParent::is_root(node_id.reborrow(&self.root)) {
360 WithParent::remove_root(&mut self.root).unwrap_unchecked()
361 } else {
362 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
363 };
364 let data = node.borrow_datamut().into_data_mut();
365 f(&mut data.key.key, &mut data.value.key);
366 self.root = TreapSpec::merge_ordered(self.root.take(), Some(node));
367 true
368 }
369 }
370
371 pub fn insert(&mut self, key: M::Key, value: L::Key) -> BstNodeId<TreapSpec<M, L>> {
372 let (left, right) = TreapSpec::split(self.root.take(), SeekByKey::new(&key), false);
373 let data = TreapData {
374 priority: self.rng.rand64(),
375 key: MonoidActElement::from_key(key),
376 value: LazyMapElement::from_key(value),
377 };
378 let node = BstRoot::from_data(data, self.allocator.deref_mut());
379 let node_id = self.node_id_manager.register(&node);
380 self.root = TreapSpec::merge(TreapSpec::merge(left, Some(node)), right);
381 node_id
382 }
383
384 pub fn remove(&mut self, node_id: BstNodeId<TreapSpec<M, L>>) -> Option<(M::Key, L::Key)> {
385 if !self.node_id_manager.contains(&node_id) {
386 return None;
387 }
388 unsafe {
389 WithParent::resolve_top_down::<TreapSpec<M, L>>(
390 node_id.reborrow_datamut(&mut self.root),
391 );
392 let node = if WithParent::is_root(node_id.reborrow(&self.root)) {
393 WithParent::remove_root(&mut self.root).unwrap_unchecked()
394 } else {
395 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
396 };
397 self.node_id_manager.unregister(node_id);
398 let data = node.into_dying().into_data(self.allocator.deref_mut());
399 Some((data.key.key, data.value.key))
400 }
401 }More examples
crates/competitive/src/data_structure/binary_search_tree/node.rs (line 183)
177 pub unsafe fn remove_not_root<Spec>(
178 mut node: BstNodeRef<marker::Mut<'_>, Spec>,
179 ) -> BstNodeRef<marker::Owned, Spec>
180 where
181 Spec: BstSpec<Data = Data, Parent = Self>,
182 {
183 assert!(!Self::is_root(node.reborrow()));
184 unsafe {
185 let left = node.left_mut().take();
186 let right = node.right_mut().take();
187 let merged = Spec::merge(left, right);
188 let node_inner = node.node;
189 let mut parent = node.ascend().unwrap_unchecked();
190 let mut node = if let Some(merged) = merged {
191 let node = if parent
192 .reborrow()
193 .left()
194 .descend()
195 .is_ok_and(|n| n.node == node_inner)
196 {
197 parent.left_mut().replace(merged)
198 } else {
199 parent.right_mut().replace(merged)
200 };
201 Self::resolve_bottom_up(parent.reborrow_datamut());
202 node.unwrap_unchecked()
203 } else {
204 let node = if parent
205 .reborrow()
206 .left()
207 .descend()
208 .is_ok_and(|n| n.node == node_inner)
209 {
210 parent.left_mut().take()
211 } else {
212 parent.right_mut().take()
213 };
214 Self::resolve_bottom_up(parent.reborrow_datamut());
215 node.unwrap_unchecked()
216 };
217 Spec::bottom_up(node.borrow_datamut());
218 node
219 }
220 }Sourcepub unsafe fn remove_root<Spec>(
root: &mut Option<BstRoot<Spec>>,
) -> Option<BstNodeRef<Owned, Spec>>where
Spec: BstSpec<Data = Data, Parent = Self>,
pub unsafe fn remove_root<Spec>(
root: &mut Option<BstRoot<Spec>>,
) -> Option<BstNodeRef<Owned, Spec>>where
Spec: BstSpec<Data = Data, Parent = Self>,
Examples found in repository?
crates/competitive/src/data_structure/treap.rs (line 360)
347 pub fn change_key_value(
348 &mut self,
349 node_id: BstNodeId<TreapSpec<M, L>>,
350 f: impl FnOnce(&mut M::Key, &mut L::Key),
351 ) -> bool {
352 if !self.node_id_manager.contains(&node_id) {
353 return false;
354 }
355 unsafe {
356 WithParent::resolve_top_down::<TreapSpec<M, L>>(
357 node_id.reborrow_datamut(&mut self.root),
358 );
359 let mut node = if WithParent::is_root(node_id.reborrow(&self.root)) {
360 WithParent::remove_root(&mut self.root).unwrap_unchecked()
361 } else {
362 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
363 };
364 let data = node.borrow_datamut().into_data_mut();
365 f(&mut data.key.key, &mut data.value.key);
366 self.root = TreapSpec::merge_ordered(self.root.take(), Some(node));
367 true
368 }
369 }
370
371 pub fn insert(&mut self, key: M::Key, value: L::Key) -> BstNodeId<TreapSpec<M, L>> {
372 let (left, right) = TreapSpec::split(self.root.take(), SeekByKey::new(&key), false);
373 let data = TreapData {
374 priority: self.rng.rand64(),
375 key: MonoidActElement::from_key(key),
376 value: LazyMapElement::from_key(value),
377 };
378 let node = BstRoot::from_data(data, self.allocator.deref_mut());
379 let node_id = self.node_id_manager.register(&node);
380 self.root = TreapSpec::merge(TreapSpec::merge(left, Some(node)), right);
381 node_id
382 }
383
384 pub fn remove(&mut self, node_id: BstNodeId<TreapSpec<M, L>>) -> Option<(M::Key, L::Key)> {
385 if !self.node_id_manager.contains(&node_id) {
386 return None;
387 }
388 unsafe {
389 WithParent::resolve_top_down::<TreapSpec<M, L>>(
390 node_id.reborrow_datamut(&mut self.root),
391 );
392 let node = if WithParent::is_root(node_id.reborrow(&self.root)) {
393 WithParent::remove_root(&mut self.root).unwrap_unchecked()
394 } else {
395 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
396 };
397 self.node_id_manager.unregister(node_id);
398 let data = node.into_dying().into_data(self.allocator.deref_mut());
399 Some((data.key.key, data.value.key))
400 }
401 }Sourcepub unsafe fn remove_not_root<Spec>(
node: BstNodeRef<Mut<'_>, Spec>,
) -> BstNodeRef<Owned, Spec>where
Spec: BstSpec<Data = Data, Parent = Self>,
pub unsafe fn remove_not_root<Spec>(
node: BstNodeRef<Mut<'_>, Spec>,
) -> BstNodeRef<Owned, Spec>where
Spec: BstSpec<Data = Data, Parent = Self>,
Examples found in repository?
crates/competitive/src/data_structure/treap.rs (line 362)
347 pub fn change_key_value(
348 &mut self,
349 node_id: BstNodeId<TreapSpec<M, L>>,
350 f: impl FnOnce(&mut M::Key, &mut L::Key),
351 ) -> bool {
352 if !self.node_id_manager.contains(&node_id) {
353 return false;
354 }
355 unsafe {
356 WithParent::resolve_top_down::<TreapSpec<M, L>>(
357 node_id.reborrow_datamut(&mut self.root),
358 );
359 let mut node = if WithParent::is_root(node_id.reborrow(&self.root)) {
360 WithParent::remove_root(&mut self.root).unwrap_unchecked()
361 } else {
362 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
363 };
364 let data = node.borrow_datamut().into_data_mut();
365 f(&mut data.key.key, &mut data.value.key);
366 self.root = TreapSpec::merge_ordered(self.root.take(), Some(node));
367 true
368 }
369 }
370
371 pub fn insert(&mut self, key: M::Key, value: L::Key) -> BstNodeId<TreapSpec<M, L>> {
372 let (left, right) = TreapSpec::split(self.root.take(), SeekByKey::new(&key), false);
373 let data = TreapData {
374 priority: self.rng.rand64(),
375 key: MonoidActElement::from_key(key),
376 value: LazyMapElement::from_key(value),
377 };
378 let node = BstRoot::from_data(data, self.allocator.deref_mut());
379 let node_id = self.node_id_manager.register(&node);
380 self.root = TreapSpec::merge(TreapSpec::merge(left, Some(node)), right);
381 node_id
382 }
383
384 pub fn remove(&mut self, node_id: BstNodeId<TreapSpec<M, L>>) -> Option<(M::Key, L::Key)> {
385 if !self.node_id_manager.contains(&node_id) {
386 return None;
387 }
388 unsafe {
389 WithParent::resolve_top_down::<TreapSpec<M, L>>(
390 node_id.reborrow_datamut(&mut self.root),
391 );
392 let node = if WithParent::is_root(node_id.reborrow(&self.root)) {
393 WithParent::remove_root(&mut self.root).unwrap_unchecked()
394 } else {
395 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
396 };
397 self.node_id_manager.unregister(node_id);
398 let data = node.into_dying().into_data(self.allocator.deref_mut());
399 Some((data.key.key, data.value.key))
400 }
401 }Trait Implementations§
Source§impl<Data> Default for WithParent<Data>
impl<Data> Default for WithParent<Data>
Source§impl<Data> ParentStrategy for WithParent<Data>
impl<Data> ParentStrategy for WithParent<Data>
type Data = Data
fn take_parent<Spec>(node: BstNodeRef<Mut<'_>, Spec>)
fn set_parent<Spec>( node: BstNodeRef<Mut<'_>, Spec>, parent: Option<NonNull<BstNode<Spec::Data, Self>>>, )
Auto Trait Implementations§
impl<Data> Freeze for WithParent<Data>
impl<Data> RefUnwindSafe for WithParent<Data>where
Data: RefUnwindSafe,
impl<Data> !Send for WithParent<Data>
impl<Data> !Sync for WithParent<Data>
impl<Data> Unpin for WithParent<Data>
impl<Data> UnwindSafe for WithParent<Data>where
Data: RefUnwindSafe,
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