1 /*
2 * Copyright (c) 2003, Henri Yandell
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or
6 * without modification, are permitted provided that the
7 * following conditions are met:
8 *
9 * + Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * + Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * + Neither the name of Genjava-Core nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32 // OrderedSet.java
33 //package com.generationjava.collections;
34 package org.osjava.sj.loader.util;
35
36 import java.util.Set;
37 import java.util.Collection;
38 import java.util.Iterator;
39 import java.util.List;
40 import java.util.LinkedList;
41
42 /***
43 * An implementation of Set that guarentees ordering
44 * remains constant.
45 */
46 class OrderedSet implements Set {
47
48 private List list = null;
49
50 public OrderedSet() {
51 this.list = new LinkedList();
52 }
53
54 public OrderedSet(Collection c) {
55 this();
56 if(c != null) {
57 Iterator iterator = c.iterator();
58 while(iterator.hasNext()) {
59 add(iterator.next());
60 }
61 }
62 }
63
64 /***
65 * Create using the given List as the internal storage method.
66 */
67 public OrderedSet(List list) {
68 this.list = list;
69 }
70
71 public boolean add(Object obj) {
72 // Adds the specified element to this set if it is not already present (optional operation).
73 if(!contains(obj)) {
74 list.add(obj);
75 return true;
76 }
77 return false;
78 }
79
80 public boolean addAll(Collection c) {
81 // Adds all of the elements in the specified collection to this set if they're not already present (optional operation).
82 boolean ret = false;
83 if(c != null) {
84 Iterator iterator = c.iterator();
85 while(iterator.hasNext()) {
86 if(add(iterator.next())) {
87 ret = true;
88 }
89 }
90 }
91 return ret;
92 }
93
94 public void clear() {
95 // Removes all of the elements from this set (optional operation).
96 list.clear();
97 }
98
99 public boolean contains(Object obj) {
100 // Returns true if this set contains the specified element.
101 return list.contains(obj);
102 }
103
104 public boolean containsAll(Collection c) {
105 // Returns true if this set contains all of the elements of the specified collection.
106 return list.containsAll(c);
107 }
108
109 public boolean equals(Object obj) {
110 // Compares the specified object with this set for equality.
111 return list.equals(obj);
112 }
113
114 public int hashCode() {
115 // Returns the hash code value for this set.
116 return list.hashCode();
117 }
118
119 public boolean isEmpty() {
120 // Returns true if this set contains no elements.
121 return list.isEmpty();
122 }
123
124 public Iterator iterator() {
125 // Returns an iterator over the elements in this set.
126 return list.iterator();
127 }
128
129 public boolean remove(Object obj) {
130 // Removes the specified element from this set if it is present (optional operation).
131 return list.remove(obj);
132 }
133
134 public boolean removeAll(Collection c) {
135 // Removes from this set all of its elements that are contained in the specified collection (optional operation).
136 return list.removeAll(c);
137 }
138
139 public boolean retainAll(Collection c) {
140 // Retains only the elements in this set that are contained in the specified collection (optional operation).
141 boolean ret = false;
142 if(c != null) {
143 Iterator iterator = c.iterator();
144 while(iterator.hasNext()) {
145 Object obj = iterator.next();
146 if(!contains(obj)) {
147 remove(obj);
148 ret = true;
149 }
150 }
151 }
152 return ret;
153 }
154
155 public int size() {
156 // Returns the number of elements in this set (its cardinality).
157 return list.size();
158 }
159
160 public Object[] toArray() {
161 // Returns an array containing all of the elements in this set.
162 return list.toArray();
163 }
164
165 public Object[] toArray(Object[] arr) {
166 // Returns an array containing all of the elements in this set whose runtime type is that of the specified array.
167 return list.toArray(arr);
168 }
169
170 }