blob: 2ab3c3ebdc0a149a9293bc8aed736824b4cdf612 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.datastore.core.serialization;
import java.nio.ByteBuffer;
import org.eclipse.tracecompass.internal.datastore.core.serialization.SafeByteBufferWrapper;
/**
* Class that creates instances of safe byte buffers wrappers from a part of a
* ByteBuffer instance
*
* @author Geneviève Bastien
* @since 1.1
*/
public final class SafeByteBufferFactory {
private SafeByteBufferFactory() {
}
/**
* Creates a new safe byte buffer reader from the ByteBuffer's current
* position with a size limited to 'size'.
*
* @param buffer
* The big ByteBuffer to safely wrap for reading
* @param size
* The size of the new sub-buffer
* @return The safe byte buffer reader instance
*/
public static ISafeByteBufferReader wrapReader(ByteBuffer buffer, int size) {
int pos = buffer.position();
// Slice the main buffer, so that position 0 is the current position
// set it as read-only also
ByteBuffer readOnlyBuffer = buffer.slice().asReadOnlyBuffer();
readOnlyBuffer.order(buffer.order());
// Set its limit to the request limit
readOnlyBuffer.limit(size);
// Operations on fBuffer will not affect the main buffer's position, so
// we set its position to after the limit
buffer.position(pos + size);
return new SafeByteBufferWrapper(readOnlyBuffer);
}
/**
* Creates a new safe byte buffer writer from the ByteBuffer's current
* position with a size limited to 'size'.
*
* @param buffer
* The big ByteBuffer to safely wrap for reading
* @param size
* The size of the new sub-buffer
* @return The safe byte buffer writer instance
*/
public static ISafeByteBufferWriter wrapWriter(ByteBuffer buffer, int size) {
int pos = buffer.position();
// Slice the main buffer, so that position 0 is the current position
ByteBuffer readWriteBuffer = buffer.slice();
readWriteBuffer.order(buffer.order());
// Set its limit to the request limit
readWriteBuffer.limit(size);
// Operations on fBuffer will not affect the main buffer's position, so
// we set its position to after the limit
buffer.position(pos + size);
return new SafeByteBufferWrapper(readWriteBuffer);
}
/**
* Get the serialized of a string object if it uses the
* {@link ISafeByteBufferWriter#putString(String)} method
*
* @param string
* The string to write to the buffer
* @return The size of the string serialized by the
* {@link ISafeByteBufferWriter#putString(String)} method, or -1 if
* the string cannot be serialized
*/
public static int getStringSizeInBuffer(String string) {
return SafeByteBufferWrapper.getStringSizeInBuffer(string);
}
}