Remove vec_linked_list
.
It provides a way to effectively embed a linked list within an `IndexVec` and also iterate over that list. It's written in a very generic way, involving two traits `Links` and `LinkElem`. But the `Links` trait is only impl'd for `IndexVec` and `&IndexVec`, and the whole thing is only used in one module within `rustc_borrowck`. So I think it's over-engineered and hard to read. Plus it has no comments. This commit removes it, and adds a (non-generic) local iterator for the use within `rustc_borrowck`. Much simpler.
This commit is contained in:
parent
f5d7d346a4
commit
d3d01e1cd3
3 changed files with 32 additions and 81 deletions
|
@ -85,7 +85,6 @@ pub mod temp_dir;
|
|||
pub mod transitive_relation;
|
||||
pub mod unhash;
|
||||
pub mod unord;
|
||||
pub mod vec_linked_list;
|
||||
pub mod work_queue;
|
||||
|
||||
mod atomic_ref;
|
||||
|
|
|
@ -1,70 +0,0 @@
|
|||
use rustc_index::{Idx, IndexVec};
|
||||
|
||||
pub fn iter<Ls>(
|
||||
first: Option<Ls::LinkIndex>,
|
||||
links: &Ls,
|
||||
) -> impl Iterator<Item = Ls::LinkIndex> + '_
|
||||
where
|
||||
Ls: Links,
|
||||
{
|
||||
VecLinkedListIterator { links, current: first }
|
||||
}
|
||||
|
||||
pub struct VecLinkedListIterator<Ls>
|
||||
where
|
||||
Ls: Links,
|
||||
{
|
||||
links: Ls,
|
||||
current: Option<Ls::LinkIndex>,
|
||||
}
|
||||
|
||||
impl<Ls> Iterator for VecLinkedListIterator<Ls>
|
||||
where
|
||||
Ls: Links,
|
||||
{
|
||||
type Item = Ls::LinkIndex;
|
||||
|
||||
fn next(&mut self) -> Option<Ls::LinkIndex> {
|
||||
if let Some(c) = self.current {
|
||||
self.current = <Ls as Links>::next(&self.links, c);
|
||||
Some(c)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Links {
|
||||
type LinkIndex: Copy;
|
||||
|
||||
fn next(links: &Self, index: Self::LinkIndex) -> Option<Self::LinkIndex>;
|
||||
}
|
||||
|
||||
impl<Ls> Links for &Ls
|
||||
where
|
||||
Ls: Links,
|
||||
{
|
||||
type LinkIndex = Ls::LinkIndex;
|
||||
|
||||
fn next(links: &Self, index: Ls::LinkIndex) -> Option<Ls::LinkIndex> {
|
||||
<Ls as Links>::next(links, index)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait LinkElem {
|
||||
type LinkIndex: Copy;
|
||||
|
||||
fn next(elem: &Self) -> Option<Self::LinkIndex>;
|
||||
}
|
||||
|
||||
impl<L, E> Links for IndexVec<L, E>
|
||||
where
|
||||
E: LinkElem<LinkIndex = L>,
|
||||
L: Idx,
|
||||
{
|
||||
type LinkIndex = L;
|
||||
|
||||
fn next(links: &Self, index: L) -> Option<L> {
|
||||
<E as LinkElem>::next(&links[index])
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue