pub struct SeekByKey<'a, Spec, K, Q>where
Q: ?Sized,{
key: &'a Q,
_marker: PhantomData<fn() -> (Spec, K)>,
}Fields§
§key: &'a Q§_marker: PhantomData<fn() -> (Spec, K)>Implementations§
Source§impl<'a, Spec, K, Q> SeekByKey<'a, Spec, K, Q>where
Q: ?Sized,
impl<'a, Spec, K, Q> SeekByKey<'a, Spec, K, Q>where
Q: ?Sized,
Sourcepub fn new(key: &'a Q) -> Self
pub fn new(key: &'a Q) -> Self
Examples found in repository?
More examples
crates/competitive/src/data_structure/binary_search_tree/split.rs (line 161)
153 pub fn seek_by_key<K, Q, R>(node: &'a mut Option<BstRoot<Spec>>, range: R) -> Self
154 where
155 Spec: BstSpec<Data: BstDataAccess<data::marker::Key, Value = K>>,
156 K: Borrow<Q>,
157 Q: Ord + ?Sized,
158 R: RangeBounds<Q>,
159 {
160 let start = match range.start_bound() {
161 Bound::Included(key) => Bound::Included(SeekByKey::new(key)),
162 Bound::Excluded(key) => Bound::Excluded(SeekByKey::new(key)),
163 Bound::Unbounded => Bound::Unbounded,
164 };
165 let end = match range.end_bound() {
166 Bound::Included(key) => Bound::Included(SeekByKey::new(key)),
167 Bound::Excluded(key) => Bound::Excluded(SeekByKey::new(key)),
168 Bound::Unbounded => Bound::Unbounded,
169 };
170 Self::new(node, start, end)
171 }crates/competitive/src/data_structure/treap.rs (line 198)
187 pub fn merge_ordered(
188 left: Option<TreapRoot<M, L>>,
189 right: Option<TreapRoot<M, L>>,
190 ) -> Option<TreapRoot<M, L>> {
191 match (left, right) {
192 (None, None) => None,
193 (None, Some(node)) | (Some(node), None) => Some(node),
194 (Some(mut left), Some(mut right)) => unsafe {
195 if left.reborrow().into_data().priority > right.reborrow().into_data().priority {
196 Self::top_down(left.borrow_datamut());
197 let key = &left.reborrow().into_data().key.key;
198 let (rl, rr) = Self::split(Some(right), SeekByKey::new(key), EqualSide::Right);
199 let ll = left.borrow_mut().left().take();
200 let lr = left.borrow_mut().right().take();
201 if let Some(l) = Self::merge_ordered(ll, rl) {
202 left.borrow_mut().left().set(l);
203 }
204 if let Some(r) = Self::merge_ordered(lr, rr) {
205 left.borrow_mut().right().set(r);
206 }
207 Self::bottom_up(left.borrow_datamut());
208 Some(left)
209 } else {
210 Self::top_down(right.borrow_datamut());
211 let key = &right.reborrow().into_data().key.key;
212 let (ll, lr) = Self::split(Some(left), SeekByKey::new(key), EqualSide::Right);
213 let rl = right.borrow_mut().left().take();
214 let rr = right.borrow_mut().right().take();
215 if let Some(l) = Self::merge_ordered(ll, rl) {
216 right.borrow_mut().left().set(l);
217 }
218 if let Some(r) = Self::merge_ordered(lr, rr) {
219 right.borrow_mut().right().set(r);
220 }
221 Self::bottom_up(right.borrow_datamut());
222 Some(right)
223 }
224 },
225 }
226 }
227}
228
229pub struct Treap<M, L, A = BoxAllocator<TreapNode<M, L>>>
230where
231 M: MonoidAct<Key: Ord>,
232 L: LazyMapMonoid,
233 A: Allocator<TreapNode<M, L>>,
234{
235 root: Option<TreapRoot<M, L>>,
236 node_id_manager: BstNodeIdManager<TreapSpec<M, L>>,
237 rng: Xorshift,
238 allocator: ManuallyDrop<A>,
239 _marker: PhantomData<(M, L)>,
240}
241
242impl<M, L, A> Default for Treap<M, L, A>
243where
244 M: MonoidAct<Key: Ord>,
245 L: LazyMapMonoid,
246 A: Allocator<TreapNode<M, L>> + Default,
247{
248 fn default() -> Self {
249 Self {
250 root: None,
251 node_id_manager: Default::default(),
252 rng: Xorshift::new(),
253 allocator: ManuallyDrop::new(A::default()),
254 _marker: PhantomData,
255 }
256 }
257}
258
259impl<M, L, A> Drop for Treap<M, L, A>
260where
261 M: MonoidAct<Key: Ord>,
262 L: LazyMapMonoid,
263 A: Allocator<TreapNode<M, L>>,
264{
265 fn drop(&mut self) {
266 unsafe {
267 if let Some(root) = self.root.take() {
268 root.into_dying().drop_all(self.allocator.deref_mut());
269 }
270 ManuallyDrop::drop(&mut self.allocator);
271 }
272 }
273}
274
275impl<M, L> Treap<M, L>
276where
277 M: MonoidAct<Key: Ord>,
278 L: LazyMapMonoid,
279{
280 pub fn new() -> Self {
281 Self::default()
282 }
283}
284
285impl<M, L, A> Treap<M, L, A>
286where
287 M: MonoidAct<Key: Ord>,
288 L: LazyMapMonoid,
289 A: Allocator<TreapNode<M, L>>,
290{
291 pub fn len(&self) -> usize {
292 self.node_id_manager.len()
293 }
294
295 pub fn is_empty(&self) -> bool {
296 self.node_id_manager.is_empty()
297 }
298
299 pub fn clear(&mut self) {
300 unsafe {
301 if let Some(root) = self.root.take() {
302 root.into_dying().drop_all(self.allocator.deref_mut());
303 }
304 self.node_id_manager.clear();
305 }
306 }
307
308 pub fn get(&mut self, node_id: BstNodeId<TreapSpec<M, L>>) -> Option<(&M::Key, &L::Key)> {
309 if !self.node_id_manager.contains(&node_id) {
310 return None;
311 }
312 unsafe {
313 WithParent::resolve_top_down::<TreapSpec<M, L>>(
314 node_id.reborrow_datamut(&mut self.root),
315 );
316 let data = node_id.reborrow(&self.root).into_data();
317 Some((&data.key.key, &data.value.key))
318 }
319 }
320
321 pub fn change(
322 &mut self,
323 node_id: BstNodeId<TreapSpec<M, L>>,
324 f: impl FnOnce(&mut L::Key),
325 ) -> bool {
326 if !self.node_id_manager.contains(&node_id) {
327 return false;
328 }
329 unsafe {
330 WithParent::resolve_top_down::<TreapSpec<M, L>>(
331 node_id.reborrow_datamut(&mut self.root),
332 );
333 let data = node_id.reborrow_datamut(&mut self.root).into_data_mut();
334 f(&mut data.value.key);
335 WithParent::resolve_bottom_up::<TreapSpec<M, L>>(
336 node_id.reborrow_datamut(&mut self.root),
337 );
338 }
339 true
340 }
341
342 pub fn change_key_value(
343 &mut self,
344 node_id: BstNodeId<TreapSpec<M, L>>,
345 f: impl FnOnce(&mut M::Key, &mut L::Key),
346 ) -> bool {
347 if !self.node_id_manager.contains(&node_id) {
348 return false;
349 }
350 unsafe {
351 WithParent::resolve_top_down::<TreapSpec<M, L>>(
352 node_id.reborrow_datamut(&mut self.root),
353 );
354 let mut node = if WithParent::is_root(node_id.reborrow(&self.root)) {
355 WithParent::remove_root(&mut self.root).unwrap_unchecked()
356 } else {
357 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
358 };
359 let data = node.borrow_datamut().into_data_mut();
360 f(&mut data.key.key, &mut data.value.key);
361 self.root = TreapSpec::merge_ordered(self.root.take(), Some(node));
362 true
363 }
364 }
365
366 pub fn insert(&mut self, key: M::Key, value: L::Key) -> BstNodeId<TreapSpec<M, L>> {
367 let (left, right) =
368 TreapSpec::split(self.root.take(), SeekByKey::new(&key), EqualSide::Right);
369 let data = TreapData {
370 priority: self.rng.rand64(),
371 key: MonoidActElement::from_key(key),
372 value: LazyMapElement::from_key(value),
373 };
374 let node = BstRoot::from_data(data, self.allocator.deref_mut());
375 let node_id = self.node_id_manager.register(&node);
376 self.root = TreapSpec::merge(TreapSpec::merge(left, Some(node)), right);
377 node_id
378 }
379
380 pub fn remove(&mut self, node_id: BstNodeId<TreapSpec<M, L>>) -> Option<(M::Key, L::Key)> {
381 if !self.node_id_manager.contains(&node_id) {
382 return None;
383 }
384 unsafe {
385 WithParent::resolve_top_down::<TreapSpec<M, L>>(
386 node_id.reborrow_datamut(&mut self.root),
387 );
388 let node = if WithParent::is_root(node_id.reborrow(&self.root)) {
389 WithParent::remove_root(&mut self.root).unwrap_unchecked()
390 } else {
391 WithParent::remove_not_root(node_id.reborrow_mut(&mut self.root))
392 };
393 self.node_id_manager.unregister(node_id);
394 let data = node.into_dying().into_data(self.allocator.deref_mut());
395 Some((data.key.key, data.value.key))
396 }
397 }
398
399 pub fn range_by_key<Q, R>(&mut self, range: R) -> TreapSplit3<'_, M, L>
400 where
401 M: MonoidAct<Key: Borrow<Q>>,
402 Q: Ord + ?Sized,
403 R: RangeBounds<Q>,
404 {
405 let split3 = Split3::seek_by_key(&mut self.root, range);
406 TreapSplit3 {
407 split3,
408 key_updated: false,
409 }
410 }
411
412 pub fn find_by_key<Q>(&mut self, key: &Q) -> Option<BstNodeId<TreapSpec<M, L>>>
413 where
414 M: MonoidAct<Key: Borrow<Q>>,
415 Q: Ord + ?Sized,
416 {
417 let split = Split::new(
418 &mut self.root,
419 SeekByKey::<TreapSpec<M, L>, M::Key, Q>::new(key),
420 EqualSide::Right,
421 );
422 let node = split.right()?.leftmost();
423 matches!(node.into_data().key.key.borrow().cmp(key), Ordering::Equal)
424 .then(|| self.node_id_manager.registered_node_id(node))
425 .flatten()
426 }Trait Implementations§
Auto Trait Implementations§
impl<'a, Spec, K, Q> Freeze for SeekByKey<'a, Spec, K, Q>
impl<'a, Spec, K, Q> RefUnwindSafe for SeekByKey<'a, Spec, K, Q>
impl<'a, Spec, K, Q> Send for SeekByKey<'a, Spec, K, Q>
impl<'a, Spec, K, Q> Sync for SeekByKey<'a, Spec, K, Q>
impl<'a, Spec, K, Q> Unpin for SeekByKey<'a, Spec, K, Q>
impl<'a, Spec, K, Q> UnsafeUnpin for SeekByKey<'a, Spec, K, Q>
impl<'a, Spec, K, Q> UnwindSafe for SeekByKey<'a, Spec, K, Q>
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