OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2012 René Jeschke <rene_jeschke@yahoo.de> | |
3 * | |
4 * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 * you may not use this file except in compliance with the License. | |
6 * You may obtain a copy of the License at | |
7 * | |
8 * http://www.apache.org/licenses/LICENSE-2.0 | |
9 * | |
10 * Unless required by applicable law or agreed to in writing, software | |
11 * distributed under the License is distributed on an "AS IS" BASIS, | |
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 * See the License for the specific language governing permissions and | |
14 * limitations under the License. | |
15 */ | |
16 package com.github.rjeschke.neetutils.dispose; | |
17 | |
18 /** | |
19 * Specialized linked list to hold weak references or similar stuff. Adding and | |
20 * removing is guaranteed O(1). | |
21 * | |
22 * @author René Jeschke <rene_jeschke@yhoo.de> | |
23 */ | |
24 public class ReferenceList<T> | |
25 { | |
26 private Node<T> root; | |
27 private int size; | |
28 | |
29 /** | |
30 * Constructor. | |
31 */ | |
32 public ReferenceList() | |
33 { | |
34 // empty | |
35 } | |
36 | |
37 /** | |
38 * Gets the number of items currently in this list. | |
39 * | |
40 * @return The size. | |
41 */ | |
42 public int size() | |
43 { | |
44 return this.size; | |
45 } | |
46 | |
47 /** | |
48 * Checks if this list is empty. | |
49 * | |
50 * @return <code>true</code> is this list is empty | |
51 */ | |
52 public boolean isEmpty() | |
53 { | |
54 return this.size == 0; | |
55 } | |
56 | |
57 /** | |
58 * Adds a value to this list (at head). | |
59 * | |
60 * @param value | |
61 * Value to add | |
62 * @return Node reference needed for remove | |
63 */ | |
64 public Node<T> add(final T value) | |
65 { | |
66 final Node<T> node = new Node<T>(value); | |
67 this.size++; | |
68 if (this.root != null) | |
69 { | |
70 node.next = this.root; | |
71 this.root.previous = node; | |
72 } | |
73 this.root = node; | |
74 | |
75 return node; | |
76 } | |
77 | |
78 /** | |
79 * Removes the last added Node. | |
80 * | |
81 * @return The last added Node or <code>null</code> if this list is empty. | |
82 */ | |
83 public Node<T> removeLast() | |
84 { | |
85 if (this.root == null) | |
86 { | |
87 return null; | |
88 } | |
89 | |
90 this.size--; | |
91 final Node<T> node = this.root; | |
92 if (node.next != null) | |
93 { | |
94 node.next.previous = null; | |
95 } | |
96 this.root = node.next; | |
97 | |
98 node.next = node.previous = null; | |
99 node.inside = false; | |
100 return node; | |
101 } | |
102 | |
103 /** | |
104 * Removes the given Node from this list. Multiple removes are prevented. | |
105 * | |
106 * @param node | |
107 * The Node to remove | |
108 */ | |
109 public void remove(final Node<T> node) | |
110 { | |
111 if (!node.inside) | |
112 { | |
113 return; | |
114 } | |
115 | |
116 this.size--; | |
117 if (node.previous == null) | |
118 { | |
119 this.root = node.next; | |
120 } | |
121 else | |
122 { | |
123 node.previous.next = node.next; | |
124 if (node.next != null) | |
125 { | |
126 node.next.previous = node.previous; | |
127 } | |
128 } | |
129 | |
130 node.next = node.previous = null; | |
131 node.inside = false; | |
132 } | |
133 | |
134 /** | |
135 * | |
136 * | |
137 * @author René Jeschke <rene_jeschke@yhoo.de> | |
138 */ | |
139 public static class Node<T> | |
140 { | |
141 final T value; | |
142 boolean inside = true; | |
143 Node<T> previous; | |
144 Node<T> next; | |
145 | |
146 public Node(final T value) | |
147 { | |
148 this.value = value; | |
149 } | |
150 | |
151 public T value() | |
152 { | |
153 return this.value; | |
154 } | |
155 | |
156 @Override | |
157 public String toString() | |
158 { | |
159 return "Node: " + this.value; | |
160 } | |
161 } | |
162 } | |
OLD | NEW |