]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/impl/DoubleArrayBinding.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / impl / DoubleArrayBinding.java
1 /*******************************************************************************\r
2  *  Copyright (c) 2010 Association for Decentralized Information Management in\r
3  *  Industry THTH ry.\r
4  *  All rights reserved. This program and the accompanying materials\r
5  *  are made available under the terms of the Eclipse Public License v1.0\r
6  *  which accompanies this distribution, and is available at\r
7  *  http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  *  Contributors:\r
10  *      VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.databoard.binding.impl;
13
14 import java.lang.reflect.Array;\r
15 import java.util.IdentityHashMap;\r
16 import java.util.Iterator;\r
17 import java.util.Set;\r
18 \r
19 import org.simantics.databoard.binding.ArrayBinding;\r
20 import org.simantics.databoard.binding.Binding;\r
21 import org.simantics.databoard.binding.DoubleBinding;\r
22 import org.simantics.databoard.binding.error.BindingException;\r
23 import org.simantics.databoard.binding.error.UnsupportedOperationException;\r
24 import org.simantics.databoard.type.ArrayType;\r
25 import org.simantics.databoard.type.DoubleType;\r
26 import org.simantics.databoard.type.NumberType;\r
27 import org.simantics.databoard.util.IdentityPair;\r
28
29 /**
30  * Binds Double[] type to double[] Class.
31  */
32 public final class DoubleArrayBinding extends ArrayBinding {
33
34         public static DoubleArrayBinding createFrom(ArrayType type) {\r
35                 return new DoubleArrayBinding(type, new DoubleBindingDefault((DoubleType) type.componentType));\r
36         }\r
37         \r
38         public DoubleArrayBinding(ArrayType type, Binding componentBinding) {\r
39                 super(type, componentBinding);\r
40         }\r
41         \r
42         @Override
43         public Object create() {
44                 return new double[0];
45         }
46
47         @Override
48         public Object create(int length, Iterator<Object> values) {
49                 double[] array = new double[length];
50                 for(int i=0;i<length;++i)
51                         array[i] = (Double)values.next();
52                 return array;
53         }
54         
55         public Object create(Object[] values) {
56                 double[] result = new double[values.length];
57                 for (int i=0; i<values.length; i++)
58                         result[i] = (Double) values[i];
59                 return result;
60         }\r
61         \r
62         @Override\r
63     public Object createDefault()\r
64     throws BindingException\r
65     {\r
66                 NumberType nt = (NumberType) type().componentType;\r
67                 if (nt.getRange() == null) {\r
68                 return new double[ type().minLength() ];\r
69                 }\r
70                 return super.createDefault();\r
71     }   \r
72         \r
73         @Override\r
74         public void readFrom(Binding srcBinding, Object src, Object dst)\r
75                         throws BindingException {\r
76                 // Src Binding\r
77                 ArrayBinding sb = (ArrayBinding) srcBinding;\r
78                 // Src Component Binding\r
79                 DoubleBinding scb = (DoubleBinding) sb.getComponentBinding();\r
80                 \r
81                 double[] d = (double[]) dst;\r
82                 if (d.length != sb.size(src)) throw new BindingException("double[] is length immutable");\r
83                 \r
84                 for (int i=0; i<d.length; i++) {\r
85                         d[i] = scb.getValue_( sb.get(src, i) );\r
86                 }\r
87         }       \r
88 \r
89         @Override\r
90         public Object readFromTry(Binding srcBinding, Object src, Object dst) throws BindingException {\r
91                 // Src Binding\r
92                 ArrayBinding sb = (ArrayBinding) srcBinding;\r
93                 // Src Component Binding\r
94                 DoubleBinding scb = (DoubleBinding) sb.getComponentBinding();\r
95                 \r
96                 double[] d = (double[]) dst;\r
97                 int srcSize = sb.size(src);\r
98                 if (d.length != srcSize) d = new double[ srcSize ];\r
99                 \r
100                 for (int i=0; i<d.length; i++) {\r
101                         d[i] = scb.getValue_( sb.get(src, i) );\r
102                 }\r
103                 \r
104                 return d;\r
105         }       \r
106 \r
107         /**
108          * Create an array object.
109          * Note! The argument is consumed (is used in the result).
110          * 
111          * @param array
112          * @return an object that contains the array
113          */
114         public Object create(double[] array) {
115                 return array;
116         }
117         
118         @Override
119         public Object get(Object array, int index) throws BindingException {
120                 if (!isInstance(array)) throw new BindingException("Unexpected class "+array.getClass().getSimpleName()+", double[] expected");
121                 return ((double[])array)[index];
122         }
123
124         @Override
125         public void getAll(Object array, Object[] result) throws BindingException {
126                 double[] a = (double[])array;
127                 for (int i=0; i<a.length; i++)
128                         result[i] = a[i];
129         }
130         
131         @Override
132         public void set(Object array, int index, Object value)
133                         throws BindingException {
134                 double[] a = (double[])array;
135                 a[index] = (Double) value;
136         }
137         
138         @Override
139         public int size(Object array) throws BindingException {
140                 if (!isInstance(array)) throw new BindingException("Unexpected class "+array.getClass().getSimpleName()+", double[] expected");
141                 return ((double[])array).length;
142         }
143
144         @Override
145         public boolean isInstance(Object obj) {
146                 return obj instanceof double[];
147         }
148         
149         @Override
150         public boolean isImmutable() {
151                 return false;
152         }       
153         
154         public double[] getArray(Object array) throws BindingException {
155                 if (!isInstance(array)) throw new BindingException("Unexpected class "+array.getClass().getSimpleName()+", double[] expected");
156                 return (double[]) array;
157         }       
158
159     @Override
160     public int deepHashValue(Object value, IdentityHashMap<Object, Object> hashedObjects) throws BindingException {
161         int result = 1;
162         double[] array = (double[]) value;
163         for (int i=0; i<array.length; i++) {
164                 double element = array[i];              
165                 long bits = Double.doubleToLongBits(element);
166                 int elementHash = (int)(bits ^ (bits >>> 32));                  
167                 result = 31*result + elementHash;
168         }
169         return result;
170     }
171         
172     @Override
173     public int deepCompare(Object o1, Object o2,
174                 Set<IdentityPair<Object, Object>> compareHistory)
175                 throws BindingException {
176         double[] a1 = (double[]) o1;
177         double[] a2 = (double[]) o2;
178                 // Compare Lengths
179                 int l1 = a1.length;
180                 int l2 = a2.length;
181                 int dif = l1 - l2;
182                 if (dif!=0) return dif;
183                 // Compare elements
184                 for (int i=0; i<l1; i++) {
185                         double v1 = a1[i];
186                         double v2 = a2[i];
187                         dif = Double.compare(v1, v2);
188                         if (dif!=0) return dif;
189                 }
190                 return 0;
191     }    
192
193     @Override
194     public void add(Object array, int index, Object element)
195                 throws BindingException, IndexOutOfBoundsException {
196         throw new UnsupportedOperationException();
197     }
198     
199         @Override
200         public void remove(Object array, int index, int count) throws BindingException {
201         throw new UnsupportedOperationException();
202         }
203     
204         @Override\r
205         public void setSize(Object array, int newSize) throws BindingException {\r
206                 int oldSize = Array.getLength(array);\r
207                 if (oldSize==newSize) return;\r
208                 throw new BindingException("double[] is length immutable");\r
209         }       \r
210 \r
211         @Override\r
212         public boolean isResizable() {\r
213                 return false;\r
214         }\r
215         
216 }