Mercurial > hg
comparison rust/hg-core/src/dirstate_tree/dirstate_map.rs @ 47282:ce41ee53263f
dirstate-tree: Extract into a method sorting children of a given node
A later changset will use this in another place.
This is an associated function (that Python would call static method)
instead of a free function so it doesn’t need to be imported separately.
It’s on `Node` rather than `ChildNodes` because the latter is a type alias
to an external type (`HashMap`) so that would require an extension trait
which needs to be imported separately.
Differential Revision: https://phab.mercurial-scm.org/D10721
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Wed, 19 May 2021 13:15:00 +0200 |
parents | 1766130fe9ba |
children | 2a9ddc8094c7 |
comparison
equal
deleted
inserted
replaced
47281:6763913fa175 | 47282:ce41ee53263f |
---|---|
43 } | 43 } |
44 | 44 |
45 /// Using a plain `HgPathBuf` of the full path from the repository root as a | 45 /// Using a plain `HgPathBuf` of the full path from the repository root as a |
46 /// map key would also work: all paths in a given map have the same parent | 46 /// map key would also work: all paths in a given map have the same parent |
47 /// path, so comparing full paths gives the same result as comparing base | 47 /// path, so comparing full paths gives the same result as comparing base |
48 /// names. However `BTreeMap` would waste time always re-comparing the same | 48 /// names. However `HashMap` would waste time always re-hashing the same |
49 /// string prefix. | 49 /// string prefix. |
50 pub(super) type NodeKey<'on_disk> = WithBasename<Cow<'on_disk, HgPath>>; | |
50 pub(super) type ChildNodes<'on_disk> = | 51 pub(super) type ChildNodes<'on_disk> = |
51 FastHashMap<WithBasename<Cow<'on_disk, HgPath>>, Node<'on_disk>>; | 52 FastHashMap<NodeKey<'on_disk>, Node<'on_disk>>; |
52 | 53 |
53 /// Represents a file or a directory | 54 /// Represents a file or a directory |
54 #[derive(Default)] | 55 #[derive(Default)] |
55 pub(super) struct Node<'on_disk> { | 56 pub(super) struct Node<'on_disk> { |
56 /// `None` for directories | 57 /// `None` for directories |
62 | 63 |
63 /// How many (non-inclusive) descendants of this node are tracked files | 64 /// How many (non-inclusive) descendants of this node are tracked files |
64 tracked_descendants_count: usize, | 65 tracked_descendants_count: usize, |
65 } | 66 } |
66 | 67 |
67 impl Node<'_> { | 68 impl<'on_disk> Node<'on_disk> { |
68 pub(super) fn state(&self) -> Option<EntryState> { | 69 pub(super) fn state(&self) -> Option<EntryState> { |
69 self.entry.as_ref().map(|entry| entry.state) | 70 self.entry.as_ref().map(|entry| entry.state) |
71 } | |
72 | |
73 pub(super) fn sorted<'tree>( | |
74 nodes: &'tree mut ChildNodes<'on_disk>, | |
75 ) -> Vec<(&'tree NodeKey<'on_disk>, &'tree mut Self)> { | |
76 let mut vec: Vec<_> = nodes.iter_mut().collect(); | |
77 // `sort_unstable_by_key` doesn’t allow keys borrowing from the value: | |
78 // https://github.com/rust-lang/rust/issues/34162 | |
79 vec.sort_unstable_by(|(path1, _), (path2, _)| path1.cmp(path2)); | |
80 vec | |
70 } | 81 } |
71 } | 82 } |
72 | 83 |
73 /// `(full_path, entry, copy_source)` | 84 /// `(full_path, entry, copy_source)` |
74 type NodeDataMut<'tree, 'on_disk> = ( | 85 type NodeDataMut<'tree, 'on_disk> = ( |