/*
 *  Copyright (c) 2012 Jan Kotek
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.mapdb;

import java.io.DataInput;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

/**
 * Wraps {@link ByteBuffer} and provides {@link DataInput}
 *
 * @author Jan Kotek
 */
public final class DataInput2 extends InputStream implements DataInput {

    public ByteBuffer buf;
    public int pos;

    public DataInput2(final ByteBuffer buf, final int pos) {
        this.buf = buf;
        this.pos = pos;
    }

    public DataInput2(byte[] b) {
        //TODO create implementation which uses raw byte[] and replace all refs
        this(ByteBuffer.wrap(b),0);
    }

    @Override
    public void readFully(byte[] b) throws IOException {
        readFully(b, 0, b.length);
    }

    @Override
    public void readFully(byte[] b, int off, int len) throws IOException {
        //naive, but only thread safe way
        //TODO investigate
        for(int i=off;i<off+len;i++){
            b[i] = readByte();
        }
    }

    @Override
    public int skipBytes(final int n) throws IOException {
        pos +=n;
        return n;
    }

    @Override
    public boolean readBoolean() throws IOException {
        return buf.get(pos++) ==1;
    }

    @Override
    public byte readByte() throws IOException {
        return buf.get(pos++);
    }

    @Override
    public int readUnsignedByte() throws IOException {
        return buf.get(pos++)& 0xff;
    }

    @Override
    public short readShort() throws IOException {
        final short ret = buf.getShort(pos);
        pos+=2;
        return ret;
    }

    @Override
    public int readUnsignedShort() throws IOException {
        return (( (buf.get(pos++) & 0xff) << 8) |
                ( (buf.get(pos++) & 0xff)));
    }

    @Override
    public char readChar() throws IOException {
        return (char) readInt();
    }

    @Override
    public int readInt() throws IOException {
        final int ret = buf.getInt(pos);
        pos+=4;
        return ret;
    }

    @Override
    public long readLong() throws IOException {
        final long ret = buf.getLong(pos);
        pos+=8;
        return ret;
    }

    @Override
    public float readFloat() throws IOException {
        final float ret = buf.getFloat(pos);
        pos+=4;
        return ret;
    }

    @Override
    public double readDouble() throws IOException {
        final double ret = buf.getDouble(pos);
        pos+=8;
        return ret;
    }

    @Override
    public String readLine() throws IOException {
        return readUTF();
    }

    @Override
    public String readUTF() throws IOException {
        final int size = Utils.unpackInt((DataInput)this);
        return SerializerBase.deserializeString(this, size);
    }

    @Override
    public int read() throws IOException {
        return readUnsignedByte(); //TODO EOF?
    }
}

@@ -1097,88 +1097,8 @@
 ) %7B%0A
-        //TODO create implementation which uses raw byte%5B%5D and replace all refs%0A
     
@@ -1350,147 +1350,120 @@
     
-//naive, but only thread safe way%0A        //TODO investigate%0A        for(int i=off;i%3Coff+len;i++)%7B%0A            b%5Bi%5D = readByte();%0A        %7D
+ByteBuffer clone = buf.duplicate();%0A        clone.position(pos);%0A        pos+=len;%0A        clone.get(b,off,len);
 %0A   
@@ -3135,19 +3135,8 @@
 Int(
-(DataInput)
 this
@@ -3301,20 +3301,8 @@
 e();
- //TODO EOF?
 %0A   

improve byte[] get.