blob: 556282d3570c03c54076a9de152a6556eb99c1e0 [file] [log] [blame]
/*
* 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.apache.ignite.internal.binary;
import org.apache.ignite.internal.util.GridUnsafe;
import static org.apache.ignite.internal.util.GridUnsafe.BIG_ENDIAN;
/**
* Primitives writer.
*/
public abstract class BinaryPrimitives {
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeByte(byte[] arr, int off, byte val) {
GridUnsafe.putByte(arr, GridUnsafe.BYTE_ARR_OFF + off, val);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static byte readByte(byte[] arr, int off) {
return GridUnsafe.getByte(arr, GridUnsafe.BYTE_ARR_OFF + off);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static byte readByte(long ptr, int off) {
return GridUnsafe.getByte(ptr + off);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static byte[] readByteArray(byte[] arr, int off, int len) {
byte[] arr0 = new byte[len];
System.arraycopy(arr, off, arr0, 0, len);
return arr0;
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static byte[] readByteArray(long ptr, int off, int len) {
byte[] arr0 = new byte[len];
GridUnsafe.copyOffheapHeap(ptr + off, arr0, GridUnsafe.BYTE_ARR_OFF, len);
return arr0;
}
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeBoolean(byte[] arr, int off, boolean val) {
writeByte(arr, off, val ? (byte)1 : (byte)0);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static boolean readBoolean(byte[] arr, int off) {
return readByte(arr, off) == 1;
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static boolean readBoolean(long ptr, int off) {
return readByte(ptr, off) == 1;
}
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeShort(byte[] arr, int off, short val) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
if (BIG_ENDIAN)
GridUnsafe.putShortLE(arr, pos, val);
else
GridUnsafe.putShort(arr, pos, val);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @param val Value.
*/
public static void writeShort(long ptr, int off, short val) {
if (BIG_ENDIAN)
GridUnsafe.putShortLE(ptr + off, val);
else
GridUnsafe.putShort(ptr + off, val);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static short readShort(byte[] arr, int off) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
return BIG_ENDIAN ? GridUnsafe.getShortLE(arr, pos) : GridUnsafe.getShort(arr, pos);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static short readShort(long ptr, int off) {
long addr = ptr + off;
return BIG_ENDIAN ? GridUnsafe.getShortLE(addr) : GridUnsafe.getShort(addr);
}
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeChar(byte[] arr, int off, char val) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
if (BIG_ENDIAN)
GridUnsafe.putCharLE(arr, pos, val);
else
GridUnsafe.putChar(arr, pos, val);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static char readChar(byte[] arr, int off) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
return BIG_ENDIAN ? GridUnsafe.getCharLE(arr, pos): GridUnsafe.getChar(arr, pos);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static char readChar(long ptr, int off) {
long addr = ptr + off;
return BIG_ENDIAN ? GridUnsafe.getCharLE(addr) : GridUnsafe.getChar(addr);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static char[] readCharArray(byte[] arr, int off, int len) {
char[] arr0 = new char[len];
GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF + off, arr0, GridUnsafe.CHAR_ARR_OFF, len << 1);
if (BIG_ENDIAN) {
for (int i = 0; i < len; i++)
arr0[i] = Character.reverseBytes(arr0[i]);
}
return arr0;
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static char[] readCharArray(long ptr, int off, int len) {
char[] arr0 = new char[len];
GridUnsafe.copyOffheapHeap(ptr + off, arr0, GridUnsafe.CHAR_ARR_OFF, len << 1);
if (BIG_ENDIAN) {
for (int i = 0; i < len; i++)
arr0[i] = Character.reverseBytes(arr0[i]);
}
return arr0;
}
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeInt(byte[] arr, int off, int val) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
if (BIG_ENDIAN)
GridUnsafe.putIntLE(arr, pos, val);
else
GridUnsafe.putInt(arr, pos, val);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @param val Value.
*/
public static void writeInt(long ptr, int off, int val) {
if (BIG_ENDIAN)
GridUnsafe.putIntLE(ptr + off, val);
else
GridUnsafe.putInt(ptr + off, val);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static int readInt(byte[] arr, int off) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
return BIG_ENDIAN ? GridUnsafe.getIntLE(arr, pos) : GridUnsafe.getInt(arr, pos);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static int readInt(long ptr, int off) {
long addr = ptr + off;
return BIG_ENDIAN ? GridUnsafe.getIntLE(addr) : GridUnsafe.getInt(addr);
}
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeLong(byte[] arr, int off, long val) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
if (BIG_ENDIAN)
GridUnsafe.putLongLE(arr, pos, val);
else
GridUnsafe.putLong(arr, pos, val);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static long readLong(byte[] arr, int off) {
long pos = GridUnsafe.BYTE_ARR_OFF + off;
return BIG_ENDIAN ? GridUnsafe.getLongLE(arr, pos) : GridUnsafe.getLong(arr, pos);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static long readLong(long ptr, int off) {
long addr = ptr + off;
return BIG_ENDIAN ? GridUnsafe.getLongLE(addr) : GridUnsafe.getLong(addr);
}
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeFloat(byte[] arr, int off, float val) {
int val0 = Float.floatToIntBits(val);
writeInt(arr, off, val0);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static float readFloat(byte[] arr, int off) {
int val = readInt(arr, off);
return Float.intBitsToFloat(val);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static float readFloat(long ptr, int off) {
int val = readInt(ptr, off);
return Float.intBitsToFloat(val);
}
/**
* @param arr Array.
* @param off Offset.
* @param val Value.
*/
public static void writeDouble(byte[] arr, int off, double val) {
long val0 = Double.doubleToLongBits(val);
writeLong(arr, off, val0);
}
/**
* @param arr Array.
* @param off Offset.
* @return Value.
*/
public static double readDouble(byte[] arr, int off) {
long val = readLong(arr, off);
return Double.longBitsToDouble(val);
}
/**
* @param ptr Pointer.
* @param off Offset.
* @return Value.
*/
public static double readDouble(long ptr, int off) {
long val = readLong(ptr, off);
return Double.longBitsToDouble(val);
}
}