mirror of
https://github.com/scottlamb/moonfire-nvr.git
synced 2024-12-26 23:25:55 -05:00
clean up adjust_day implementation
Entry::Occupied has a remove_entry method that allows this to be a little more readable, and a little more efficient (one btree traversal rather than two). mmstick on reddit pointed this out: https://www.reddit.com/r/rust/comments/5tzw5q/how_are_if_else_scopes_are_handled_in_rust/dds0r37/?context=3
This commit is contained in:
parent
13c6af45a1
commit
c6813bd886
33
src/db.rs
33
src/db.rs
@ -364,29 +364,24 @@ pub struct CameraChange {
|
|||||||
pub sub_rtsp_path: String,
|
pub sub_rtsp_path: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adds `delta` to the day represented by `day` in the map `m`.
|
/// Adds non-zero `delta` to the day represented by `day` in the map `m`.
|
||||||
/// Inserts a map entry if absent; removes the entry if it has 0 entries on exit.
|
/// Inserts a map entry if absent; removes the entry if it has 0 entries on exit.
|
||||||
fn adjust_day(day: CameraDayKey, delta: CameraDayValue,
|
fn adjust_day(day: CameraDayKey, delta: CameraDayValue,
|
||||||
m: &mut BTreeMap<CameraDayKey, CameraDayValue>) {
|
m: &mut BTreeMap<CameraDayKey, CameraDayValue>) {
|
||||||
enum Do {
|
use ::std::collections::btree_map::Entry;
|
||||||
Insert,
|
match m.entry(day) {
|
||||||
Remove,
|
Entry::Vacant(e) => { e.insert(delta); },
|
||||||
Nothing
|
Entry::Occupied(mut e) => {
|
||||||
};
|
let remove = {
|
||||||
let what_to_do = match m.get_mut(&day) {
|
let v = e.get_mut();
|
||||||
None => {
|
v.recordings += delta.recordings;
|
||||||
Do::Insert
|
v.duration += delta.duration;
|
||||||
|
v.recordings == 0
|
||||||
|
};
|
||||||
|
if remove {
|
||||||
|
e.remove_entry();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Some(ref mut v) => {
|
|
||||||
v.recordings += delta.recordings;
|
|
||||||
v.duration += delta.duration;
|
|
||||||
if v.recordings == 0 { Do::Remove } else { Do::Nothing }
|
|
||||||
},
|
|
||||||
};
|
|
||||||
match what_to_do {
|
|
||||||
Do::Insert => { m.insert(day, delta); },
|
|
||||||
Do::Remove => { m.remove(&day); },
|
|
||||||
Do::Nothing => {},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user