/* * 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.streams; import org.apache.ignite.internal.util.GridUnsafe; import static org.apache.ignite.internal.util.GridUnsafe.BIG_ENDIAN; /** * Binary off-heap input stream. */ public class BinaryOffheapInputStream extends BinaryAbstractInputStream { /** Pointer. */ private final long ptr; /** Capacity. */ private final int cap; /** */ private boolean forceHeap; /** * Constructor. * * @param ptr Pointer. * @param cap Capacity. */ public BinaryOffheapInputStream(long ptr, int cap) { this(ptr, cap, false); } /** * Constructor. * * @param ptr Pointer. * @param cap Capacity. * @param forceHeap If {@code true} method {@link #offheapPointer} returns 0 and unmarshalling will * create heap-based objects. */ public BinaryOffheapInputStream(long ptr, int cap, boolean forceHeap) { this.ptr = ptr; this.cap = cap; this.forceHeap = forceHeap; len = cap; } /** {@inheritDoc} */ @Override public int remaining() { return cap - pos; } /** {@inheritDoc} */ @Override public int capacity() { return cap; } /** {@inheritDoc} */ @Override public byte[] array() { return arrayCopy(); } /** {@inheritDoc} */ @Override public byte[] arrayCopy() { byte[] res = new byte[len]; GridUnsafe.copyOffheapHeap(ptr, res, GridUnsafe.BYTE_ARR_OFF, res.length); return res; } /** {@inheritDoc} */ @Override public boolean hasArray() { return false; } /** {@inheritDoc} */ @Override protected byte readByteAndShift() { return GridUnsafe.getByte(ptr + pos++); } /** {@inheritDoc} */ @Override protected void copyAndShift(Object target, long off, int len) { GridUnsafe.copyOffheapHeap(ptr + pos, target, off, len); shift(len); } /** {@inheritDoc} */ @Override protected short readShortFast() { long addr = ptr + pos; return BIG_ENDIAN ? GridUnsafe.getShortLE(addr) : GridUnsafe.getShort(addr); } /** {@inheritDoc} */ @Override protected char readCharFast() { long addr = ptr + pos; return BIG_ENDIAN ? GridUnsafe.getCharLE(addr) : GridUnsafe.getChar(addr); } /** {@inheritDoc} */ @Override protected int readIntFast() { long addr = ptr + pos; return BIG_ENDIAN ? GridUnsafe.getIntLE(addr) : GridUnsafe.getInt(addr); } /** {@inheritDoc} */ @Override protected long readLongFast() { long addr = ptr + pos; return BIG_ENDIAN ? GridUnsafe.getLongLE(addr) : GridUnsafe.getLong(addr); } /** {@inheritDoc} */ @Override protected byte readBytePositioned0(int pos) { return GridUnsafe.getByte(ptr + pos); } /** {@inheritDoc} */ @Override protected short readShortPositioned0(int pos) { long addr = ptr + pos; return BIG_ENDIAN ? GridUnsafe.getShortLE(addr) : GridUnsafe.getShort(addr); } /** {@inheritDoc} */ @Override protected int readIntPositioned0(int pos) { long addr = ptr + pos; return BIG_ENDIAN ? GridUnsafe.getIntLE(addr) : GridUnsafe.getInt(addr); } /** {@inheritDoc} */ @Override public long offheapPointer() { return forceHeap ? 0 : ptr; } /** {@inheritDoc} */ @Override public long rawOffheapPointer() { return ptr; } }