-
Notifications
You must be signed in to change notification settings - Fork 291
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
HashTable iterator over entries #599
Comments
So, just to be clear, you want an iterator that yields Note that we can't return In this case, does it even need to be |
I think the solution for this is the same as #588: some form of cursor API which allows you to advance through the table while choosing at each step whether to remove the element. The API could look something like this (very rough draft): struct ExtractCursor<'a>;
impl ExtractCursor<'_> {
fn get(&self) -> &T;
fn get_mut(&mut self) -> &mut T;
fn remove(&mut self) -> T;
fn next(&mut self) -> bool;
} |
Sorry, I should have been more clear. I only want to iterate over the occupied entries so that I can (optionally) remove values from them. I do not have a need to iterate over the vacant entries (nor do I know how one would do that). To put this into context, the code sample I provided could be rewritten (loosely) like this with an iterator over entries: // NOTE: Each table contains wrapper structs that contain data to point
self.left_set.iter_entries()
// Get the corresponding entry from the right table
.map(|l| (l, self.right_set.find_entry(l.hash, hash_and_id(l.hash, l.id)).unwrap())))
// Pass it through the predicate (similar to `extract_if` or `retain`)
.filter(|(l, r)| predicate(l.get(), r.get()))
// Call remove on the entries because they passed through and yield both items
.map(|(l, r)| (l.remove(), r.remove())) The cursor API could also work. The solution would look a lot different, but that's fine by me. |
Note that the current |
Hello,
I have a crate that creates a key-to-key map (i.e. a "double-sided" map). This is implemented with two maps that index into each other. I want to implement an iterator similar to
hash_table::ExtractIf
, but I must provide an reference to both the left and right elements to the predicate and have that iterator yield both elements.The problem is that there is no direct way to solve this with the existing APIs to the
HashTable
and still make the borrow checker happy. The best solution that I've come up with the existing APIs is to useHashTable::extract_if
on one table to "smuggle out" elements from the other side and then pull the smuggled item out withIterator::map
. This works but is far from ideal:However, if there were an iterator over the hash table that yielded
OccupiedEntry
s rather than just references, this iterator would be trivial to construct. I could zip the two iterators together, pass the references to the predicate, and, iftrue
, callOccupiedEntry::remove
on both entries.Would such an iterator be possible to implement for
HashTable
?The text was updated successfully, but these errors were encountered: