Loading android/util.go +54 −58 Original line number Diff line number Diff line Loading @@ -29,56 +29,44 @@ func CopyOf(s []string) []string { return append([]string(nil), s...) } // JoinWithPrefix prepends the prefix to each string in the list and // returns them joined together with " " as separator. func JoinWithPrefix(strs []string, prefix string) string { if len(strs) == 0 { return "" } if len(strs) == 1 { return prefix + strs[0] var buf strings.Builder buf.WriteString(prefix) buf.WriteString(strs[0]) for i := 1; i < len(strs); i++ { buf.WriteString(" ") buf.WriteString(prefix) buf.WriteString(strs[i]) } n := len(" ") * (len(strs) - 1) for _, s := range strs { n += len(prefix) + len(s) } ret := make([]byte, 0, n) for i, s := range strs { if i != 0 { ret = append(ret, ' ') } ret = append(ret, prefix...) ret = append(ret, s...) } return string(ret) return buf.String() } // JoinWithSuffix appends the suffix to each string in the list and // returns them joined together with given separator. func JoinWithSuffix(strs []string, suffix string, separator string) string { if len(strs) == 0 { return "" } if len(strs) == 1 { return strs[0] + suffix var buf strings.Builder buf.WriteString(strs[0]) buf.WriteString(suffix) for i := 1; i < len(strs); i++ { buf.WriteString(separator) buf.WriteString(strs[i]) buf.WriteString(suffix) } n := len(" ") * (len(strs) - 1) for _, s := range strs { n += len(suffix) + len(s) } ret := make([]byte, 0, n) for i, s := range strs { if i != 0 { ret = append(ret, separator...) } ret = append(ret, s...) ret = append(ret, suffix...) } return string(ret) return buf.String() } // SortedIntKeys returns the keys of the given integer-keyed map in the ascending order // TODO(asmundak): once Go has generics, combine this with SortedStringKeys below. func SortedIntKeys(m interface{}) []int { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { Loading @@ -93,6 +81,7 @@ func SortedIntKeys(m interface{}) []int { return s } // SorterStringKeys returns the keys of the given string-keyed map in the ascending order func SortedStringKeys(m interface{}) []string { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { Loading @@ -107,6 +96,7 @@ func SortedStringKeys(m interface{}) []string { return s } // SortedStringMapValues returns the values of the string-values map in the ascending order func SortedStringMapValues(m interface{}) []string { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { Loading @@ -121,6 +111,7 @@ func SortedStringMapValues(m interface{}) []string { return s } // IndexList returns the index of the first occurrence of the given string in the list or -1 func IndexList(s string, list []string) int { for i, l := range list { if l == s { Loading @@ -131,6 +122,7 @@ func IndexList(s string, list []string) int { return -1 } // InList checks if the string belongs to the list func InList(s string, list []string) bool { return IndexList(s, list) != -1 } Loading Loading @@ -176,7 +168,10 @@ func IndexListPred(pred func(s string) bool, list []string) int { return -1 } // FilterList divides the string list into two lists: one with the strings belonging // to the given filter list, and the other with the remaining ones func FilterList(list []string, filter []string) (remainder []string, filtered []string) { // InList is O(n). May be worth using more efficient lookup for longer lists. for _, l := range list { if InList(l, filter) { filtered = append(filtered, l) Loading @@ -188,6 +183,8 @@ func FilterList(list []string, filter []string) (remainder []string, filtered [] return } // RemoveListFromList removes the strings belonging to the filter list from the // given list and returns the result func RemoveListFromList(list []string, filter_out []string) (result []string) { result = make([]string, 0, len(list)) for _, l := range list { Loading @@ -198,20 +195,18 @@ func RemoveListFromList(list []string, filter_out []string) (result []string) { return } // RemoveFromList removes given string from the string list. func RemoveFromList(s string, list []string) (bool, []string) { i := IndexList(s, list) if i == -1 { return false, list } result := make([]string, 0, len(list)-1) result = append(result, list[:i]...) for _, l := range list[i+1:] { if l != s { result = append(result, l) result := make([]string, 0, len(list)) var removed bool for _, item := range list { if item != s { result = append(result, item) } else { removed = true } } return true, result return removed, result } // FirstUniqueStrings returns all unique elements of a slice of strings, keeping the first copy of Loading Loading @@ -317,12 +312,11 @@ func callerName(skip int) (pkgPath, funcName string, ok bool) { return s[1], s[2], true } // GetNumericSdkVersion removes the first occurrence of system_ in a string, // which is assumed to be something like "system_1.2.3" func GetNumericSdkVersion(v string) string { if strings.Contains(v, "system_") { return strings.Replace(v, "system_", "", 1) } return v } // copied from build/kati/strutil.go func substPattern(pat, repl, str string) string { Loading @@ -334,17 +328,17 @@ func substPattern(pat, repl, str string) string { return str } in := str trimed := str trimmed := str if ps[0] != "" { trimed = strings.TrimPrefix(in, ps[0]) if trimed == in { trimmed = strings.TrimPrefix(in, ps[0]) if trimmed == in { return str } } in = trimed in = trimmed if ps[1] != "" { trimed = strings.TrimSuffix(in, ps[1]) if trimed == in { trimmed = strings.TrimSuffix(in, ps[1]) if trimmed == in { return str } } Loading @@ -353,7 +347,7 @@ func substPattern(pat, repl, str string) string { if len(rs) != 2 { return repl } return rs[0] + trimed + rs[1] return rs[0] + trimmed + rs[1] } // copied from build/kati/strutil.go Loading Loading @@ -424,13 +418,15 @@ func ShardStrings(s []string, shardSize int) [][]string { return ret } // CheckDuplicate checks if there are duplicates in given string list. // If there are, it returns first such duplicate and true. func CheckDuplicate(values []string) (duplicate string, found bool) { seen := make(map[string]string) for _, v := range values { if duplicate, found = seen[v]; found { return return duplicate, true } seen[v] = v } return return "", false } Loading
android/util.go +54 −58 Original line number Diff line number Diff line Loading @@ -29,56 +29,44 @@ func CopyOf(s []string) []string { return append([]string(nil), s...) } // JoinWithPrefix prepends the prefix to each string in the list and // returns them joined together with " " as separator. func JoinWithPrefix(strs []string, prefix string) string { if len(strs) == 0 { return "" } if len(strs) == 1 { return prefix + strs[0] var buf strings.Builder buf.WriteString(prefix) buf.WriteString(strs[0]) for i := 1; i < len(strs); i++ { buf.WriteString(" ") buf.WriteString(prefix) buf.WriteString(strs[i]) } n := len(" ") * (len(strs) - 1) for _, s := range strs { n += len(prefix) + len(s) } ret := make([]byte, 0, n) for i, s := range strs { if i != 0 { ret = append(ret, ' ') } ret = append(ret, prefix...) ret = append(ret, s...) } return string(ret) return buf.String() } // JoinWithSuffix appends the suffix to each string in the list and // returns them joined together with given separator. func JoinWithSuffix(strs []string, suffix string, separator string) string { if len(strs) == 0 { return "" } if len(strs) == 1 { return strs[0] + suffix var buf strings.Builder buf.WriteString(strs[0]) buf.WriteString(suffix) for i := 1; i < len(strs); i++ { buf.WriteString(separator) buf.WriteString(strs[i]) buf.WriteString(suffix) } n := len(" ") * (len(strs) - 1) for _, s := range strs { n += len(suffix) + len(s) } ret := make([]byte, 0, n) for i, s := range strs { if i != 0 { ret = append(ret, separator...) } ret = append(ret, s...) ret = append(ret, suffix...) } return string(ret) return buf.String() } // SortedIntKeys returns the keys of the given integer-keyed map in the ascending order // TODO(asmundak): once Go has generics, combine this with SortedStringKeys below. func SortedIntKeys(m interface{}) []int { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { Loading @@ -93,6 +81,7 @@ func SortedIntKeys(m interface{}) []int { return s } // SorterStringKeys returns the keys of the given string-keyed map in the ascending order func SortedStringKeys(m interface{}) []string { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { Loading @@ -107,6 +96,7 @@ func SortedStringKeys(m interface{}) []string { return s } // SortedStringMapValues returns the values of the string-values map in the ascending order func SortedStringMapValues(m interface{}) []string { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { Loading @@ -121,6 +111,7 @@ func SortedStringMapValues(m interface{}) []string { return s } // IndexList returns the index of the first occurrence of the given string in the list or -1 func IndexList(s string, list []string) int { for i, l := range list { if l == s { Loading @@ -131,6 +122,7 @@ func IndexList(s string, list []string) int { return -1 } // InList checks if the string belongs to the list func InList(s string, list []string) bool { return IndexList(s, list) != -1 } Loading Loading @@ -176,7 +168,10 @@ func IndexListPred(pred func(s string) bool, list []string) int { return -1 } // FilterList divides the string list into two lists: one with the strings belonging // to the given filter list, and the other with the remaining ones func FilterList(list []string, filter []string) (remainder []string, filtered []string) { // InList is O(n). May be worth using more efficient lookup for longer lists. for _, l := range list { if InList(l, filter) { filtered = append(filtered, l) Loading @@ -188,6 +183,8 @@ func FilterList(list []string, filter []string) (remainder []string, filtered [] return } // RemoveListFromList removes the strings belonging to the filter list from the // given list and returns the result func RemoveListFromList(list []string, filter_out []string) (result []string) { result = make([]string, 0, len(list)) for _, l := range list { Loading @@ -198,20 +195,18 @@ func RemoveListFromList(list []string, filter_out []string) (result []string) { return } // RemoveFromList removes given string from the string list. func RemoveFromList(s string, list []string) (bool, []string) { i := IndexList(s, list) if i == -1 { return false, list } result := make([]string, 0, len(list)-1) result = append(result, list[:i]...) for _, l := range list[i+1:] { if l != s { result = append(result, l) result := make([]string, 0, len(list)) var removed bool for _, item := range list { if item != s { result = append(result, item) } else { removed = true } } return true, result return removed, result } // FirstUniqueStrings returns all unique elements of a slice of strings, keeping the first copy of Loading Loading @@ -317,12 +312,11 @@ func callerName(skip int) (pkgPath, funcName string, ok bool) { return s[1], s[2], true } // GetNumericSdkVersion removes the first occurrence of system_ in a string, // which is assumed to be something like "system_1.2.3" func GetNumericSdkVersion(v string) string { if strings.Contains(v, "system_") { return strings.Replace(v, "system_", "", 1) } return v } // copied from build/kati/strutil.go func substPattern(pat, repl, str string) string { Loading @@ -334,17 +328,17 @@ func substPattern(pat, repl, str string) string { return str } in := str trimed := str trimmed := str if ps[0] != "" { trimed = strings.TrimPrefix(in, ps[0]) if trimed == in { trimmed = strings.TrimPrefix(in, ps[0]) if trimmed == in { return str } } in = trimed in = trimmed if ps[1] != "" { trimed = strings.TrimSuffix(in, ps[1]) if trimed == in { trimmed = strings.TrimSuffix(in, ps[1]) if trimmed == in { return str } } Loading @@ -353,7 +347,7 @@ func substPattern(pat, repl, str string) string { if len(rs) != 2 { return repl } return rs[0] + trimed + rs[1] return rs[0] + trimmed + rs[1] } // copied from build/kati/strutil.go Loading Loading @@ -424,13 +418,15 @@ func ShardStrings(s []string, shardSize int) [][]string { return ret } // CheckDuplicate checks if there are duplicates in given string list. // If there are, it returns first such duplicate and true. func CheckDuplicate(values []string) (duplicate string, found bool) { seen := make(map[string]string) for _, v := range values { if duplicate, found = seen[v]; found { return return duplicate, true } seen[v] = v } return return "", false }