28a314b78836943480a885dcddba449f7e85d196
[scilab.git] / scilab / modules / types / src / java / org / scilab / modules / types / ScilabDoubleReference.java
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
4  *  Copyright (C) 2010-2010 - DIGITEO - Clement DAVID
5  *  Copyright (C) 2011-2011 - DIGITEO - Calixte DENIZET
6  *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17
18 package org.scilab.modules.types;
19
20 import java.io.ObjectStreamException;
21 import java.nio.DoubleBuffer;
22
23 /**
24  * This class provides a representation on the Scilab Double datatype<br>
25  * Note that double is the default datatype in Scilab.<br>
26  * <br>
27  * This class is {@link java.io.Serializable} and any modification could impact
28  * load and store of data (Xcos files, Javasci saved data, etc...).<br>
29  * <br>
30  * Example (real):<BR>
31  * <code>
32  * double [][]a={{21.2, 22.0, 42.0, 39.0},{23.2, 24.0, 44.0, 40.0}};<BR>
33  * ScilabDouble aMatrix = new ScilabDouble(a);<BR>
34  * </code> <br>
35  * Example (complex):<BR>
36  * <code>
37  * double [][]a={{21.2, 22.0, 42.0, 39.0},{23.2, 24.0, 44.0, 40.0}};<BR>
38  * double [][]aImg={{210.2, 220.0, 420.0, 390.0},{230.2, 240.0, 440.0, 400.0}};<BR>
39  * ScilabDouble aMatrix = new ScilabDouble(a, aImg);
40  * </code>
41  *
42  * @see org.scilab.modules.javasci.Scilab
43  */
44 public class ScilabDoubleReference extends ScilabDouble {
45
46     private DoubleBuffer realBuffer;
47     private DoubleBuffer imaginaryBuffer;
48     private final int nbRows;
49     private final int nbCols;
50
51     /**
52      * Constructor with a matrix of complex numbers
53      *
54      * @param realData
55      *            the real part of the data
56      * @param imagData
57      *            the imaginary part of the data
58      */
59     ScilabDoubleReference(String varName, DoubleBuffer realBuffer, DoubleBuffer imagBuffer, int nbRows, int nbCols) {
60         this.realBuffer = realBuffer;
61         this.imaginaryBuffer = imagBuffer;
62         this.nbRows = nbRows;
63         this.nbCols = nbCols;
64         this.varName = varName;
65         this.byref = true;
66         this.swaped = false;
67     }
68
69     /**
70      * Check the emptiness of the associated data.
71      *
72      * @return true, if the associated data array is empty.
73      */
74     @Override
75     public boolean isEmpty() {
76         return nbRows == 0 || nbCols == 0;
77     }
78
79     /**
80      * Check if the current data doesn't have an imaginary part.
81      *
82      * @return true, if the data are real only.
83      */
84     public boolean isReal() {
85         return imaginaryBuffer == null || imaginaryBuffer.capacity() == 0;
86     }
87
88     /**
89      * {@inheritDoc}
90      */
91     public Object getRawRealPart() {
92         return realBuffer;
93     }
94
95     /**
96      * {@inheritDoc}
97      */
98     public Object getRawImaginaryPart() {
99         return imaginaryBuffer;
100     }
101
102     /**
103      * Get the real part as DoubleBuffer
104      * @return the real part
105      */
106     public DoubleBuffer getRealBuffer() {
107         return realBuffer;
108     }
109
110     /**
111      * Get the imaginary part as DoubleBuffer
112      * @return the imaginary part
113      */
114     public DoubleBuffer getImaginaryBuffer() {
115         return imaginaryBuffer;
116     }
117
118     /**
119      * Get the real part of the data.
120      *
121      * @return the real part.
122      */
123     public double[][] getRealPart() {
124         double[][] d = new double[nbRows][nbCols];
125         ScilabTypeUtils.setBuffer(d, realBuffer);
126         return d;
127     }
128
129     /**
130      * Set the real part of the data.
131      *
132      * @param realPart
133      *            the real part.
134      */
135     public void setRealPart(double[][] realPart) {
136         ScilabTypeUtils.setPart(realBuffer, realPart);
137     }
138
139     /**
140      * Get the imaginary part of the data.
141      *
142      * @return the imaginary part.
143      */
144     public double[][] getImaginaryPart() {
145         double[][] d = new double[nbRows][nbCols];
146         ScilabTypeUtils.setBuffer(d, imaginaryBuffer);
147         return d;
148     }
149
150     /**
151      * Set the imaginary part of the data.
152      *
153      * @param imaginaryPart
154      *            the imaginary part.
155      */
156     public void setImaginaryPart(double[][] imaginaryPart) {
157         ScilabTypeUtils.setPart(imaginaryBuffer, imaginaryPart);
158     }
159
160     /**
161      * {@inheritDoc}
162      */
163     public double getRealElement(final int i, final int j) {
164         return realBuffer.get(i + nbRows * j);
165     }
166
167     /**
168      * {@inheritDoc}
169      */
170     public double getImaginaryElement(final int i, final int j) {
171         return imaginaryBuffer.get(i + nbRows * j);
172     }
173
174     /**
175      * {@inheritDoc}
176      */
177     public void setRealElement(final int i, final int j, final double x) {
178         realBuffer.put(i + nbRows * j, x);
179     }
180
181     /**
182      * {@inheritDoc}
183      */
184     public void setImaginaryElement(final int i, final int j, final double x) {
185         imaginaryBuffer.put(i + nbRows * j, x);
186     }
187
188     /**
189      * {@inheritDoc}
190      */
191     public void setElement(final int i, final int j, final double x, final double y) {
192         realBuffer.put(i + nbRows * j, x);
193         imaginaryBuffer.put(i + nbRows * j, x);
194     }
195
196     /**
197      * When this object is deserialized we want a ScilabDouble, not a ScilabDoubleReference.
198      * @return a ScilabDouble
199      */
200     private Object readResolve() throws ObjectStreamException {
201         return new ScilabDouble(varName, realPart, imaginaryPart, swaped);
202     }
203
204     @Override
205     public int getHeight() {
206         return nbRows;
207     }
208
209     @Override
210     public int getWidth() {
211         return nbCols;
212     }
213 }