/* * 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); } }