summaryrefslogblamecommitdiff
path: root/examples/scala-js/javalib/src/main/scala/java/nio/HeapByteBuffer.scala
blob: ed3fd298906ffed5aa66232ae5087683c0a2df5e (plain) (tree)
































































































































                                                                               
package java.nio

private[nio] final class HeapByteBuffer private (
    _capacity: Int, _array0: Array[Byte], _arrayOffset0: Int,
    _initialPosition: Int, _initialLimit: Int, _readOnly: Boolean)
    extends ByteBuffer(_capacity, _array0, _arrayOffset0) {

  position(_initialPosition)
  limit(_initialLimit)

  def isReadOnly(): Boolean = _readOnly

  def isDirect(): Boolean = false

  def slice(): ByteBuffer = {
    val cap = remaining
    new HeapByteBuffer(cap, _array, _arrayOffset+position, 0, cap, isReadOnly)
  }

  def duplicate(): ByteBuffer = {
    val result = new HeapByteBuffer(capacity, _array, _arrayOffset,
        position, limit, isReadOnly)
    result._mark = this._mark
    result
  }

  def asReadOnlyBuffer(): ByteBuffer = {
    val result = new HeapByteBuffer(capacity, _array, _arrayOffset,
        position, limit, true)
    result._mark = this._mark
    result
  }

  def get(): Byte = {
    if (!hasRemaining)
      throw new BufferUnderflowException
    val p = position
    position(p + 1)
    _array(_arrayOffset + p)
  }

  def put(b: Byte): ByteBuffer = {
    if (isReadOnly)
      throw new ReadOnlyBufferException
    if (!hasRemaining)
      throw new BufferOverflowException
    val p = position
    _array(_arrayOffset + p) = b
    position(p + 1)
    this
  }

  def get(index: Int): Byte = {
    if (index < 0 || index >= limit)
      throw new IndexOutOfBoundsException
    _array(_arrayOffset + index)
  }

  def put(index: Int, b: Byte): ByteBuffer = {
    if (isReadOnly)
      throw new ReadOnlyBufferException
    if (index < 0 || index >= limit)
      throw new IndexOutOfBoundsException
    _array(_arrayOffset + index) = b
    this
  }

  override def get(dst: Array[Byte], offset: Int, length: Int): ByteBuffer = {
    val end = offset + length

    if (offset < 0 || length < 0 || end > dst.length)
      throw new IndexOutOfBoundsException

    val startPos = position
    val endPos = startPos + length
    if (endPos > limit)
      throw new BufferUnderflowException

    System.arraycopy(_array, startPos + _arrayOffset, dst, offset, length)
    position(endPos)

    this
  }

  override def put(src: Array[Byte], offset: Int, length: Int): ByteBuffer = {
    val end = offset + length
    if (offset < 0 || length < 0 || end > src.length)
      throw new IndexOutOfBoundsException
    if (isReadOnly)
      throw new ReadOnlyBufferException

    val startPos = position
    val endPos = startPos + length
    if (endPos > limit)
      throw new BufferOverflowException

    System.arraycopy(src, offset, _array, startPos + _arrayOffset, length)
    position(endPos)

    this
  }

  def compact(): ByteBuffer = {
    if (isReadOnly)
      throw new ReadOnlyBufferException

    val offset = _arrayOffset
    val len = remaining
    System.arraycopy(_array, offset + position, _array, offset, len)
    _mark = -1
    limit(capacity)
    position(len)
    this
  }
}

private[nio] object HeapByteBuffer {
  private[nio] def wrap(array: Array[Byte], arrayOffset: Int, capacity: Int,
      initialPosition: Int, initialLength: Int,
      isReadOnly: Boolean): ByteBuffer = {
    if (arrayOffset < 0 || capacity < 0 || arrayOffset+capacity > array.length)
      throw new IndexOutOfBoundsException
    val initialLimit = initialPosition + initialLength
    if (initialPosition < 0 || initialLength < 0 || initialLimit > capacity)
      throw new IndexOutOfBoundsException
    new HeapByteBuffer(capacity, array, arrayOffset,
        initialPosition, initialLimit, isReadOnly)
  }
}