]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/impl/BooleanArraySerializer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / serialization / impl / BooleanArraySerializer.java
1 package org.simantics.databoard.serialization.impl;\r
2 \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
7 \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
13 \r
14 public class BooleanArraySerializer extends NonRecursiveSerializer {\r
15 \r
16         Range length;\r
17         Integer fixedLength, fixedSize;\r
18         \r
19         public BooleanArraySerializer(ArrayBinding binding)\r
20         {\r
21                 ArrayType arrayType = (ArrayType) binding.type();\r
22                 this.length = arrayType.getLength();\r
23                 if (length!=null && length.getLower().equals(length.getUpper()) && length.getLower().getValue()!=null)\r
24                 {\r
25                         fixedLength = length.getLower().getValue().intValue();\r
26                         fixedSize = fixedLength * 1;\r
27                 }\r
28         }\r
29         \r
30         @Override\r
31         public Object deserialize(DataInput in)\r
32         throws IOException, SerializationException \r
33         {\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);                       \r
37                 \r
38                 boolean[] array = new boolean[length];\r
39                 for(int i=0;i<array.length;++i) {\r
40                         byte value = in.readByte();\r
41                         if (value==0) array[i] = false;\r
42                         else if (value==1) array[i] = true;\r
43                         else throw new SerializationException("Unexpected value \""+value+"\" for boolean");\r
44                 }\r
45                 return array;\r
46         }\r
47         \r
48         public Object deserializeToTry(DataInput in, List<Object> identities, Object obj) throws IOException\r
49         {\r
50                 int length = fixedLength != null ? fixedLength : in.readInt();\r
51                 boolean[] array = (boolean[]) obj;\r
52                 if (length!=array.length) array = new boolean[ length ];\r
53                 assertRemainingBytes(in, length);                       \r
54                 \r
55                 for (int i=0; i<array.length;i++) {\r
56                         byte value = in.readByte();\r
57                         if (value==0) array[i] = false;\r
58                         else if (value==1) array[i] = true;\r
59                         else throw new SerializationException("Unexpected value \""+value+"\" for boolean");\r
60                 }\r
61                 \r
62                 return array;\r
63         }\r
64 \r
65         @Override\r
66         public void deserializeTo(DataInput in, Object obj)\r
67                         throws IOException { \r
68                 int length = fixedLength != null ? fixedLength : in.readInt();\r
69                 boolean[] array = (boolean[]) obj;\r
70                 if (length!=array.length) throw new SerializationException("primitive array is size immutable");\r
71                 assertRemainingBytes(in, length);                       \r
72                 \r
73                 for (int i=0; i<array.length;i++) {\r
74                         byte value = in.readByte();\r
75                         if (value==0) array[i] = false;\r
76                         else if (value==1) array[i] = true;\r
77                         else throw new SerializationException("Unexpected value \""+value+"\" for boolean");\r
78                 }\r
79         }\r
80 \r
81         @Override\r
82         public void skip(DataInput in)\r
83                         throws IOException {\r
84                 int length = fixedSize != null ? fixedLength : in.readInt();                    \r
85                 in.skipBytes(length);\r
86         }\r
87         \r
88         @Override\r
89         public void serialize(DataOutput out, Object obj)\r
90         throws IOException \r
91         {\r
92                 boolean[] array = (boolean[])obj;\r
93                 if (fixedLength==null) \r
94                         out.writeInt(array.length);\r
95                 for(boolean f : array)\r
96                         out.write( (byte) (f ? 1 : 0) );\r
97         }\r
98 \r
99         @Override\r
100         public Integer getConstantSize() {\r
101                 return fixedSize;\r
102         }\r
103 \r
104         @Override\r
105         public int getSize(Object obj) {\r
106                 if (fixedSize!=null) return fixedSize;\r
107                 boolean[] array = (boolean[])obj;                       \r
108                 return 4 + array.length;\r
109         }\r
110 \r
111         @Override\r
112         public int getMinSize() {\r
113                 return fixedSize != null ? fixedSize : 4;\r
114         }\r
115         \r
116 }