/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.das2.qds.buffer;

import java.nio.ByteBuffer;
import org.das2.qds.WritableDataSet;

/**
 * Truncated floats are two-byte floats with low precision used by the plasma wave group.  They
 * have an exponent the same size as a 4-byte float, but the mantissa has just 7(?) bits.
 * @author jbf
 */
public class TruncatedFloatDataSet extends BufferDataSet implements WritableDataSet {
    public TruncatedFloatDataSet( int rank, int reclen, int recoffs, int len0, int len1, int len2, int len3, ByteBuffer back ) {
        super( rank, reclen, recoffs, len0, len1, len2, len3, TRUNCATEDFLOAT, back );
    }

    public double value() {
        return java.lang.Float.intBitsToFloat( back.getShort(offset()) << 16 );
    }

    public double value(int i0) {
        return java.lang.Float.intBitsToFloat( back.getShort(offset(i0)) << 16 );
    }

    public double value(int i0, int i1) {
        return java.lang.Float.intBitsToFloat( back.getShort(offset(i0, i1)) << 16 );
    }

    public double value(int i0, int i1, int i2) {
        return java.lang.Float.intBitsToFloat( back.getShort(offset(i0, i1, i2)) << 16 );
    }

    public double value(int i0, int i1, int i2, int i3) {
        return java.lang.Float.intBitsToFloat( back.getShort(offset(i0, i1, i2, i3 )) << 16 );
    }

    private final short truncate( double d ) {
        return (short)((java.lang.Float.floatToIntBits((float)d)>>16) & 0xffff );
    }

    public void putValue(double d) {
        ensureWritable();
        back.putShort( offset(), truncate(d) );
    }

    public void putValue(int i0, double d) {
        ensureWritable();
        back.putShort( offset(i0), truncate(d) );
    }

    public void putValue(int i0, int i1, double d) {
        ensureWritable();
        back.putShort( offset(i0, i1), truncate(d) );
    }

    public void putValue(int i0, int i1, int i2, double d) {
        ensureWritable();
        back.putShort( offset(i0, i1, i2), truncate(d) );
    }

    public void putValue(int i0, int i1, int i2, int i3, double d) {
        ensureWritable();
        back.putShort( offset(i0, i1, i2, i3), truncate(d) );
    }
}