intrusive_collections/key_adapter.rs
1// Copyright 2016 Amanieu d'Antras
2// Copyright 2020 Amari Robinson
3//
4// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
5// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
6// http://opensource.org/licenses/MIT>, at your option. This file may not be
7// copied, modified, or distributed except according to those terms.
8
9use crate::adapter::Adapter;
10use crate::pointer_ops::PointerOps;
11
12/// Extension of the `Adapter` trait to provide a way of extracting a key from
13/// an object. This key can then be used as an index in certain intrusive
14/// collections (currently only `RBTree` uses this).
15///
16/// The key can be returned either as a value or as a reference, which allows
17/// you to
18///
19/// # Examples
20///
21/// ```
22/// use intrusive_collections::intrusive_adapter;
23/// use intrusive_collections::{RBTreeLink, KeyAdapter};
24///
25/// struct S {
26/// link: RBTreeLink,
27/// key: u32,
28/// value: u64,
29/// }
30///
31/// // Adapter which returns a key by value
32/// intrusive_adapter!(MyAdapter = Box<S>: S { link : RBTreeLink });
33/// impl<'a> KeyAdapter<'a> for MyAdapter {
34/// type Key = u32;
35/// fn get_key(&self, s: &'a S) -> u32 { s.key }
36/// }
37///
38/// // Adapter which returns a key by reference
39/// intrusive_adapter!(MyAdapter2 = Box<S>: S { link : RBTreeLink });
40/// impl<'a> KeyAdapter<'a> for MyAdapter2 {
41/// type Key = &'a u32;
42/// fn get_key(&self, s: &'a S) -> &'a u32 { &s.key }
43/// }
44///
45/// struct U {
46/// link: RBTreeLink,
47/// key1: i32,
48/// key2: String,
49/// key3: f64,
50/// }
51///
52/// // Adapter which returns a tuple as a key. When used in a RBTree, this will
53/// // keep all elements sorted by `key1` first, then `key2` and finally `key3`.
54/// intrusive_adapter!(MyAdapter3 = Box<U>: U { link : RBTreeLink });
55/// impl<'a> KeyAdapter<'a> for MyAdapter3 {
56/// type Key = (i32, &'a str, f64);
57/// fn get_key(&self, u: &'a U) -> Self::Key { (u.key1, &u.key2, u.key3) }
58/// }
59/// ```
60pub trait KeyAdapter<'a>: Adapter {
61 /// Type of the key returned by `get_key`.
62 type Key;
63
64 /// Gets the key for the given object.
65 fn get_key(&self, value: &'a <Self::PointerOps as PointerOps>::Value) -> Self::Key;
66}