KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > ant > internal > ui > dtd > util > SortedSet


1 /*******************************************************************************
2  * Copyright (c) 2002, 2005 Object Factory Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * Object Factory Inc. - Initial implementation
10  *******************************************************************************/

11 package org.eclipse.ant.internal.ui.dtd.util;
12
13 import java.util.Comparator JavaDoc;
14
15 /**
16  * SortedSet is a flyweight set implementation that uses
17  * an external array provided by a KeyHolder.
18  * SortedSet provides both equality/comparison operations
19  * and identity operations.
20  * @author Bob Foster
21  */

22 public class SortedSet {
23     protected Comparator JavaDoc fComp;
24     protected IKeyHolder fKeyHolder;
25     protected SortedSet fNext;
26     
27     public SortedSet(IKeyHolder holder, Comparator JavaDoc comp) {
28         fComp = comp;
29         fKeyHolder = holder;
30     }
31     /**
32      * Constructor. A keyholder must be
33      * supplied by <code>setKeyHolder()</code> prior ot
34      * <i>any</i> operations.
35      */

36     public SortedSet(Comparator JavaDoc comp) {
37         fComp = comp;
38     }
39     /**
40      * Constructor, no comparator. Only identity operations
41      * may be performed in this set.
42      */

43     public SortedSet(IKeyHolder holder) {
44         fKeyHolder = holder;
45     }
46     /**
47      * Constructor, no comparator. Only identity operations
48      * may be performed in this set. A keyholder must be
49      * supplied by <code>setKeyHolder()</code> prior ot
50      * <i>any</i> operations.
51      */

52     public SortedSet() {
53     }
54     public void setKeyHolder(IKeyHolder holder) {
55         fKeyHolder = holder;
56     }
57     public void setComparator(Comparator JavaDoc comp) {
58         fComp = comp;
59     }
60     /**
61      * Add to set (no duplicates allowed).
62      * @param obj Object to add
63      * @return true if object was added; false
64      * if object was already in the set.
65      */

66     public boolean add(Object JavaDoc obj) {
67         return internalAdd(obj, false) >= 0;
68     }
69     protected int internalAdd(Object JavaDoc obj, boolean always) {
70         Object JavaDoc[] array = fKeyHolder.getKeys();
71         if (array == null) {
72             array = new Object JavaDoc[1];
73             fKeyHolder.setKeys(array);
74             array[0] = obj;
75             return 0;
76         }
77         int i = 0;
78         int comp = -1;
79         
80         for (; i < array.length; i++) {
81             if ((comp = fComp.compare(obj, array[i])) <= 0) {
82                 break;
83             }
84         }
85         if (comp == 0 && !always)
86             return -1;
87         internalAdd(i, obj);
88         return i;
89     }
90     protected void internalAdd(int i, Object JavaDoc obj) {
91         Object JavaDoc[] array = fKeyHolder.getKeys();
92         if (array == null) {
93             array = new Object JavaDoc[1];
94             array[0] = obj;
95             fKeyHolder.setKeys(array);
96         }
97         else {
98             Object JavaDoc[] tmp = new Object JavaDoc[array.length+1];
99             System.arraycopy(array,0,tmp,0,i);
100             tmp[i] = obj;
101             System.arraycopy(array,i,tmp,i+1,array.length-i);
102             fKeyHolder.setKeys(tmp);
103         }
104     }
105     /**
106      * Add allowing duplicates.
107      * @param obj Object to add
108      * @return index where object was added in sorted order.
109      */

110     public int addAlways(Object JavaDoc obj) {
111         return internalAdd(obj, true);
112     }
113     /**
114      * Append, a variant of add allowing duplicates that
115      * always puts the new member at the end of the set.
116      * Set can be used with identity operations only.
117      */

118     public void append(Object JavaDoc obj) {
119         Object JavaDoc[] array = fKeyHolder.getKeys();
120         int len = array != null ? array.length : 0;
121         internalAdd(len, obj);
122     }
123     public boolean contains(Object JavaDoc obj) {
124         return indexOf(obj) >= 0;
125     }
126     public int indexOf(Object JavaDoc obj) {
127         Object JavaDoc[] array = fKeyHolder.getKeys();
128         if (array == null)
129             return -1;
130         for (int i = 0; i < array.length; i++) {
131             int comp = fComp.compare(obj, array[i]);
132             if (comp == 0)
133                 return i;
134             if (comp < 0)
135                 return -1;
136         }
137         return -1;
138     }
139     public boolean containsIdentity(Object JavaDoc obj) {
140         return indexOf(obj) >= 0;
141     }
142     public int indexOfIdentity(Object JavaDoc obj) {
143         Object JavaDoc[] array = fKeyHolder.getKeys();
144         if (array == null)
145             return -1;
146         for (int i = 0; i < array.length; i++) {
147             if (obj == array[i])
148                 return i;
149         }
150         return -1;
151     }
152     public boolean equals(Object JavaDoc o) {
153         if (this == o)
154             return true;
155         if (!(o instanceof SortedSet))
156             return false;
157         SortedSet other = (SortedSet) o;
158         Object JavaDoc[] array = fKeyHolder.getKeys();
159         Object JavaDoc[] otherarray = other.fKeyHolder.getKeys();
160         if ((array == null) != (otherarray == null))
161             return false;
162         if (array == null)
163             return true;
164         if (array.length != otherarray.length)
165             return false;
166         for (int i = 0; i < array.length; i++) {
167             if (array[i] != otherarray[i])
168                 return false;
169         }
170         return true;
171     }
172     public boolean equalsIdentify(Object JavaDoc o) {
173         if (this == o)
174             return true;
175         if (!(o instanceof SortedSet))
176             return false;
177         SortedSet other = (SortedSet) o;
178         Object JavaDoc[] array = fKeyHolder.getKeys();
179         Object JavaDoc[] otherarray = other.fKeyHolder.getKeys();
180         if ((array == null) != (otherarray == null))
181             return false;
182         if (array == null)
183             return true;
184         if (array.length != otherarray.length)
185             return false;
186         for (int i = 0; i < array.length; i++) {
187             if (fComp.compare(array[i], otherarray[i]) != 0)
188                 return false;
189         }
190         return true;
191     }
192     public void merge(SortedSet other) {
193         Object JavaDoc[] array = fKeyHolder.getKeys();
194         Object JavaDoc[] otherarray = other.fKeyHolder.getKeys();
195         if (otherarray == null)
196             return;
197         if (array == null) {
198             array = otherarray;
199             return;
200         }
201         int ithis = 0, iother = 0, i = 0;
202         int mthis = array.length, mother = otherarray.length;
203         Object JavaDoc[] tmp = new Object JavaDoc[mthis+mother];
204         while (ithis < mthis && iother < mother) {
205             int comp = fComp.compare(array[ithis], otherarray[iother]);
206             if (comp <= 0) {
207                 tmp[i++] = array[ithis++];
208             }
209             else {
210                 tmp[i++] = otherarray[iother++];
211             }
212         }
213         while (ithis < mthis) {
214             tmp[i++] = array[ithis++];
215         }
216         while (iother < mother) {
217             tmp[i++] = otherarray[iother++];
218         }
219     }
220     public Object JavaDoc[] members() {
221         Object JavaDoc[] array = fKeyHolder.getKeys();
222         if (array == null)
223             return new Object JavaDoc[0];
224         return array;
225     }
226     public int size() {
227         Object JavaDoc[] array = fKeyHolder.getKeys();
228         return array == null ? 0 : array.length;
229     }
230     public void remove(int i) {
231         Object JavaDoc[] array = fKeyHolder.getKeys();
232         Object JavaDoc[] tmp = new Object JavaDoc[array.length-1];
233         System.arraycopy(array,0,tmp,0,i);
234         System.arraycopy(array,i+1,tmp,i,array.length-i-1);
235         fKeyHolder.setKeys(tmp);
236     }
237     public boolean remove(Object JavaDoc obj) {
238         int i = indexOf(obj);
239         if (i >= 0) {
240             remove(i);
241             return true;
242         }
243         return false;
244     }
245     public boolean removeIdentity(Object JavaDoc obj) {
246         int i = indexOfIdentity(obj);
247         if (i >= 0) {
248             remove(i);
249             return true;
250         }
251         return false;
252     }
253     public SortedSet getNextSet() {
254         return fNext;
255     }
256     public void setNextSet(SortedSet next) {
257         fNext = next;
258     }
259
260 }
261
Popular Tags