All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fusesource.hawtbuf.BufferEditor Maven / Gradle / Ivy

The newest version!
/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.fusesource.hawtbuf;

import java.io.IOException;
import java.net.ProtocolException;

/**
 * 

* Used to write and read primitives to and from a Buffer. Reads and * writes are done at the buffers offset. Every read and write * increases the buffer's offset and decreases the buffer's length. *

*

* Bounds checking are only performed when assertions are enabled on * the JVM. It's up to you to make sure there is enough data/space * in the buffer to do the read or write. *

* * @author Hiram Chirino */ abstract public class BufferEditor extends AbstractVarIntSupport { protected final Buffer buffer; private BufferEditor(Buffer buffer) { this.buffer = buffer; } protected boolean hasCapacity(int len) { return buffer.length >= len; } public int read() { buffer.length--; return buffer.data[buffer.offset++] & 0xff; } public void readFully(byte[] b) { readFully(b, 0, b.length); } public void readFully(byte[] b, int off, int len) { assert (hasCapacity(len)); System.arraycopy(buffer.data, buffer.offset, b, off, len); buffer.offset += len; buffer.length -= len; } public int skipBytes(int n) { int len = Math.min(n, buffer.length); buffer.offset += len; buffer.length -= len; return len; } public boolean readBoolean() { assert (hasCapacity(1)); return read() != 0; } public byte readByte() { assert (hasCapacity(1)); return (byte) read(); } public int readUnsignedByte() { assert (hasCapacity(1)); return read(); } public void write(int b) { assert (hasCapacity(1)); buffer.data[buffer.offset++] = (byte) b; buffer.length--; } public void write(byte[] b) { write(b, 0, b.length); } public void write(byte[] b, int off, int len) { assert (hasCapacity(len)); System.arraycopy(b, off, buffer.data, buffer.offset, len); buffer.offset += len; buffer.length -= len; } public void writeBoolean(boolean v) { assert (hasCapacity(1)); write(v ? 1 : 0); } public void writeByte(int v) { assert (hasCapacity(1)); write(v); } abstract public short readShort(); abstract public int readUnsignedShort(); abstract public char readChar(); abstract public int readInt(); abstract public long readLong(); abstract public double readDouble(); abstract public float readFloat(); abstract public void writeShort(int v); abstract public void writeChar(int v); abstract public void writeInt(int v); abstract public void writeLong(long v); abstract public void writeDouble(double v); abstract public void writeFloat(float v); abstract public void writeRawDouble(double v); abstract public void writeRawFloat(float v); static public BufferEditor big(Buffer buffer) { return new BigEndianBufferEditor(buffer); } static public BufferEditor little(Buffer buffer) { return new LittleEndianBufferEditor(buffer); } static class BigEndianBufferEditor extends BufferEditor { BigEndianBufferEditor(Buffer buffer) { super(buffer); } public short readShort() { assert (hasCapacity(2)); return (short) ((read() << 8) + (read() << 0)); } public int readUnsignedShort() { assert (hasCapacity(2)); return (read() << 8) + (read() << 0); } public char readChar() { assert (hasCapacity(2)); return (char) ((read() << 8) + (read() << 0)); } public int readInt() { assert (hasCapacity(4)); return (read() << 24) + (read() << 16) + (read() << 8) + (read() << 0); } public long readLong() { assert (hasCapacity(8)); return ((long) read() << 56) + ((long) read() << 48) + ((long) read() << 40) + ((long) read() << 32) + ((long) read() << 24) + ((read()) << 16) + ((read()) << 8) + ((read()) << 0); } public double readDouble() { return Double.longBitsToDouble(readLong()); } public float readFloat() { return Float.intBitsToFloat(readInt()); } public void writeShort(int v) { assert (hasCapacity(2)); write((v >>> 8) & 0xFF); write((v >>> 0) & 0xFF); } public void writeChar(int v) { assert (hasCapacity(2)); write((v >>> 8) & 0xFF); write((v >>> 0) & 0xFF); } public void writeInt(int v) { assert (hasCapacity(4)); write((v >>> 24) & 0xFF); write((v >>> 16) & 0xFF); write((v >>> 8) & 0xFF); write((v >>> 0) & 0xFF); } public void writeLong(long v) { assert (hasCapacity(8)); write((int) (v >>> 56) & 0xFF); write((int) (v >>> 48) & 0xFF); write((int) (v >>> 40) & 0xFF); write((int) (v >>> 32) & 0xFF); write((int) (v >>> 24) & 0xFF); write((int) (v >>> 16) & 0xFF); write((int) (v >>> 8) & 0xFF); write((int) (v >>> 0) & 0xFF); } public void writeDouble(double v) { writeLong(Double.doubleToLongBits(v)); } public void writeFloat(float v) { writeInt(Float.floatToIntBits(v)); } public void writeRawDouble(double v) { writeLong(Double.doubleToRawLongBits(v)); } public void writeRawFloat(float v) { writeInt(Float.floatToRawIntBits(v)); } } ; static class LittleEndianBufferEditor extends BufferEditor { LittleEndianBufferEditor(Buffer buffer) { super(buffer); } public short readShort() { assert (hasCapacity(2)); return (short) ((read() << 0) + (read() << 8)); } public int readUnsignedShort() { assert (hasCapacity(2)); return (read() << 0) + (read() << 8); } public char readChar() { assert (hasCapacity(2)); return (char) ((read() << 0) + (read() << 8)); } public int readInt() { assert (hasCapacity(4)); return (read() << 0) + (read() << 8) + (read() << 16) + (read() << 24); } public long readLong() { assert (hasCapacity(8)); return (read() << 0) + (read() << 8) + (read() << 16) + ((long) read() << 24) + ((long) read() << 32) + ((long) read() << 40) + ((long) read() << 48) + ((long) read() << 56); } public double readDouble() { return Double.longBitsToDouble(readLong()); } public float readFloat() { return Float.intBitsToFloat(readInt()); } public void writeShort(int v) { assert (hasCapacity(2)); write((v >>> 0) & 0xFF); write((v >>> 8) & 0xFF); } public void writeChar(int v) { assert (hasCapacity(2)); write((v >>> 0) & 0xFF); write((v >>> 8) & 0xFF); } public void writeInt(int v) { assert (hasCapacity(4)); write((v >>> 0) & 0xFF); write((v >>> 8) & 0xFF); write((v >>> 16) & 0xFF); write((v >>> 24) & 0xFF); } public void writeLong(long v) { assert (hasCapacity(8)); write((int) (v >>> 0) & 0xFF); write((int) (v >>> 8) & 0xFF); write((int) (v >>> 16) & 0xFF); write((int) (v >>> 24) & 0xFF); write((int) (v >>> 32) & 0xFF); write((int) (v >>> 40) & 0xFF); write((int) (v >>> 48) & 0xFF); write((int) (v >>> 56) & 0xFF); } public void writeDouble(double v) { writeLong(Double.doubleToLongBits(v)); } public void writeFloat(float v) { writeInt(Float.floatToIntBits(v)); } public void writeRawDouble(double v) { writeLong(Double.doubleToRawLongBits(v)); } public void writeRawFloat(float v) { writeInt(Float.floatToRawIntBits(v)); } } ; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy