KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > lists > FVector


1 // Copyright (c) 2001 Per M.A. Bothner and Brainfood Inc.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.lists;
5 import java.io.*;
6
7 /** Simple adjustable-length vector whose elements are Object references. */
8
9 public class FVector extends SimpleVector
10   implements Externalizable, Consumable
11   /* #ifdef JAVA2 */
12   , Comparable JavaDoc
13   /* #endif */
14 {
15   public Object JavaDoc[] data;
16
17   protected static Object JavaDoc[] empty = new Object JavaDoc[0];
18
19   public FVector ()
20   {
21     data = empty;
22   }
23
24   public FVector (int num)
25   {
26     size = num;
27     data = new Object JavaDoc[num];
28   }
29
30   public FVector (int num, Object JavaDoc o)
31   {
32     Object JavaDoc[] data = new Object JavaDoc[num];
33     if (o != null)
34       {
35     for (int i = 0; i < num; i++)
36       data[i] = o;
37       }
38     this.data = data;
39     this.size = num;
40   }
41
42   /** Reuses the argument without making a copy! */
43   public FVector (Object JavaDoc[] data)
44   {
45     this.size = data.length;
46     this.data = data;
47   }
48
49   /* #ifdef JAVA2 */
50   public FVector(java.util.List JavaDoc seq)
51   {
52     this.data = new Object JavaDoc[seq.size()];
53     addAll(seq);
54   }
55   /* #endif */
56   /* #ifndef JAVA2 */
57   // public FVector(Sequence seq)
58
// {
59
// this.data = new Object[seq.size()];
60
// addAll(seq);
61
// }
62
/* #endif */
63
64   /** Get the allocated length of the data buffer. */
65   public int getBufferLength()
66   {
67     return data.length;
68   }
69
70   public void setBufferLength(int length)
71   {
72     int oldLength = data.length;
73     if (oldLength != length)
74       {
75     Object JavaDoc[] tmp = new Object JavaDoc[length];
76     System.arraycopy(data, 0, tmp, 0,
77              oldLength < length ? oldLength : length);
78     data = tmp;
79       }
80   }
81
82   protected Object JavaDoc getBuffer() { return data; }
83
84   public void shift(int srcStart, int dstStart, int count)
85   {
86     System.arraycopy(data, srcStart, data, dstStart, count);
87   }
88
89   public final Object JavaDoc getBuffer(int index)
90   {
91     return data[index];
92   }
93
94   public final Object JavaDoc get (int index)
95   {
96     if (index >= size)
97       throw new ArrayIndexOutOfBoundsException JavaDoc();
98     return data[index];
99   }
100
101   public final Object JavaDoc setBuffer(int index, Object JavaDoc value)
102   {
103     Object JavaDoc old = data[index];
104     data[index] = value;
105     return old;
106   }
107
108   protected void clearBuffer(int start, int count)
109   {
110     while (--count >= 0)
111       data[start++] = null;
112   }
113
114   public boolean equals (Object JavaDoc obj)
115   {
116     if (obj == null || !(obj instanceof FVector))
117       return false;
118     FVector obj_vec = (FVector) obj;
119     int n = size;
120     if (obj_vec.data == null || obj_vec.size != n)
121       return false;
122     Object JavaDoc[] obj_data = obj_vec.data;
123     for (int i = 0; i < n; i++)
124       {
125     if (! (data[i].equals (obj_data[i])))
126       return false;
127       }
128     return true;
129   }
130
131   /* #ifdef JAVA2 */
132   public int compareTo(Object JavaDoc obj)
133   {
134     FVector vec2 = (FVector) obj;
135     Object JavaDoc[] d1 = data;
136     Object JavaDoc[] d2 = vec2.data;
137     int n1 = size;
138     int n2 = vec2.size;
139     int n = n1 > n2 ? n2 : n1;
140     for (int i = 0; i < n; i++)
141       {
142         Comparable JavaDoc v1 = (Comparable JavaDoc) d1[i];
143         Comparable JavaDoc v2 = (Comparable JavaDoc) d2[i];
144         int d = v1.compareTo(v2);
145         if (d != 0)
146           return d;
147       }
148     return n1 - n2;
149   }
150   /* #endif */
151
152   /*
153   public final void setElementAt (Object new_value, int index)
154   {
155     if (index >= size)
156       throw new ArrayIndexOutOfBoundsException();
157     data[index] = new_value;
158   }
159   */

160
161   // FIXME - bad name - setAll should take a Collection
162
public final void setAll (Object JavaDoc new_value)
163   {
164      for (int i = size; --i >= 0; )
165        data[i] = new_value;
166   }
167
168   public boolean consumeNext(int ipos, Consumer out)
169   {
170     int index = ipos >>> 1;
171     if (index >= size)
172       return false;
173     out.writeObject(data[index]);
174     return true;
175   }
176
177   public void consumePosRange (int iposStart, int iposEnd, Consumer out)
178   {
179     if (out.ignoring())
180       return;
181     int i = iposStart >>> 1;
182     int end = iposEnd >>> 1;
183     if (end > size)
184       end = size;
185     for (; i < end; i++)
186       out.writeObject(data[i]);
187   }
188
189   public void consume(Consumer out)
190   {
191     out.beginGroup("#vector");
192     int len = size;
193     for (int i = 0; i < len; i++)
194       out.writeObject(data[i]);
195     out.endGroup();
196   }
197
198   /**
199    * @serialData Write the number of elements (using writeInt), followed by
200    * the elements in order (written using writeObject).
201    * (It might seem simpler (and increase sharing) to just call
202    * writeObject(value), but that exposes the implementation.)
203    */

204   public void writeExternal(ObjectOutput out) throws IOException
205   {
206     int n = size;
207     out.writeInt(n);
208     for (int i = 0; i < n; i++)
209       out.writeObject(data[i]);
210   }
211
212   public void readExternal(ObjectInput in)
213     throws IOException, ClassNotFoundException JavaDoc
214   {
215     int n = in.readInt();
216     Object JavaDoc[] data = new Object JavaDoc[n];
217     for (int i = 0; i < n; i++)
218       data[i] = in.readObject();
219     size = n;
220     this.data = data;
221   }
222 }
223
Popular Tags