summaryrefslogtreecommitdiff
path: root/cask/src/cask/internal/Util.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-26 21:31:39 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-26 21:31:39 +0800
commit4fc6204a01b8a283c0362f9f3244e93b6de65630 (patch)
tree9863bd2960f845b7fe496a1ab938ab208f4d19ad /cask/src/cask/internal/Util.scala
parent84b89ff6ccb1cc1b71d1ae20b914f9a61a0209ab (diff)
downloadcask-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.scala30
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) = {