/* DirectByteBufferImpl.java -- 
   Copyright (C) 2003, 2004 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.nio;

import gnu.classpath.Pointer;

abstract class DirectByteBufferImpl extends ByteBuffer
{
  /**
   * The owner is used to keep alive the object that actually owns the
   * memory. There are three possibilities:
   *  1) owner == this: We allocated the memory and we should free it,
   *                    but *only* in finalize (if we've been sliced
   *                    other objects will also have access to the
   *                    memory).
   *  2) owner == null: The byte buffer was created thru
   *                    JNI.NewDirectByteBuffer. The JNI code is
   *                    responsible for freeing the memory.
   *  3) owner == some other object: The other object allocated the
   *                                 memory and should free it.
   */
  private final Object owner;

  static final class ReadOnly extends DirectByteBufferImpl
  {
    ReadOnly(Object owner, Pointer address,
	     int capacity, int limit,
	     int position)
    {
      super(owner, address, capacity, limit, position);
    }

    public ByteBuffer put(byte value)
    {
      throw new ReadOnlyBufferException ();
    }

    public ByteBuffer put(int index, byte value)
    {
      throw new ReadOnlyBufferException ();
    }

    public boolean isReadOnly()
    {
      return true;
    }
  }

  static final class ReadWrite extends DirectByteBufferImpl
  {
    ReadWrite(int capacity)
    {
      super(capacity);
    }

    ReadWrite(Pointer address, int capacity)
    {
      super(address, capacity);
    }
    
    ReadWrite(Object owner, Pointer address,
	      int capacity, int limit,
	      int position)
    {
      super(owner, address, capacity, limit, position);
    }

    public boolean isReadOnly()
    {
      return false;
    }
  }

  DirectByteBufferImpl(int capacity)
  {
    super(capacity, capacity, 0, -1,
	  VMDirectByteBuffer.allocate(capacity), null, 0);
    this.owner = this;
  }

  DirectByteBufferImpl(Pointer address, int capacity)
  {
    super(capacity, capacity, 0, -1, address, null, 0);
    this.owner = null;
  }
  
  DirectByteBufferImpl(Object owner, Pointer address,
		       int capacity, int limit,
		       int position)
  {
    super(capacity, limit, position, -1, address, null, 0);
    this.owner = owner;
  }

  /**
   * Allocates a new direct byte buffer.
   */ 
  public static ByteBuffer allocate(int capacity)
  {
    return new DirectByteBufferImpl.ReadWrite(capacity);
  }

  protected void finalize() throws Throwable
  {
    if (owner == this)
        VMDirectByteBuffer.free(address);
  }
  
  public byte get()
  {
    checkForUnderflow();

    int pos = position();
    byte result = VMDirectByteBuffer.get(address, pos);
    position(pos + 1);
    return result;
  }

  public byte get(int index)
  {
    checkIndex(index);

    return VMDirectByteBuffer.get(address, index);
  }

  public ByteBuffer get(byte[] dst, int offset, int length)
  {
    checkArraySize(dst.length, offset, length);
    checkForUnderflow(length);

    int index = position();
    VMDirectByteBuffer.get(address, index, dst, offset, length);
    position(index+length);

    return this;
  }

  public ByteBuffer put(byte value)
  {
    checkForOverflow();

    int pos = position();
    VMDirectByteBuffer.put(address, pos, value);
    position(pos + 1);
    return this;
  }
  
  public ByteBuffer put(int index, byte value)
  {
    checkIndex(index);

    VMDirectByteBuffer.put(address, index, value);
    return this;
  }
  
  public ByteBuffer put (byte[] src, int offset, int length)
  {
    checkArraySize (src.length, offset, length);
    checkForUnderflow (length);
    int index = position ();
    VMDirectByteBuffer.put (address, index, src, offset, length);
    position (index + length);
    
    return this;
  }
  
  void shiftDown(int dst_offset, int src_offset, int count)
  {
    VMDirectByteBuffer.shiftDown(address, dst_offset, src_offset, count);
  }
  
  public ByteBuffer compact()
  {
    checkIfReadOnly();
    mark = -1;
    int pos = position();
    if (pos > 0)
      {
	int count = remaining();
	VMDirectByteBuffer.shiftDown(address, 0, pos, count);
	position(count);
	limit(capacity());
      }
    else
      {
	position(limit());
	limit(capacity());
      }
    return this;
  }

  public ByteBuffer slice()
  {
    int rem = remaining();
    if (isReadOnly())
        return new DirectByteBufferImpl.ReadOnly
      (owner, VMDirectByteBuffer.adjustAddress(address, position()),
       rem, rem, 0);
    else
        return new DirectByteBufferImpl.ReadWrite
      (owner, VMDirectByteBuffer.adjustAddress(address, position()),
       rem, rem, 0);
  }

  private ByteBuffer duplicate(boolean readOnly)
  {
    int pos = position();
    if (this.mark != -1)
      reset();
    int mark = position();
    position(pos);
    DirectByteBufferImpl result;
    if (readOnly)
        result = new DirectByteBufferImpl.ReadOnly(owner, address, capacity(),
                                                   limit(), pos);
    else
        result = new DirectByteBufferImpl.ReadWrite(owner, address, capacity(),
                                                    limit(), pos);

    if (mark != pos)
      {
	result.position(mark);
	result.mark();
	result.position(pos);
      }
    return result;
  }

  public ByteBuffer duplicate()
  {
    return duplicate(isReadOnly());
  }

  public ByteBuffer asReadOnlyBuffer()
  {
    return duplicate(true);
  }

  public boolean isDirect()
  {
    return true;
  }

  public CharBuffer asCharBuffer()
  {
    return new CharViewBufferImpl(this, remaining() >> 1);
  }

  public ShortBuffer asShortBuffer()
  {
    return new ShortViewBufferImpl(this, remaining() >> 1);
  }

  public IntBuffer asIntBuffer()
  {
    return new IntViewBufferImpl(this, remaining() >> 2);
  }

  public LongBuffer asLongBuffer()
  {
    return new LongViewBufferImpl(this, remaining() >> 3);
  }

  public FloatBuffer asFloatBuffer()
  {
    return new FloatViewBufferImpl(this, remaining() >> 2);
  }

  public DoubleBuffer asDoubleBuffer()
  {
    return new DoubleViewBufferImpl(this, remaining() >> 3);
  }

  public char getChar()
  {
    return ByteBufferHelper.getChar(this, order());
  }
  
  public ByteBuffer putChar(char value)
  {
    ByteBufferHelper.putChar(this, value, order());
    return this;
  }
  
  public char getChar(int index)
  {
    return ByteBufferHelper.getChar(this, index, order());
  }
  
  public ByteBuffer putChar(int index, char value)
  {
    ByteBufferHelper.putChar(this, index, value, order());
    return this;
  }

  public short getShort()
  {
    return ByteBufferHelper.getShort(this, order());
  }
  
  public ByteBuffer putShort(short value)
  {
    ByteBufferHelper.putShort(this, value, order());
    return this;
  }
  
  public short getShort(int index)
  {
    return ByteBufferHelper.getShort(this, index, order());
  }
  
  public ByteBuffer putShort(int index, short value)
  {
    ByteBufferHelper.putShort(this, index, value, order());
    return this;
  }

  public int getInt()
  {
    return ByteBufferHelper.getInt(this, order());
  }
  
  public ByteBuffer putInt(int value)
  {
    ByteBufferHelper.putInt(this, value, order());
    return this;
  }
  
  public int getInt(int index)
  {
    return ByteBufferHelper.getInt(this, index, order());
  }
  
  public ByteBuffer putInt(int index, int value)
  {
    ByteBufferHelper.putInt(this, index, value, order());
    return this;
  }

  public long getLong()
  {
    return ByteBufferHelper.getLong(this, order());
  }
  
  public ByteBuffer putLong(long value)
  {
    ByteBufferHelper.putLong(this, value, order());
    return this;
  }
  
  public long getLong(int index)
  {
    return ByteBufferHelper.getLong(this, index, order());
  }
  
  public ByteBuffer putLong(int index, long value)
  {
    ByteBufferHelper.putLong(this, index, value, order());
    return this;
  }

  public float getFloat()
  {
    return ByteBufferHelper.getFloat(this, order());
  }
  
  public ByteBuffer putFloat(float value)
  {
    ByteBufferHelper.putFloat(this, value, order());
    return this;
  }
  
  public float getFloat(int index)
  {
    return ByteBufferHelper.getFloat(this, index, order());
  }

  public ByteBuffer putFloat(int index, float value)
  {
    ByteBufferHelper.putFloat(this, index, value, order());
    return this;
  }

  public double getDouble()
  {
    return ByteBufferHelper.getDouble(this, order());
  }

  public ByteBuffer putDouble(double value)
  {
    ByteBufferHelper.putDouble(this, value, order());
    return this;
  }
  
  public double getDouble(int index)
  {
    return ByteBufferHelper.getDouble(this, index, order());
  }
  
  public ByteBuffer putDouble(int index, double value)
  {
    ByteBufferHelper.putDouble(this, index, value, order());
    return this;
  }
}
