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

com.yscope.clp.compressorfrontend.FlattenedByteArrayFactory Maven / Gradle / Ivy

package com.yscope.clp.compressorfrontend;

import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;

public class FlattenedByteArrayFactory {
    private static final ThreadLocal reusableByteArrayOutputStream =
            ThreadLocal.withInitial(ByteArrayOutputStream::new);

    /**
     * Constructs a FlattenedByteArray by concatenating the given byte arrays together.
     * @param byteArrays
     * @return The flattened array.
     */
    public static FlattenedByteArray fromByteArrays(byte[][] byteArrays) {
        if (null == byteArrays || 0 == byteArrays.length) {
            return EmptyArrayUtils.EMPTY_FLATTENED_BYTE_ARRAY;
        }

        // Compute flattenedElemsEndOffsets
        int flattenedElemsLength = 0;
        int[] flattenedElemsEndOffsets = new int[byteArrays.length];
        for (int i = 0; i < byteArrays.length; i++) {
            flattenedElemsLength += byteArrays[i].length;
            flattenedElemsEndOffsets[i] = flattenedElemsLength;
        }

        // Compute flattenedElems
        byte[] flattenedElems = new byte[flattenedElemsLength];
        for (int i = 0, flattenedElemsOffset = 0; i < byteArrays.length; i++) {
            byte[] byteArray = byteArrays[i];
            System.arraycopy(byteArray, 0, flattenedElems, flattenedElemsOffset, byteArray.length);
            flattenedElemsOffset += byteArray.length;
        }

        return new FlattenedByteArray(flattenedElems, flattenedElemsEndOffsets);
    }

    /**
     * Constructs a FlattenedByteArray by converting the given strings into byte arrays and then
     * concatenating them together.
     * @param strings
     * @return The flattened array.
     */
    public static FlattenedByteArray fromStrings(String[] strings) {
        if (null == strings || 0 == strings.length) {
            return EmptyArrayUtils.EMPTY_FLATTENED_BYTE_ARRAY;
        }

        ByteArrayOutputStream outputStream = reusableByteArrayOutputStream.get();
        outputStream.reset();

        int[] elemEndOffsets = new int[strings.length];
        for (int i = 0; i < strings.length; ++i) {
            byte[] bytes = strings[i].getBytes(StandardCharsets.UTF_8);
            outputStream.write(bytes, 0, bytes.length);
            elemEndOffsets[i] = outputStream.size();
        }

        return new FlattenedByteArray(outputStream.toByteArray(), elemEndOffsets);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy