1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
package org.eclipse.team.internal.ccvs.core.syncinfo;
import java.util.Arrays;
import org.eclipse.core.resources.IResource;
class ResourceSyncInfoMap {
private static final ResourceSyncInfo[] EMPTY = new ResourceSyncInfo[0];
private static final int INITIAL_SIZE = 8;
private ResourceSyncInfo[] elements;
private int elementsUsed;
public ResourceSyncInfoMap() {
elements = EMPTY;
elementsUsed = 0;
}
public void put(ResourceSyncInfo info) {
int element = Arrays.binarySearch(elements, info);
if (element >= 0) {
// found existing element, replace it
elements[element] = info;
} else {
// insert new element
elementsUsed += 1;
// index of new element as returned by binary search
element = -element - 1;
ResourceSyncInfo[] oldElements = elements;
if (elementsUsed > elements.length) {
// grow array
int size = elements.length * 2;
if (size < INITIAL_SIZE)
size = INITIAL_SIZE;
elements = new ResourceSyncInfo[size];
System.arraycopy(oldElements, 0, elements, 0, element);
}
System.arraycopy(
oldElements,
element,
elements,
element + 1,
elementsUsed - element - 1);
elements[element] = info;
}
}
public ResourceSyncInfo get(IResource resource) {
int element = Arrays.binarySearch(elements, new ResourceSyncInfo(resource.getName(), "","","",null,null));//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (element < 0)
return null;
// found element, return it
return elements[element];
}
public void remove(ResourceSyncInfo info) {
int element = Arrays.binarySearch(elements, info);
if (element < 0)
return;
// found element, remove it
elementsUsed -= 1;
ResourceSyncInfo[] oldElements = elements;
if (elementsUsed <= elements.length / 4
&& elements.length >= INITIAL_SIZE * 2) {
// shrink array
int size = elements.length / 2;
elements = new ResourceSyncInfo[size];
System.arraycopy(oldElements, 0, elements, 0, element);
} else {
// since we're not creating a new array, we need to clear the last element
elements[elementsUsed] = null;
}
System.arraycopy(
oldElements,
element + 1,
elements,
element,
elementsUsed - element);
}
// XXX might not even need to copy the array since EclipseSynchronizer
// is the only one who uses this and could just as well access it
// directly.
public ResourceSyncInfo[] toArray() {
ResourceSyncInfo[] infos = new ResourceSyncInfo[elementsUsed];
System.arraycopy(elements, 0, infos, 0, elementsUsed);
return infos;
}
}
|