def slice()

in util-core/src/main/scala/com/twitter/io/Buf.scala [434:491]


    def slice(from: Int, until: Int): Buf = {
      checkSliceArgs(from, until)

      if (this.isSliceEmpty(from, until)) return Buf.Empty
      else if (isSliceIdentity(from, until)) return this

      var begin = from
      var end = until
      var start, startBegin, startEnd, finish, finishBegin, finishEnd = -1
      var cur = 0
      while (cur < bufs.length && finish == -1) {
        val buf = bufs(cur)
        val len = buf.length
        if (begin >= 0 && begin < len) {
          start = cur
          startBegin = begin
          startEnd = end
        }
        if (end <= len) {
          finish = cur
          finishBegin = math.max(0, begin)
          finishEnd = end
        }
        begin -= len
        end -= len
        cur += 1
      }
      if (start == -1) Buf.Empty
      else if (start == finish || (start == (cur - 1) && finish == -1)) {
        bufs(start).slice(startBegin, startEnd)
      } else if (finish == -1) {
        val untrimmedFirst = bufs(start)
        val first: Buf =
          if (startBegin == 0 && startEnd >= untrimmedFirst.length) null
          else untrimmedFirst.slice(startBegin, startEnd)
        Buf(
          if (first == null) bufs.slice(start, length)
          else first +: bufs.slice(start + 1, length)
        )
      } else {
        val untrimmedFirst = bufs(start)
        val first: Buf =
          if (startBegin == 0 && startEnd >= untrimmedFirst.length) null
          else untrimmedFirst.slice(startBegin, startEnd)

        val untrimmedLast = bufs(finish)
        val last: Buf =
          if (finishBegin == 0 && finishEnd >= untrimmedLast.length) null
          else untrimmedLast.slice(finishBegin, finishEnd)

        Buf(
          if (first == null && last == null) bufs.slice(start, finish + 1)
          else if (first == null) bufs.slice(start, finish) :+ last
          else if (last == null) first +: bufs.slice(start + 1, finish + 1)
          else first +: bufs.slice(start + 1, finish) :+ last
        )
      }
    }