diff options
| author | Albert Nigmatzianov <[email protected]> | 2017-04-18 07:23:14 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-04-18 07:23:14 +0200 |
| commit | 2300d0f8576fe575f71aaa5b9bbe4e1b0dc2eb51 (patch) | |
| tree | 9996cd8b3061976716152d8054618e42f91788b5 | |
| parent | 9e4c21054fa135711121b557932b1887f2405d92 (diff) | |
| parent | 0328f159d6f2cbe8b87468ff88f631b0d4d16953 (diff) | |
Merge pull request #119 from bogem/cachesortede
Cache sorted flags
| -rw-r--r-- | flag.go | 21 |
1 files changed, 19 insertions, 2 deletions
@@ -142,8 +142,10 @@ type FlagSet struct { parsed bool actual map[NormalizedName]*Flag orderedActual []*Flag + sortedActual []*Flag formal map[NormalizedName]*Flag orderedFormal []*Flag + sortedFormal []*Flag shorthands map[byte]*Flag args []string // arguments after flags argsLenAtDash int // len(args) when a '--' was located when parsing, or -1 if no -- @@ -199,6 +201,7 @@ func sortFlags(flags map[NormalizedName]*Flag) []*Flag { // "--getUrl" which may also be translated to "geturl" and everything will work. func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) NormalizedName) { f.normalizeNameFunc = n + f.sortedFormal = f.sortedFormal[:0] for k, v := range f.orderedFormal { delete(f.formal, NormalizedName(v.Name)) nname := f.normalizeFlagName(v.Name) @@ -239,9 +242,16 @@ func (f *FlagSet) SetOutput(output io.Writer) { // in primordial order if f.SortFlags is false, calling fn for each. // It visits all flags, even those not set. func (f *FlagSet) VisitAll(fn func(*Flag)) { + if len(f.formal) == 0 { + return + } + var flags []*Flag if f.SortFlags { - flags = sortFlags(f.formal) + if len(f.formal) != len(f.sortedFormal) { + f.sortedFormal = sortFlags(f.formal) + } + flags = f.sortedFormal } else { flags = f.orderedFormal } @@ -278,9 +288,16 @@ func VisitAll(fn func(*Flag)) { // in primordial order if f.SortFlags is false, calling fn for each. // It visits only those flags that have been set. func (f *FlagSet) Visit(fn func(*Flag)) { + if len(f.actual) == 0 { + return + } + var flags []*Flag if f.SortFlags { - flags = sortFlags(f.actual) + if len(f.actual) != len(f.sortedActual) { + f.sortedActual = sortFlags(f.actual) + } + flags = f.sortedActual } else { flags = f.orderedActual } |
