]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/impl/DoubleArrayBinding.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / impl / DoubleArrayBinding.java
1 /*******************************************************************************
2  *  Copyright (c) 2010 Association for Decentralized Information Management in
3  *  Industry THTH ry.
4  *  All rights reserved. This program and the accompanying materials
5  *  are made available under the terms of the Eclipse Public License v1.0
6  *  which accompanies this distribution, and is available at
7  *  http://www.eclipse.org/legal/epl-v10.html
8  *
9  *  Contributors:
10  *      VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.databoard.binding.impl;
13
14 import java.lang.reflect.Array;
15 import java.util.IdentityHashMap;
16 import java.util.Iterator;
17 import java.util.Set;
18
19 import org.simantics.databoard.binding.ArrayBinding;
20 import org.simantics.databoard.binding.Binding;
21 import org.simantics.databoard.binding.DoubleBinding;
22 import org.simantics.databoard.binding.error.BindingException;
23 import org.simantics.databoard.binding.error.UnsupportedOperationException;
24 import org.simantics.databoard.type.ArrayType;
25 import org.simantics.databoard.type.DoubleType;
26 import org.simantics.databoard.type.NumberType;
27 import org.simantics.databoard.util.IdentityPair;
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) {
35                 return new DoubleArrayBinding(type, new DoubleBindingDefault((DoubleType) type.componentType));
36         }
37         
38         public DoubleArrayBinding(ArrayType type, Binding componentBinding) {
39                 super(type, componentBinding);
40         }
41         
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         }
61         
62         @Override
63     public Object createDefault()
64     throws BindingException
65     {
66                 NumberType nt = (NumberType) type().componentType;
67                 if (nt.getRange() == null) {
68                 return new double[ type().minLength() ];
69                 }
70                 return super.createDefault();
71     }   
72         
73         @Override
74         public void readFrom(Binding srcBinding, Object src, Object dst)
75                         throws BindingException {
76                 // Src Binding
77                 ArrayBinding sb = (ArrayBinding) srcBinding;
78                 // Src Component Binding
79                 DoubleBinding scb = (DoubleBinding) sb.getComponentBinding();
80                 
81                 double[] d = (double[]) dst;
82                 if (d.length != sb.size(src)) throw new BindingException("double[] is length immutable");
83                 
84                 for (int i=0; i<d.length; i++) {
85                         d[i] = scb.getValue_( sb.get(src, i) );
86                 }
87         }       
88
89         @Override
90         public Object readFromTry(Binding srcBinding, Object src, Object dst) throws BindingException {
91                 // Src Binding
92                 ArrayBinding sb = (ArrayBinding) srcBinding;
93                 // Src Component Binding
94                 DoubleBinding scb = (DoubleBinding) sb.getComponentBinding();
95                 
96                 double[] d = (double[]) dst;
97                 int srcSize = sb.size(src);
98                 if (d.length != srcSize) d = new double[ srcSize ];
99                 
100                 for (int i=0; i<d.length; i++) {
101                         d[i] = scb.getValue_( sb.get(src, i) );
102                 }
103                 
104                 return d;
105         }       
106
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
205         public void setSize(Object array, int newSize) throws BindingException {
206                 int oldSize = Array.getLength(array);
207                 if (oldSize==newSize) return;
208                 throw new BindingException("double[] is length immutable");
209         }       
210
211         @Override
212         public boolean isResizable() {
213                 return false;
214         }
215         
216 }