86d988839184860b7b4e692203b7d3c1d262145e
[scilab.git] / scilab / modules / types / src / java / org / scilab / modules / types / ScilabBoolean.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.IOException;
21 import java.io.ObjectInput;
22 import java.io.ObjectOutput;
23 import java.util.Arrays;
24
25 /**
26  * This class provides a representation on the Scilab boolean datatype<br>
27  * <br>
28  * This class is {@link java.io.Serializable} and any modification could impact
29  * load and store of data (Xcos files, Javasci saved data, etc...).<br>
30  * <br>
31  * Example:<BR>
32  * <code>
33  * boolean [][]a={{true,false,true}, {true,true,true}};<BR>
34  * ScilabBoolean aMatrix = new ScilabBoolean(a);
35  * </code>
36  *
37  * @see org.scilab.modules.javasci.Scilab
38  */
39 public class ScilabBoolean implements ScilabType {
40
41     private static final long serialVersionUID = 6511497080095473901L;
42     private static final ScilabTypeEnum type = ScilabTypeEnum.sci_boolean;
43
44     private static final int VERSION = 0;
45
46     /* the boolean data */
47     protected boolean[][] data;
48     protected String varName;
49     protected boolean swaped;
50     transient protected boolean byref;
51
52     /**
53      * Create an empty object
54      */
55     public ScilabBoolean() {
56         data = null;
57     }
58
59     /**
60      * Create an object from an array of array of boolean
61      *
62      * @param data
63      *            the array of boolean
64      */
65     public ScilabBoolean(boolean[][] data) {
66         this.data = data;
67     }
68
69     /**
70      * Create an object from an array of array of boolean
71      *
72      * @param data
73      *            the array of boolean
74      */
75     public ScilabBoolean(String varName, boolean[][] data, boolean swaped) {
76         this.varName = varName;
77         this.data = data;
78         this.swaped = swaped;
79     }
80
81     /**
82      * Create a scalar boolean from a boolean
83      *
84      * @param value
85      *            the boolean
86      */
87     public ScilabBoolean(boolean value) {
88         this.data = new boolean[1][1];
89         this.data[0][0] = value;
90     }
91
92     /**
93      * {@inheritDoc}
94      */
95     public boolean isReference() {
96         return byref;
97     }
98
99     /**
100      * Change the value with the provided data
101      *
102      * @param data
103      *            array of boolean
104      */
105     public void setData(boolean[][] data) {
106         this.data = data;
107     }
108
109     /**
110      * Return the data
111      *
112      * @return the array of array of boolean
113      */
114     public boolean[][] getData() {
115         return data;
116     }
117
118     /**
119      * @return the data
120      */
121     public Object getRawData() {
122         return data;
123     }
124
125     /**
126      * Get the element at position (i, j)
127      * @param i the first coordinate
128      * @param j the second coordinate
129      * @return the corresponding boolean
130      */
131     public boolean getElement(final int i, final int j) {
132         return data[i][j];
133     }
134
135     /**
136      * Set the element at position (i, j)
137      * @param i the first coordinate
138      * @param j the second coordinate
139      * @param x the new value
140      */
141     public void setElement(final int i, final int j, final boolean x) {
142         data[i][j] = x;
143     }
144
145     /**
146      * {@inheritDoc}
147      */
148     public String getVarName() {
149         return varName;
150     }
151
152     /**
153      * {@inheritDoc}
154      */
155     public boolean isSwaped() {
156         return swaped;
157     }
158
159     /**
160      * Return the type of Scilab
161      *
162      * @return the type of Scilab
163      * @since 5.4.0
164      */
165     @Override
166     public ScilabTypeEnum getType() {
167         return type;
168     }
169
170     /**
171      * Return the height (number of element) of the stored data
172      *
173      * @return the height
174      */
175     @Override
176     public int getHeight() {
177         if (data == null) {
178             return 0;
179         }
180         return data.length;
181     }
182
183     /**
184      * Return the width (number of element) of the stored data
185      *
186      * @return the width
187      */
188     @Override
189     public int getWidth() {
190         if (data == null) {
191             return 0;
192         }
193         return data[0].length;
194     }
195
196     /**
197      * If it is empty / uninitialized
198      *
199      * @return true if empty
200      */
201     @Override
202     public boolean isEmpty() {
203         return data == null;
204     }
205
206     @Override
207     public int hashCode() {
208         return Arrays.deepHashCode(data);
209     }
210
211     /**
212      * @see org.scilab.modules.types.ScilabType#equals(Object)
213      */
214     @Override
215     public boolean equals(Object obj) {
216         if (obj instanceof ScilabBoolean) {
217             ScilabBoolean sciBool = (ScilabBoolean) obj;
218             if (isEmpty() && sciBool.isEmpty()) {
219                 return true;
220             }
221
222             if (this.getWidth() != sciBool.getWidth() || this.getHeight() != sciBool.getHeight()) {
223                 return false;
224             }
225
226             return ScilabTypeUtils.equalsBoolean(this.getRawData(), this.isSwaped(), sciBool.getRawData(), sciBool.isSwaped());
227         }
228
229         return false;
230     }
231
232     /**
233      * {@inheritDoc}
234      */
235     public Object getSerializedObject() {
236         return getData();
237     }
238
239     @Override
240     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
241         int version = in.readInt();
242         switch (version) {
243             case 0:
244                 data = (boolean[][]) in.readObject();
245                 varName = (String) in.readObject();
246                 swaped = in.readBoolean();
247                 break;
248             default:
249                 throw new ClassNotFoundException("A class ScilabBoolean with a version " + version + " does not exists");
250         }
251     }
252
253     @Override
254     public void writeExternal(ObjectOutput out) throws IOException {
255         out.writeInt(VERSION);
256         out.writeObject(getData());
257         out.writeObject(varName);
258         out.writeBoolean(swaped);
259     }
260
261     /**
262      * Display the representation in the Scilab language of the type<BR>
263      * Note that the representation can be copied/pasted straight into Scilab
264      *
265      * @return the pretty print
266      */
267     @Override
268     public String toString() {
269         StringBuilder result = new StringBuilder();
270
271         if (isEmpty()) {
272             return "[]";
273         }
274
275         result.append("[");
276         for (int i = 0; i < getHeight(); ++i) {
277             for (int j = 0; j < getWidth(); ++j) {
278                 if (getElement(i, j)) {
279                     result.append("%t");
280                 } else {
281                     result.append("%f");
282                 }
283                 if (j != getWidth() - 1) {
284                     result.append(", ");
285                 }
286             }
287             if (i != getHeight() - 1) {
288                 result.append(" ; ");
289             }
290         }
291         result.append("]");
292         return result.toString();
293     }
294 }