Skip to content

Commit 9df7e6c

Browse files
authored
Merge pull request #241 from ChrisDenton/simple-insert
perf: Replace `HashMap` with a `Vec`
2 parents bdc96a4 + 46ccdd9 commit 9df7e6c

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

src/filter/mod.rs

+22-11
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
//! [`Filter::matches`]: struct.Filter.html#method.matches
6060
6161
use log::{Level, LevelFilter, Metadata, Record};
62-
use std::collections::HashMap;
6362
use std::env;
6463
use std::fmt;
6564
use std::mem;
@@ -108,7 +107,7 @@ pub struct Filter {
108107
///
109108
/// [`Filter`]: struct.Filter.html
110109
pub struct Builder {
111-
directives: HashMap<Option<String>, LevelFilter>,
110+
directives: Vec<Directive>,
112111
filter: Option<inner::Filter>,
113112
built: bool,
114113
}
@@ -172,7 +171,7 @@ impl Builder {
172171
/// Initializes the filter builder with defaults.
173172
pub fn new() -> Builder {
174173
Builder {
175-
directives: HashMap::new(),
174+
directives: Vec::new(),
176175
filter: None,
177176
built: false,
178177
}
@@ -189,6 +188,19 @@ impl Builder {
189188
builder
190189
}
191190

191+
/// Insert the directive replacing any directive with the same name.
192+
fn insert_directive(&mut self, mut directive: Directive) {
193+
if let Some(pos) = self
194+
.directives
195+
.iter()
196+
.position(|d| d.name == directive.name)
197+
{
198+
mem::swap(&mut self.directives[pos], &mut directive);
199+
} else {
200+
self.directives.push(directive);
201+
}
202+
}
203+
192204
/// Adds a directive to the filter for a specific module.
193205
pub fn filter_module(&mut self, module: &str, level: LevelFilter) -> &mut Self {
194206
self.filter(Some(module), level)
@@ -204,7 +216,10 @@ impl Builder {
204216
/// The given module (if any) will log at most the specified level provided.
205217
/// If no module is provided then the filter will apply to all log messages.
206218
pub fn filter(&mut self, module: Option<&str>, level: LevelFilter) -> &mut Self {
207-
self.directives.insert(module.map(|s| s.to_string()), level);
219+
self.insert_directive(Directive {
220+
name: module.map(|s| s.to_string()),
221+
level,
222+
});
208223
self
209224
}
210225

@@ -219,7 +234,7 @@ impl Builder {
219234
self.filter = filter;
220235

221236
for directive in directives {
222-
self.directives.insert(directive.name, directive.level);
237+
self.insert_directive(directive);
223238
}
224239
self
225240
}
@@ -237,12 +252,8 @@ impl Builder {
237252
level: LevelFilter::Error,
238253
});
239254
} else {
240-
// Consume map of directives.
241-
let directives_map = mem::take(&mut self.directives);
242-
directives = directives_map
243-
.into_iter()
244-
.map(|(name, level)| Directive { name, level })
245-
.collect();
255+
// Consume directives.
256+
directives = mem::take(&mut self.directives);
246257
// Sort the directives by length of their name, this allows a
247258
// little more efficient lookup at runtime.
248259
directives.sort_by(|a, b| {

0 commit comments

Comments
 (0)