diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-26 21:31:39 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-26 21:31:39 +0800 |
commit | 4fc6204a01b8a283c0362f9f3244e93b6de65630 (patch) | |
tree | 9863bd2960f845b7fe496a1ab938ab208f4d19ad /cask/src/cask/internal/Util.scala | |
parent | 84b89ff6ccb1cc1b71d1ae20b914f9a61a0209ab (diff) | |
download | cask-4fc6204a01b8a283c0362f9f3244e93b6de65630.tar.gz cask-4fc6204a01b8a283c0362f9f3244e93b6de65630.tar.bz2 cask-4fc6204a01b8a283c0362f9f3244e93b6de65630.zip |
0.1.7: micro-optimizations to remove trivially unnecessary bottlenecks0.1.7
Diffstat (limited to 'cask/src/cask/internal/Util.scala')
-rw-r--r-- | cask/src/cask/internal/Util.scala | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/cask/src/cask/internal/Util.scala b/cask/src/cask/internal/Util.scala index 7da343e..431944a 100644 --- a/cask/src/cask/internal/Util.scala +++ b/cask/src/cask/internal/Util.scala @@ -54,8 +54,34 @@ object Util { def pluralize(s: String, n: Int) = { if (n == 1) s else s + "s" } - def splitPath(p: String) = { - p.dropWhile(_ == '/').reverse.dropWhile(_ == '/').reverse.split('/').filter(_.nonEmpty) + + /** + * Splits a string into path segments; automatically removes all + * leading/trailing slashes, and ignores empty path segments. + * + * Written imperatively for performance since it's used all over the place. + */ + def splitPath(p: String): IndexedSeq[String] = { + val pLength = p.length + var i = 0 + while(i < pLength && p(i) == '/') i += 1 + var segmentStart = i + val out = mutable.ArrayBuffer.empty[String] + + def complete() = { + if (i != segmentStart) { + val s = p.substring(segmentStart, i) + out += s + } + segmentStart = i + 1 + } + + while(i < pLength){ + if (p(i) == '/') complete() + i += 1 + } + complete() + out } def stackTraceString(e: Throwable) = { |