package java.nio object CharBuffer { private final val HashSeed = -182887236 // "java.nio.CharBuffer".## def allocate(capacity: Int): CharBuffer = wrap(new Array[Char](capacity)) def wrap(array: Array[Char], offset: Int, length: Int): CharBuffer = HeapCharBuffer.wrap(array, 0, array.length, offset, length, false) def wrap(array: Array[Char]): CharBuffer = wrap(array, 0, array.length) def wrap(csq: CharSequence, start: Int, end: Int): CharBuffer = StringCharBuffer.wrap(csq, 0, csq.length, start, end) def wrap(csq: CharSequence): CharBuffer = wrap(csq, 0, csq.length) } abstract class CharBuffer private[nio] ( _capacity: Int, private[nio] val _array: Array[Char], private[nio] val _arrayOffset: Int) extends Buffer(_capacity) with Comparable[CharBuffer] with CharSequence with Appendable with Readable { def this(_capacity: Int) = this(_capacity, null, -1) def read(target: CharBuffer): Int = { // Attention: this method must not change this buffer's position val n = remaining if (n == 0) -1 else if (_array != null) { // even if read-only target.put(_array, _arrayOffset, n) n } else { val savedPos = position target.put(this) position(savedPos) n } } def slice(): CharBuffer def duplicate(): CharBuffer def asReadOnlyBuffer(): CharBuffer def get(): Char def put(c: Char): CharBuffer def get(index: Int): Char def put(index: Int, c: Char): CharBuffer def get(dst: Array[Char], offset: Int, length: Int): CharBuffer = { val end = offset + length if (offset < 0 || length < 0 || end > dst.length) throw new IndexOutOfBoundsException if (remaining < length) throw new BufferUnderflowException var i = offset while (i != end) { dst(i) = get() i += 1 } this } def get(dst: Array[Char]): CharBuffer = get(dst, 0, dst.length) def put(src: CharBuffer): CharBuffer = { if (src eq this) throw new IllegalArgumentException if (isReadOnly) throw new ReadOnlyBufferException if (src.remaining > remaining) throw new BufferOverflowException var n = src.remaining if (src._array != null) { // even if read-only val pos = src.position put(src._array, src._arrayOffset + pos, n) src.position(pos + n) } else { while (n != 0) { put(src.get()) n -= 1 } } this } def put(src: Array[Char], offset: Int, length: Int): CharBuffer = { val end = offset + length if (offset < 0 || length < 0 || end > src.length) throw new IndexOutOfBoundsException if (isReadOnly) throw new ReadOnlyBufferException if (remaining < length) throw new BufferOverflowException var i = offset while (i != end) { put(src(i)) i += 1 } this } final def put(src: Array[Char]): CharBuffer = put(src, 0, src.length) def put(src: String, start: Int, end: Int): CharBuffer = put(CharBuffer.wrap(src, start, end)) final def put(src: String): CharBuffer = put(src, 0, src.length) @inline final def hasArray(): Boolean = _array != null && !isReadOnly @inline final def array(): Array[Char] = { val a = _array if (a == null) throw new UnsupportedOperationException if (isReadOnly) throw new ReadOnlyBufferException a } @inline final def arrayOffset(): Int = { val o = _arrayOffset if (o == -1) throw new UnsupportedOperationException if (isReadOnly) throw new ReadOnlyBufferException o } def compact(): CharBuffer // Not implemented: //def isDirect(): Boolean override def hashCode(): Int = { import scala.util.hashing.MurmurHash3._ val start = position val end = limit var h = CharBuffer.HashSeed var i = start while (i != end) { h = mix(h, get().##) i += 1 } position(start) finalizeHash(h, end-start) } override def equals(that: Any): Boolean = that match { case that: CharBuffer => compareTo(that) == 0 case _ => false } def compareTo(that: CharBuffer): Int = { if (this eq that) { 0 } else { val thisStart = this.position val thisRemaining = this.remaining val thatStart = that.position val thatRemaining = that.remaining val shortestLength = Math.min(thisRemaining, thatRemaining) var i = 0 while (i != shortestLength) { val cmp = this.get().compareTo(that.get()) if (cmp != 0) { this.position(thisStart) that.position(thatStart) return cmp } i += 1 } this.position(thisStart) that.position(thatStart) thisRemaining.compareTo(thatRemaining) } } override def toString(): String = { if (_array != null) { // even if read-only new String(_array, position + _arrayOffset, remaining) } else { val chars = new Array[Char](remaining) val savedPos = position get(chars) position(savedPos) new String(chars) } } final def length(): Int = remaining final def charAt(index: Int): Char = get(position + index) def subSequence(start: Int, end: Int): CharSequence def append(csq: CharSequence): CharBuffer = put(csq.toString()) def append(csq: CharSequence, start: Int, end: Int): CharBuffer = put(csq.subSequence(start, end).toString()) def append(c: Char): CharBuffer = put(c) def order(): ByteOrder }