From bebd453db9de458d8b3d5a3e2f32efdb7b7fe147 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 13 Feb 2015 20:01:22 +0100 Subject: [PATCH] avoiding toLowerCase() calls --- .../intellij/openapi/util/io/FileUtilRt.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/platform/util-rt/src/com/intellij/openapi/util/io/FileUtilRt.java b/platform/util-rt/src/com/intellij/openapi/util/io/FileUtilRt.java index 396d39ce2f2b..57d13e51e736 100644 --- a/platform/util-rt/src/com/intellij/openapi/util/io/FileUtilRt.java +++ b/platform/util-rt/src/com/intellij/openapi/util/io/FileUtilRt.java @@ -210,18 +210,14 @@ public class FileUtilRt { } @Nullable - public static String getRelativePath(@NotNull String basePath, - @NotNull String filePath, - final char separator, - final boolean caseSensitive) { + public static String getRelativePath(@NotNull String basePath, @NotNull String filePath, final char separator, final boolean caseSensitive) { basePath = ensureEnds(basePath, separator); - String basePathToCompare = caseSensitive ? basePath : basePath.toLowerCase(); - String filePathToCompare = caseSensitive ? filePath : filePath.toLowerCase(); - if (basePathToCompare.equals(ensureEnds(filePathToCompare, separator))) return "."; + if (basePath.equals(ensureEnds(filePath, separator))) return "."; int len = 0; int lastSeparatorIndex = 0; // need this for cases like this: base="/temp/abc/base" and file="/temp/ab" - while (len < filePath.length() && len < basePath.length() && filePathToCompare.charAt(len) == basePathToCompare.charAt(len)) { + final CharComparingStrategy charComparingStrategy = caseSensitive? CharComparingStrategy.IDENTITY : CharComparingStrategy.CASE_INSENSITIVE; + while (len < filePath.length() && len < basePath.length() && charComparingStrategy.charsEqual(filePath.charAt(len), basePath.charAt(len))) { if (basePath.charAt(len) == separator) { lastSeparatorIndex = len; } @@ -798,4 +794,21 @@ public class FileUtilRt { return 2500 * KILOBYTE; } } + + private interface CharComparingStrategy { + CharComparingStrategy IDENTITY = new CharComparingStrategy() { + @Override + public boolean charsEqual(char ch1, char ch2) { + return ch1 == ch2; + } + }; + CharComparingStrategy CASE_INSENSITIVE = new CharComparingStrategy() { + @Override + public boolean charsEqual(char ch1, char ch2) { + return StringUtilRt.charsEqualIgnoreCase(ch1, ch2); + } + }; + + boolean charsEqual(char ch1, char ch2); + } }