1 package org.simantics.databoard.serialization.impl;
\r
3 import java.io.DataInput;
\r
4 import java.io.DataOutput;
\r
5 import java.io.IOException;
\r
6 import java.util.List;
\r
8 import org.simantics.databoard.binding.ArrayBinding;
\r
9 import org.simantics.databoard.serialization.SerializationException;
\r
10 import org.simantics.databoard.serialization.Serializer.NonRecursiveSerializer;
\r
11 import org.simantics.databoard.type.ArrayType;
\r
12 import org.simantics.databoard.util.Range;
\r
14 public class FloatArraySerializer extends NonRecursiveSerializer {
\r
17 Integer fixedLength, fixedSize;
\r
19 public FloatArraySerializer(ArrayBinding binding)
\r
21 ArrayType arrayType = (ArrayType) binding.type();
\r
22 this.length = arrayType.getLength();
\r
24 if (length!=null && length.getLower().equals(length.getUpper()) && length.getLower().getValue()!=null)
\r
26 fixedLength = length.getLower().getValue().intValue();
\r
27 fixedSize = fixedLength * 4;
\r
32 public Object deserialize(DataInput in)
\r
33 throws IOException {
\r
34 int length = fixedLength != null ? fixedLength : in.readInt();
\r
35 if (length<0) throw new SerializationException("Cannot use negative array length");
\r
36 assertRemainingBytes(in, length*4L);
\r
38 float[] array = new float[length];
\r
39 for(int i=0;i<array.length;++i)
\r
40 array[i] = in.readFloat();
\r
44 public Object deserializeToTry(DataInput in, List<Object> identities, Object obj) throws IOException
\r
46 int length = fixedLength != null ? fixedLength : in.readInt();
\r
47 float[] array = (float[]) obj;
\r
48 if (length!=array.length) array = new float[ length ];
\r
49 assertRemainingBytes(in, length*4L);
\r
51 for (int i=0; i<array.length;i++)
\r
52 array[i] = in.readFloat();
\r
58 public void deserializeTo(DataInput in, Object obj) throws IOException {
\r
59 int length = fixedLength != null ? fixedLength : in.readInt();
\r
60 float[] array = (float[]) obj;
\r
61 if (length!=array.length) throw new SerializationException("primitive array is size immutable");
\r
62 assertRemainingBytes(in, length*4L);
\r
63 for (int i=0; i<array.length;i++)
\r
64 array[i] = in.readFloat();
\r
68 public void skip(DataInput in)
\r
69 throws IOException {
\r
70 int length = fixedSize != null ? fixedLength : in.readInt();
\r
71 in.skipBytes( length * 4 );
\r
75 public void serialize(DataOutput out, Object obj)
\r
76 throws IOException {
\r
77 float[] array = (float[])obj;
\r
78 if (fixedSize==null)
\r
79 out.writeInt(array.length);
\r
80 for(float f : array)
\r
85 public Integer getConstantSize() {
\r
90 public int getSize(Object obj) {
\r
91 if (fixedSize!=null) return fixedSize;
\r
92 float[] array = (float[])obj;
\r
93 return 4 + 4 * array.length;
\r
97 * Get the number of bytes it takes to output length field of value <code>length</code>.
\r
99 * @param length length value
\r
100 * @return bytes required
\r
102 public static int getSizeOfPutLength(int length)
\r
104 if(length < 0x80) return 1;
\r
105 if(length < 0x4080) return 2;
\r
106 if(length < 0x204000) return 3;
\r
107 if(length < 0x10200000) return 4;
\r
112 public int getMinSize() {
\r
113 return fixedSize != null ? fixedSize : 4;
\r