Javasci: nio.buffer can be used with double, integer and boolean data
[scilab.git] / scilab / modules / types / src / java / org / scilab / modules / types / ScilabList.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) 2011-2011 - DIGITEO - Calixte DENIZET
5  *
6  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 package org.scilab.modules.types;
15
16 import java.io.IOException;
17 import java.io.ObjectInput;
18 import java.io.ObjectOutput;
19 import java.util.ArrayList;
20 import java.util.Collection;
21
22 /**
23  * This class provides a representation on the Scilab List datatype<br>
24  * <br>
25  * This class is {@link java.io.Serializable} and any modification could impact
26  * load and store of data (Xcos files, Javasci saved data, etc...).<br>
27  * <br>
28  * Example:<br />
29  * <code>
30  * ScilabList data = new ScilabList();<br />
31  * data.add(new ScilabString("hello"));<br />
32  * data.add(new ScilabDouble(2));<br />
33  * </code>
34  *
35  * @see org.scilab.modules.javasci.Scilab
36  */
37 public class ScilabList extends ArrayList<ScilabType> implements ScilabType {
38
39     private static final long serialVersionUID = 6884293176289980909L;
40     private static final ScilabTypeEnum type = ScilabTypeEnum.sci_list;
41
42     private static final int VERSION = 0;
43
44     private String varName;
45
46     /**
47      * Construct an empty Scilab list.
48      */
49     public ScilabList() {
50         super();
51     }
52
53     /**
54      * Construct a list containing the elements of the specified collection, in
55      * the order that they are returned by the specified collection's iterator.
56      *
57      * @param c
58      *            the collection whose elements are to be placed into this list.
59      */
60     public ScilabList(Collection <? extends ScilabType > c) {
61         super(c);
62     }
63
64     /**
65      * Construct an empty mlist.
66      *
67      * Note that the first element of this collection is the header used by
68      * Scilab to find each field name.
69      */
70     public ScilabList(String varName) {
71         super();
72         this.varName = varName;
73     }
74
75     /**
76      * @param varName the variable name
77      * @param size the initial list size
78      */
79     public ScilabList(String varName, int size) {
80         super(size);
81         this.varName = varName;
82     }
83
84     /**
85      * {@inheritDoc}
86      */
87     public boolean isReference() {
88         return false;
89     }
90
91     /**
92      * {@inheritDoc}
93      */
94     public String getVarName() {
95         return varName;
96     }
97
98     /**
99      * {@inheritDoc}
100      */
101     public boolean isSwaped() {
102         return false;
103     }
104
105     /**
106      * @return 1 when there is data on the list, 0 otherwise.
107      * @see org.scilab.modules.types.ScilabType#getHeight()
108      */
109     @Override
110     public int getHeight() {
111         if (isEmpty()) {
112             return 0;
113         }
114         return 1;
115     }
116
117     /**
118      * Return the type of Scilab
119      *
120      * @return the type of Scilab
121      * @since 5.4.0
122      */
123     @Override
124     public ScilabTypeEnum getType() {
125         return type;
126     }
127
128     /**
129      * @return 1 when there is data on the list, 0 otherwise.
130      * @see org.scilab.modules.types.ScilabType#getWidth()
131      */
132     @Override
133     public int getWidth() {
134         if (isEmpty()) {
135             return 0;
136         }
137         return size();
138     }
139
140     /**
141      * Get a serialized list; The format is the following: i) returned[0] is an
142      * array of integers containing the Scilab type (ScilabTypeEunm) of the
143      * different elements of the list. ii) returned[i] for i&gt;=1 contains the
144      * serialized form of each items.
145      *
146      * @return a serialized SiclabList/
147      */
148     public Object[] getSerializedObject() {
149         int[] types = new int[size()];
150         Object[] items = new Object[types.length + 1];
151
152         for (int i = 0; i < types.length; i++) {
153             ScilabType var = get(i);
154             types[i] = var.getType().swigValue();
155             items[i + 1] = var.getSerializedObject();
156         }
157         items[0] = types;
158
159         return items;
160     }
161
162     @Override
163     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
164         int version = in.readInt();
165         switch (version) {
166             case 0:
167                 int size = in.readInt();
168                 ensureCapacity(size + 1);
169                 ArrayList list = (ArrayList) this;
170                 for (int i = 0; i < size; i++) {
171                     list.add(in.readObject());
172                 }
173                 varName = (String) in.readObject();
174                 break;
175             default:
176                 throw new ClassNotFoundException("A class ScilabList with a version " + version + " does not exists");
177         }
178     }
179
180     @Override
181     public void writeExternal(ObjectOutput out) throws IOException {
182         out.writeInt(VERSION);
183         out.writeInt(size());
184         for (Object var : (ArrayList) this) {
185             out.writeObject(var);
186         }
187         out.writeObject(varName);
188     }
189
190     /**
191      * Display the representation in the Scilab language of the type<br />
192      * Note that the representation can be copied/pasted straight into Scilab
193      *
194      * @return the pretty-printed data
195      * @see java.util.AbstractCollection#toString()
196      */
197     @Override
198     public String toString() {
199         StringBuffer result = new StringBuffer();
200         if (isEmpty()) {
201             return "list()";
202         }
203
204         result.append("list(");
205         for (int i = 0; i < size(); i++) {
206             result.append(get(i));
207             if (i != size() - 1) {
208                 result.append(", ");
209             }
210         }
211         result.append(")");
212
213         return result.toString();
214     }
215 }