Skip to content

Commit 78971fd

Browse files
committed
perf(App): removed unneeded BTreeMap
1 parent 64b921d commit 78971fd

File tree

2 files changed

+71
-82
lines changed

2 files changed

+71
-82
lines changed

src/app/app.rs

+59-68
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ pub struct App<'a, 'v, 'ab, 'u, 'h, 'ar> {
7272
// A list of possible options
7373
opts: BTreeMap<&'ar str, OptBuilder<'ar>>,
7474
// A list of positional arguments
75-
positionals_idx: VecMap<PosBuilder<'ar>>,
76-
positionals_name: HashMap<&'ar str, usize>,
75+
positionals: VecMap<PosBuilder<'ar>>,
7776
// A list of subcommands
7877
subcommands: BTreeMap<String, App<'a, 'v, 'ab, 'u, 'h, 'ar>>,
7978
help_short: Option<char>,
@@ -115,8 +114,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
115114
version: None,
116115
flags: BTreeMap::new(),
117116
opts: BTreeMap::new(),
118-
positionals_idx: VecMap::new(),
119-
positionals_name: HashMap::new(),
117+
positionals: VecMap::new(),
120118
subcommands: BTreeMap::new(),
121119
help_short: None,
122120
version_short: None,
@@ -734,7 +732,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
734732
// actually adds the arguments
735733
fn add_arg(&mut self, a: Arg<'ar, 'ar, 'ar, 'ar, 'ar, 'ar>) {
736734
if self.flags.contains_key(a.name) || self.opts.contains_key(a.name) ||
737-
self.positionals_name.contains_key(a.name) {
735+
self.positionals.values().any(|p| p.name == a.name) {
738736
panic!("Argument name must be unique\n\n\t\"{}\" is already in use",
739737
a.name);
740738
}
@@ -768,19 +766,19 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
768766
}
769767
if a.index.is_some() || (a.short.is_none() && a.long.is_none()) {
770768
let i = if a.index.is_none() {
771-
(self.positionals_idx.len() + 1)
769+
(self.positionals.len() + 1)
772770
} else {
773771
a.index.unwrap() as usize
774772
};
775-
if self.positionals_idx.contains_key(&i) {
773+
if self.positionals.contains_key(&i) {
776774
panic!("Argument \"{}\" has the same index as another positional \
777775
argument\n\n\tPerhaps try .multiple(true) to allow one positional argument \
778776
to take multiple values",
779777
a.name);
780778
}
781779
let pb = PosBuilder::from_arg(&a, i as u8, &mut self.required);
782-
self.positionals_name.insert(pb.name, i);
783-
self.positionals_idx.insert(i, pb);
780+
// self.positionals_name.insert(pb.name, i);
781+
self.positionals.insert(i, pb);
784782
} else if a.takes_value {
785783
let ob = OptBuilder::from_arg(&a, &mut self.required);
786784
self.opts.insert(ob.name, ob);
@@ -1064,7 +1062,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
10641062
// If it's required we also need to ensure all previous positionals are
10651063
// required too
10661064
let mut found = false;
1067-
for p in self.positionals_idx.values().rev() {
1065+
for p in self.positionals.values().rev() {
10681066
if found {
10691067
reqs.push(p.name);
10701068
continue;
@@ -1092,15 +1090,15 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
10921090

10931091
// places a '--' in the usage string if there are args and options
10941092
// supporting multiple values
1095-
if !self.positionals_idx.is_empty() &&
1093+
if !self.positionals.is_empty() &&
10961094
(self.opts.values().any(|a| a.settings.is_set(&ArgSettings::Multiple)) ||
1097-
self.positionals_idx.values().any(|a| a.settings.is_set(&ArgSettings::Multiple))) &&
1095+
self.positionals.values().any(|a| a.settings.is_set(&ArgSettings::Multiple))) &&
10981096
!self.opts.values().any(|a| a.settings.is_set(&ArgSettings::Required)) &&
10991097
self.subcommands.is_empty() {
11001098
usage.push_str(" [--]")
11011099
}
1102-
if !self.positionals_idx.is_empty() &&
1103-
self.positionals_idx
1100+
if !self.positionals.is_empty() &&
1101+
self.positionals
11041102
.values()
11051103
.any(|a| !a.settings.is_set(&ArgSettings::Required)) {
11061104
usage.push_str(" [ARGS]");
@@ -1156,7 +1154,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
11561154
&self.bin_name.as_ref().unwrap_or(&self.name)[..].replace(" ", "-"),
11571155
self.version.unwrap_or("")));
11581156
let flags = !self.flags.is_empty();
1159-
let pos = !self.positionals_idx.is_empty();
1157+
let pos = !self.positionals.is_empty();
11601158
let opts = !self.opts.is_empty();
11611159
let subcmds = !self.subcommands.is_empty();
11621160
let unified_help = self.settings.is_set(&AppSettings::UnifiedHelpMessage);
@@ -1180,7 +1178,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
11801178
}
11811179
}
11821180
let mut longest_pos = 0;
1183-
for pl in self.positionals_idx
1181+
for pl in self.positionals
11841182
.values()
11851183
.filter(|p| !p.settings.is_set(&ArgSettings::Hidden))
11861184
.map(|f| f.to_string().len()) {
@@ -1267,7 +1265,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
12671265
}
12681266
if pos {
12691267
try!(write!(w, "\nARGS:\n"));
1270-
for v in self.positionals_idx
1268+
for v in self.positionals
12711269
.values()
12721270
.filter(|p| !p.settings.is_set(&ArgSettings::Hidden)) {
12731271
try!(v.write_help(w, tab, longest_pos));
@@ -1852,12 +1850,12 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
18521850

18531851
// Did the developer even define any valid positionals? Since we reached this
18541852
// far, it's not a subcommand
1855-
if self.positionals_idx.is_empty() {
1853+
if self.positionals.is_empty() {
18561854
return Err(error_builder::UnexpectedArgument(
18571855
arg_slice,
18581856
self.bin_name.as_ref().unwrap_or(&self.name),
18591857
&*self.create_current_usage(matches)));
1860-
} else if let Some(p) = self.positionals_idx.get(&pos_counter) {
1858+
} else if let Some(p) = self.positionals.get(&pos_counter) {
18611859
// Make sure this one doesn't conflict with anything
18621860
if self.blacklist.contains(&p.name) {
18631861
return Err(error_builder::ArgumentConflict(
@@ -1902,7 +1900,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
19021900

19031901
if !pos_only &&
19041902
(self.settings.is_set(&AppSettings::TrailingVarArg) &&
1905-
pos_counter == self.positionals_idx.len()) {
1903+
pos_counter == self.positionals.len()) {
19061904
pos_only = true;
19071905
}
19081906
} else {
@@ -1912,9 +1910,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
19121910
// Was an update made, or is this the first occurrence?
19131911
if !done {
19141912
if self.overrides.contains(&p.name) {
1915-
if let Some(name) = self.overriden_from(p.name, matches) {
1916-
matches.args.remove(&*name);
1917-
remove_overriden!(self, &*name);
1913+
if let Some(ref name) = self.overriden_from(p.name, matches) {
1914+
matches.args.remove(name);
1915+
remove_overriden!(self, name);
19181916
}
19191917
}
19201918
if let Some(ref or) = p.overrides {
@@ -2013,7 +2011,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
20132011
}
20142012
} else {
20152013
return Err(error_builder::EmptyValue(
2016-
&*format!("{}", self.positionals_idx.get(self.positionals_name.get(a).unwrap())
2014+
&*format!("{}", self.positionals.values()
2015+
.filter(|p| &p.name == a)
2016+
.next()
20172017
.unwrap()),
20182018
&*self.create_current_usage(matches)
20192019
));
@@ -2148,12 +2148,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
21482148
.filter(|k| {
21492149
if let Some(o) = self.opts.get(*k) {
21502150
!o.settings.is_set(&ArgSettings::Required)
2151-
} else if let Some(p) = self.positionals_name.get(*k) {
2152-
if let Some(p) = self.positionals_idx.get(p) {
2151+
} else if let Some(p) = self.positionals.values()
2152+
.filter(|p| &&p.name == k)
2153+
.next() {
21532154
!p.settings.is_set(&ArgSettings::Required)
2154-
} else {
2155-
true
2156-
}
21572155
} else {
21582156
true
21592157
}
@@ -2194,10 +2192,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
21942192
} else if self.groups.contains_key(n) {
21952193
g_vec.push(*n);
21962194
} else {
2197-
if let Some(idx) = self.positionals_name.get(n) {
2198-
if let Some(p) = self.positionals_idx.get(&idx) {
2199-
args.push(p.to_string());
2200-
}
2195+
if let Some(p) = self.positionals.values()
2196+
.filter(|p| &p.name == n)
2197+
.next() {
2198+
args.push(p.to_string());
22012199
}
22022200
}
22032201
}
@@ -2227,10 +2225,8 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
22272225
args.push(*n);
22282226
} else if self.groups.contains_key(n) {
22292227
g_vec.push(*n);
2230-
} else {
2231-
if self.positionals_name.contains_key(n) {
2232-
args.push(*n);
2233-
}
2228+
} else if self.positionals.values().any(|p| &p.name == n) {
2229+
args.push(*n);
22342230
}
22352231
}
22362232

@@ -2345,10 +2341,8 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
23452341
if matches.is_some() && matches.as_ref().unwrap().is_present(p) {
23462342
continue;
23472343
}
2348-
if let Some(idx) = self.positionals_name.get(p) {
2349-
if let Some(ref p) = self.positionals_idx.get(&idx) {
2350-
pmap.insert(p.index, format!("{}", p));
2351-
}
2344+
if let Some(p) = self.positionals.values().filter(|x| &x.name == p).next() {
2345+
pmap.insert(p.index, format!("{}", p));
23522346
}
23532347
}
23542348
for (_, s) in pmap {
@@ -2388,26 +2382,26 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
23882382
// but no 2)
23892383
//
23902384
// Next we verify that only the highest index has a .multiple(true) (if any)
2391-
if let Some((idx, ref p)) = self.positionals_idx.iter().rev().next() {
2392-
if idx != self.positionals_idx.len() {
2385+
if let Some((idx, ref p)) = self.positionals.iter().rev().next() {
2386+
if idx != self.positionals.len() {
23932387
panic!("Found positional argument \"{}\" who's index is {} but there are only {} \
23942388
positional arguments defined",
23952389
p.name,
23962390
idx,
2397-
self.positionals_idx.len());
2391+
self.positionals.len());
23982392
}
23992393
}
2400-
assert!(!self.positionals_idx
2394+
assert!(!self.positionals
24012395
.values()
24022396
.any(|a| a.settings.is_set(&ArgSettings::Multiple) &&
2403-
(a.index as usize != self.positionals_idx.len())),
2397+
(a.index as usize != self.positionals.len())),
24042398
"Found positional argument which accepts multiple values but is not \
24052399
the last positional argument (i.e. others have a higher index)");
24062400

24072401
// If it's required we also need to ensure all previous positionals are
24082402
// required too
24092403
let mut found = false;
2410-
for (_, p) in self.positionals_idx.iter_mut().rev() {
2404+
for (_, p) in self.positionals.iter_mut().rev() {
24112405
if found {
24122406
p.settings.set(&ArgSettings::Required);
24132407
self.required.push(p.name);
@@ -2476,12 +2470,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
24762470
}
24772471
}
24782472
}
2479-
if let Some(idx) = self.positionals_name.get(k) {
2480-
if let Some(pos) = self.positionals_idx.get(idx) {
2481-
if let Some(ref bl) = pos.blacklist {
2482-
if bl.contains(&name) {
2483-
return Some(format!("{}", pos));
2484-
}
2473+
if let Some(pos) = self.positionals.values().filter(|p| &p.name == k).next() {
2474+
if let Some(ref bl) = pos.blacklist {
2475+
if bl.contains(&name) {
2476+
return Some(format!("{}", pos));
24852477
}
24862478
}
24872479
}
@@ -2505,12 +2497,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
25052497
}
25062498
}
25072499
}
2508-
if let Some(idx) = self.positionals_name.get(k) {
2509-
if let Some(pos) = self.positionals_idx.get(idx) {
2510-
if let Some(ref bl) = pos.overrides {
2511-
if bl.contains(&name) {
2512-
return Some(pos.name);
2513-
}
2500+
if let Some(pos) = self.positionals.values().filter(|p| &p.name == k).next() {
2501+
if let Some(ref bl) = pos.overrides {
2502+
if bl.contains(&name) {
2503+
return Some(pos.name);
25142504
}
25152505
}
25162506
}
@@ -2665,7 +2655,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
26652655
if self.overrides.contains(&v.name) {
26662656
debugln!("it is...");
26672657
debugln!("checking who defined it...");
2668-
if let Some(name) = self.overriden_from(v.name, matches) {
2658+
if let Some(ref name) = self.overriden_from(v.name, matches) {
26692659
debugln!("found {}", name);
26702660
if let Some(ref vec) = self.groups_for_arg(v.name) {
26712661
for grp in vec {
@@ -2808,7 +2798,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
28082798
if self.overrides.contains(&v.name) {
28092799
debugln!("it is...");
28102800
debugln!("checking who defined it...");
2811-
if let Some(name) = self.overriden_from(v.name, matches) {
2801+
if let Some(ref name) = self.overriden_from(v.name, matches) {
28122802
debugln!("found {}", name);
28132803
matches.args.remove(name);
28142804
remove_overriden!(self, name);
@@ -2999,7 +2989,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
29992989
self.create_current_usage(matches)));
30002990
}
30012991
if self.overrides.contains(&v.name) {
3002-
if let Some(name) = self.overriden_from(v.name, matches) {
2992+
if let Some(ref name) = self.overriden_from(v.name, matches) {
30032993
matches.args.remove(&*name);
30042994
remove_overriden!(self, &*name);
30052995
}
@@ -3115,7 +3105,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
31153105
if self.overrides.contains(&v.name) {
31163106
debugln!("it is...");
31173107
debugln!("checking who defined it...");
3118-
if let Some(name) = self.overriden_from(v.name, matches) {
3108+
if let Some(ref name) = self.overriden_from(v.name, matches) {
31193109
debugln!("found {}", name);
31203110
matches.args.remove(name);
31213111
remove_overriden!(self, name);
@@ -3211,7 +3201,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
32113201
} else if let Some(o) = self.opts.get(name) {
32123202
o.to_string()
32133203
} else {
3214-
match self.positionals_idx.values()
3204+
match self.positionals.values()
32153205
.filter(|p| p.name == *name)
32163206
.next() {
32173207
Some(p) => p.to_string(),
@@ -3232,7 +3222,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
32323222
} else if let Some(o) = self.opts.get(name) {
32333223
o.to_string()
32343224
} else {
3235-
match self.positionals_idx.values()
3225+
match self.positionals.values()
32363226
.filter(|p| p.name == n)
32373227
.next() {
32383228
Some(p) => p.to_string(),
@@ -3300,8 +3290,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
33003290
&*self.create_current_usage(matches)));
33013291
}
33023292
}
3303-
} else if let Some(f) = self.positionals_idx
3304-
.get(self.positionals_name.get(name).unwrap()) {
3293+
} else if let Some(f) = self.positionals.values()
3294+
.filter(|p| &p.name == name)
3295+
.next() {
33053296
if let Some(num) = f.num_vals {
33063297
if num != vals.len() as u8 {
33073298
return Err(error_builder::WrongNumValues(
@@ -3385,7 +3376,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
33853376
}
33863377
}
33873378
// because positions use different keys, we dont use the macro
3388-
match self.positionals_idx.values().filter(|p| &p.name == name).next() {
3379+
match self.positionals.values().filter(|p| &p.name == name).next() {
33893380
Some(p) => {
33903381
if let Some(ref bl) = p.blacklist {
33913382
for n in bl.iter() {

src/macros.rs

+12-14
Original file line numberDiff line numberDiff line change
@@ -105,22 +105,20 @@ macro_rules! remove_overriden {
105105
vec_remove!($me.overrides, a);
106106
}
107107
}
108-
} else if let Some(p) = $me.positionals_name.get($name) {
109-
if let Some(ref o) = $me.positionals_idx.get(p) {
110-
if let Some(ref ora) = o.requires {
111-
for a in ora {
112-
vec_remove!($me.required, a);
113-
}
108+
} else if let Some(p) = $me.positionals.values().filter(|p| &&p.name == &$name).next() {
109+
if let Some(ref ora) = p.requires {
110+
for a in ora {
111+
vec_remove!($me.required, a);
114112
}
115-
if let Some(ref ora) = o.blacklist {
116-
for a in ora {
117-
vec_remove!($me.blacklist, a);
118-
}
113+
}
114+
if let Some(ref ora) = p.blacklist {
115+
for a in ora {
116+
vec_remove!($me.blacklist, a);
119117
}
120-
if let Some(ref ora) = o.overrides {
121-
for a in ora {
122-
vec_remove!($me.overrides, a);
123-
}
118+
}
119+
if let Some(ref ora) = p.overrides {
120+
for a in ora {
121+
vec_remove!($me.overrides, a);
124122
}
125123
}
126124
}

0 commit comments

Comments
 (0)