public void writeRawArray()

in protonj2/src/main/java/org/apache/qpid/protonj2/codec/encoders/primitives/ArrayTypeEncoder.java [107:165]


    public void writeRawArray(ProtonBuffer buffer, EncoderState state, Object[] values) {
        TypeEncoder<?> typeEncoder = findTypeEncoder(buffer, state, values[0]);

        // Write the Array Type encoding code, we don't optimize here.
        buffer.writeByte(EncodingCodes.ARRAY32);

        for (int i = 0; i < values.length; ++i) {
            final int startIndex = buffer.getWriteOffset();

            // Reserve space for the size and write the count of list elements.
            buffer.writeInt(0);

            typeEncoder = findTypeEncoder(buffer, state, values[i]);
            if (values[i].getClass().getComponentType().isPrimitive()) {
                Class<?> componentType = values[i].getClass().getComponentType();

                if (componentType == Boolean.TYPE) {
                    buffer.writeInt(((boolean[]) values[i]).length);
                    ((BooleanTypeEncoder) typeEncoder).writeRawArray(buffer, state, (boolean[]) values[i]);
                } else if (componentType == Byte.TYPE) {
                    buffer.writeInt(((byte[]) values[i]).length);
                    ((ByteTypeEncoder) typeEncoder).writeRawArray(buffer, state, (byte[]) values[i]);
                } else if (componentType == Short.TYPE) {
                    buffer.writeInt(((short[]) values[i]).length);
                    ((ShortTypeEncoder) typeEncoder).writeRawArray(buffer, state, (short[]) values[i]);
                } else if (componentType == Integer.TYPE) {
                    buffer.writeInt(((int[]) values[i]).length);
                    ((IntegerTypeEncoder) typeEncoder).writeRawArray(buffer, state, (int[]) values[i]);
                } else if (componentType == Long.TYPE) {
                    buffer.writeInt(((long[]) values[i]).length);
                    ((LongTypeEncoder) typeEncoder).writeRawArray(buffer, state, (long[]) values[i]);
                } else if (componentType == Float.TYPE) {
                    buffer.writeInt(((Object[]) values[i]).length);
                    ((FloatTypeEncoder) typeEncoder).writeRawArray(buffer, state, (float[]) values[i]);
                } else if (componentType == Double.TYPE) {
                    buffer.writeInt(((double[]) values[i]).length);
                    ((DoubleTypeEncoder) typeEncoder).writeRawArray(buffer, state, (double[]) values[i]);
                } else if (componentType == Character.TYPE) {
                    buffer.writeInt(((float[]) values[i]).length);
                    ((CharacterTypeEncoder) typeEncoder).writeRawArray(buffer, state, (char[]) values[i]);
                } else {
                    throw new IllegalArgumentException(
                        "Cannot write arrays of type " + componentType.getName());
                }
            } else {
                buffer.writeInt(((Object[]) values[i]).length);
                typeEncoder.writeRawArray(buffer, state, (Object[]) values[i]);
            }

            // Move back and write the size
            final long writeSize = buffer.getWriteOffset() - startIndex - Integer.BYTES;

            if (writeSize > Integer.MAX_VALUE) {
                throw new IllegalArgumentException("Cannot encode given array, encoded size to large: " + writeSize);
            }

            buffer.setInt(startIndex, (int) writeSize);
        }
    }