Crate ref_filter_map [] [src]

The Ref and RefMut types in std::cell each have a map method that create a new Ref (RefMut) that borrows something (a sub-component) inside of a RefCell.

When that component may or may not be there, you may find yourself checking for its precense twice:

fn borrow_get<'a>(hashmap: &'a RefCell<HashMap<String, String>>, key: &str)
                  -> Option<Ref<'a, String>> {
    let hashmap = hashmap.borrow();
    if hashmap.contains_key(key) {  // Duplicated hash table lookup.
        Some(Ref::map(hashmap, |hashmap| {
            &hashmap[key]  // panic!() for missing key unlikely to be optimized away
        }))
    } else {
        None
    }
}

This crate define ref_filter_map and ref_mut_filter_map functions that are a lot like Ref::map and RefMut::map, but return Option and take closures that return Option.

Internally they use a raw pointer and some unsafe code, but the API they provide is believed to be safe.

This was once part of std::cell but has been deprecated there since it makes Option too much of a special case.

https://github.com/rust-lang/rust/pull/25747 https://github.com/rust-lang/rust/issues/27746

Functions

ref_filter_map

Make a new Ref for a optional component of the borrowed data, e.g. an enum variant.

ref_mut_filter_map

Make a new RefMut for a optional component of the borrowed data, e.g. an enum variant.