/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program 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 3 of the License, or (at your option)
* any later version.
* This program 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 this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.binio.internal;
import com.bc.ceres.binio.SimpleType;
import com.bc.ceres.binio.Type;
import com.bc.ceres.binio.util.ByteArrayCodec;
import java.nio.ByteOrder;
abstract class DataAccessor {
protected final ByteArrayCodec codec;
protected DataAccessor(ByteOrder byteOrder) {
this.codec = ByteArrayCodec.getInstance(byteOrder);
}
public final ByteOrder getByteOrder() {
return codec.getByteOrder();
}
public abstract byte getByte(byte[] array, int position);
public abstract short getShort(byte[] array, int position);
public abstract int getInt(byte[] array, int position);
public abstract long getLong(byte[] array, int position);
public abstract float getFloat(byte[] array, int position);
public abstract double getDouble(byte[] array, int position);
public abstract void setByte(byte[] array, int position, byte value);
public abstract void setShort(byte[] array, int position, short value);
public abstract void setInt(byte[] array, int position, int value);
public abstract void setLong(byte[] array, int position, long value);
public abstract void setFloat(byte[] array, int position, float value);
public abstract void setDouble(byte[] array, int position, double value);
public static DataAccessor getInstance(Type type, ByteOrder byteOrder) {
if (type == SimpleType.BYTE) {
return new Byte(byteOrder);
} else if (type == SimpleType.UBYTE) {
return new UByte(byteOrder);
} else if (type == SimpleType.SHORT) {
return new Short(byteOrder);
} else if (type == SimpleType.USHORT) {
return new UShort(byteOrder);
} else if (type == SimpleType.INT) {
return new Int(byteOrder);
} else if (type == SimpleType.UINT) {
return new UInt(byteOrder);
} else if (type == SimpleType.LONG) {
return new Long(byteOrder);
} else if (type == SimpleType.ULONG) {
return new Long(byteOrder); // Note: ULONG handled as signed long!
} else if (type == SimpleType.FLOAT) {
return new Float(byteOrder);
} else if (type == SimpleType.DOUBLE) {
return new Double(byteOrder);
} else {
throw new IllegalArgumentException("type: DataAccessor not implemented for " + type);
}
}
static final class Byte extends DataAccessor {
Byte(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return array[position];
}
@Override
public short getShort(byte[] array, int position) {
return getByte(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return getByte(array, position);
}
@Override
public long getLong(byte[] array, int position) {
return getByte(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return getByte(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getByte(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
array[position] = value;
}
@Override
public void setShort(byte[] array, int position, short value) {
setByte(array, position, (byte) value);
}
@Override
public void setInt(byte[] array, int position, int value) {
setByte(array, position, (byte) value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setByte(array, position, (byte) value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setByte(array, position, (byte) value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setByte(array, position, (byte) value);
}
}
static final class UByte extends DataAccessor {
UByte(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return array[position];
}
@Override
public short getShort(byte[] array, int position) {
return (short) getInt(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return getByte(array, position) & 0xFF;
}
@Override
public long getLong(byte[] array, int position) {
return getInt(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return getInt(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getInt(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
array[position] = value;
}
@Override
public void setShort(byte[] array, int position, short value) {
setByte(array, position, (byte) value);
}
@Override
public void setInt(byte[] array, int position, int value) {
setByte(array, position, (byte) value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setByte(array, position, (byte) value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setByte(array, position, (byte) value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setByte(array, position, (byte) value);
}
}
static final class Short extends DataAccessor {
Short(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return (byte) getShort(array, position);
}
@Override
public short getShort(byte[] array, int position) {
return codec.getShort(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return getShort(array, position);
}
@Override
public long getLong(byte[] array, int position) {
return getShort(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return getShort(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getShort(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
setShort(array, position, value);
}
@Override
public void setShort(byte[] array, int position, short value) {
codec.setShort(array, position, value);
}
@Override
public void setInt(byte[] array, int position, int value) {
setShort(array, position, (short) value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setShort(array, position, (short) value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setShort(array, position, (short) value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setShort(array, position, (short) value);
}
}
static final class UShort extends DataAccessor {
UShort(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return (byte) getInt(array, position);
}
@Override
public short getShort(byte[] array, int position) {
return codec.getShort(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return getShort(array, position) & 0xFFFF;
}
@Override
public long getLong(byte[] array, int position) {
return getInt(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return getInt(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getInt(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
setShort(array, position, value);
}
@Override
public void setShort(byte[] array, int position, short value) {
codec.setShort(array, position, value);
}
@Override
public void setInt(byte[] array, int position, int value) {
setShort(array, position, (short) value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setShort(array, position, (short) value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setShort(array, position, (short) value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setShort(array, position, (short) value);
}
}
static final class Int extends DataAccessor {
Int(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return (byte) getInt(array, position);
}
@Override
public short getShort(byte[] array, int position) {
return (short) getInt(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return codec.getInt(array, position);
}
@Override
public long getLong(byte[] array, int position) {
return getInt(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return getInt(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getInt(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
setInt(array, position, value);
}
@Override
public void setShort(byte[] array, int position, short value) {
setInt(array, position, value);
}
@Override
public void setInt(byte[] array, int position, int value) {
codec.setInt(array, position, value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setInt(array, position, (int) value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setInt(array, position, (int) value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setInt(array, position, (int) value);
}
}
static final class UInt extends DataAccessor {
UInt(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return (byte) getLong(array, position);
}
@Override
public short getShort(byte[] array, int position) {
return (short) getLong(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return codec.getInt(array, position);
}
@Override
public long getLong(byte[] array, int position) {
return getInt(array, position) & 0xFFFFFFFFL;
}
@Override
public float getFloat(byte[] array, int position) {
return getLong(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getLong(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
setInt(array, position, value);
}
@Override
public void setShort(byte[] array, int position, short value) {
setInt(array, position, value);
}
@Override
public void setInt(byte[] array, int position, int value) {
codec.setInt(array, position, value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setInt(array, position, (int) value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setInt(array, position, (int) value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setInt(array, position, (int) value);
}
}
static final class Long extends DataAccessor {
Long(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return (byte) getLong(array, position);
}
@Override
public short getShort(byte[] array, int position) {
return (short) getLong(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return (int) getLong(array, position);
}
@Override
public long getLong(byte[] array, int position) {
return codec.getLong(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return getLong(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getLong(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
setLong(array, position, value);
}
@Override
public void setShort(byte[] array, int position, short value) {
setLong(array, position, value);
}
@Override
public void setInt(byte[] array, int position, int value) {
setLong(array, position, value);
}
@Override
public void setLong(byte[] array, int position, long value) {
codec.setLong(array, position, value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setLong(array, position, (long) value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setLong(array, position, (long) value);
}
}
static final class Float extends DataAccessor {
Float(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return (byte) getFloat(array, position);
}
@Override
public short getShort(byte[] array, int position) {
return (short) getFloat(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return (int) getFloat(array, position);
}
@Override
public long getLong(byte[] array, int position) {
return (long) getFloat(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return codec.getFloat(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return getFloat(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
setFloat(array, position, value);
}
@Override
public void setShort(byte[] array, int position, short value) {
setFloat(array, position, value);
}
@Override
public void setInt(byte[] array, int position, int value) {
setFloat(array, position, value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setFloat(array, position, value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
codec.setFloat(array, position, value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
setFloat(array, position, (float) value);
}
}
static final class Double extends DataAccessor {
Double(ByteOrder byteOrder) {
super(byteOrder);
}
@Override
public byte getByte(byte[] array, int position) {
return (byte) getDouble(array, position);
}
@Override
public short getShort(byte[] array, int position) {
return (short) getDouble(array, position);
}
@Override
public int getInt(byte[] array, int position) {
return (int) getDouble(array, position);
}
@Override
public long getLong(byte[] array, int position) {
return (long) getDouble(array, position);
}
@Override
public float getFloat(byte[] array, int position) {
return (float) getDouble(array, position);
}
@Override
public double getDouble(byte[] array, int position) {
return codec.getDouble(array, position);
}
@Override
public void setByte(byte[] array, int position, byte value) {
setDouble(array, position, value);
}
@Override
public void setShort(byte[] array, int position, short value) {
setDouble(array, position, value);
}
@Override
public void setInt(byte[] array, int position, int value) {
setDouble(array, position, value);
}
@Override
public void setLong(byte[] array, int position, long value) {
setDouble(array, position, value);
}
@Override
public void setFloat(byte[] array, int position, float value) {
setDouble(array, position, value);
}
@Override
public void setDouble(byte[] array, int position, double value) {
codec.setDouble(array, position, value);
}
}
}