Skip to content

Commit c158063

Browse files
authored
Add getAndSet to Objectarray (#114200)
This commit adds a getAndSet implementation to the ObjectArray API and changes the set method to return void.
1 parent c4731aa commit c158063

File tree

7 files changed

+36
-11
lines changed

7 files changed

+36
-11
lines changed

server/src/main/java/org/elasticsearch/common/util/BigArrays.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,13 @@ public T get(long index) {
452452
}
453453

454454
@Override
455-
public T set(long index, T value) {
455+
public void set(long index, T value) {
456+
assert index >= 0 && index < size();
457+
array[(int) index] = value;
458+
}
459+
460+
@Override
461+
public T getAndSet(long index, T value) {
456462
assert index >= 0 && index < size();
457463
@SuppressWarnings("unchecked")
458464
T ret = (T) array[(int) index];

server/src/main/java/org/elasticsearch/common/util/BigObjectArray.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,15 @@ public T get(long index) {
4646
}
4747

4848
@Override
49-
public T set(long index, T value) {
49+
public void set(long index, T value) {
50+
final int pageIndex = pageIndex(index);
51+
final int indexInPage = indexInPage(index);
52+
final Object[] page = pages[pageIndex];
53+
page[indexInPage] = value;
54+
}
55+
56+
@Override
57+
public T getAndSet(long index, T value) {
5058
final int pageIndex = pageIndex(index);
5159
final int indexInPage = indexInPage(index);
5260
final Object[] page = pages[pageIndex];

server/src/main/java/org/elasticsearch/common/util/LongObjectPagedHashMap.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public T put(long key, T value) {
7777
*/
7878
public T remove(long key) {
7979
for (long i = slot(hash(key), mask);; i = nextSlot(i, mask)) {
80-
final T previous = values.set(i, null);
80+
final T previous = values.getAndSet(i, null);
8181
if (previous == null) {
8282
return null;
8383
} else if (keys.get(i) == key) {
@@ -98,7 +98,7 @@ private T set(long key, T value) {
9898
throw new IllegalArgumentException("Null values are not supported");
9999
}
100100
for (long i = slot(hash(key), mask);; i = nextSlot(i, mask)) {
101-
final T previous = values.set(i, value);
101+
final T previous = values.getAndSet(i, value);
102102
if (previous == null) {
103103
// slot was free
104104
keys.set(i, key);
@@ -180,7 +180,7 @@ protected boolean used(long bucket) {
180180
@Override
181181
protected void removeAndAdd(long index) {
182182
final long key = keys.get(index);
183-
final T value = values.set(index, null);
183+
final T value = values.getAndSet(index, null);
184184
--size;
185185
final T removed = set(key, value);
186186
assert removed == null;

server/src/main/java/org/elasticsearch/common/util/ObjectArray.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ public interface ObjectArray<T> extends BigArray {
1919
*/
2020
T get(long index);
2121

22+
/**
23+
* Set a value at the given index.
24+
*/
25+
void set(long index, T value);
26+
2227
/**
2328
* Set a value at the given index and return the previous value.
2429
*/
25-
T set(long index, T value);
30+
T getAndSet(long index, T value);
2631

2732
}

server/src/main/java/org/elasticsearch/common/util/ObjectObjectPagedHashMap.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public V put(K key, V value) {
8282
public V remove(K key) {
8383
final long slot = slot(key.hashCode(), mask);
8484
for (long index = slot;; index = nextSlot(index, mask)) {
85-
final V previous = values.set(index, null);
85+
final V previous = values.getAndSet(index, null);
8686
if (previous == null) {
8787
return null;
8888
} else if (keys.get(index).equals(key)) {
@@ -104,7 +104,7 @@ private V set(K key, int code, V value) {
104104
assert size < maxSize;
105105
final long slot = slot(code, mask);
106106
for (long index = slot;; index = nextSlot(index, mask)) {
107-
final V previous = values.set(index, value);
107+
final V previous = values.getAndSet(index, value);
108108
if (previous == null) {
109109
// slot was free
110110
keys.set(index, key);
@@ -186,7 +186,7 @@ protected boolean used(long bucket) {
186186
@Override
187187
protected void removeAndAdd(long index) {
188188
final K key = keys.get(index);
189-
final V value = values.set(index, null);
189+
final V value = values.getAndSet(index, null);
190190
--size;
191191
final V removed = set(key, key.hashCode(), value);
192192
assert removed == null;

server/src/test/java/org/elasticsearch/common/util/BigArraysTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ public void testObjectArrayGrowth() {
135135
ref[i] = randomFrom(pool);
136136
array = bigArrays.grow(array, i + 1);
137137
array.set(i, ref[i]);
138+
assertEquals(ref[i], array.getAndSet(i, ref[i]));
138139
}
139140
for (int i = 0; i < totalLen; ++i) {
140141
assertSame(ref[i], array.get(i));

test/framework/src/main/java/org/elasticsearch/common/util/MockBigArrays.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -695,8 +695,13 @@ public T get(long index) {
695695
}
696696

697697
@Override
698-
public T set(long index, T value) {
699-
return in.set(index, value);
698+
public void set(long index, T value) {
699+
in.set(index, value);
700+
}
701+
702+
@Override
703+
public T getAndSet(long index, T value) {
704+
return in.getAndSet(index, value);
700705
}
701706

702707
@Override

0 commit comments

Comments
 (0)