Skip to content

Commit 6e9057d

Browse files
eamonnmcmanusGoogle Java Core Libraries
authored and
Google Java Core Libraries
committedMay 4, 2022
Add rotate() methods for other primitive array types, except boolean.
Also add an explanation of possible alternative algorithms, in `Ints.rotate`. RELNOTES=`primitives`: Added `rotate()` for arrays of all primitive types. PiperOrigin-RevId: 446428068
1 parent f2bb171 commit 6e9057d

32 files changed

+2582
-2
lines changed
 

‎android/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public void testStatsNoops() {
157157
assertThat(map).containsEntry(three, one);
158158
assertThat(map).containsEntry(one, two);
159159

160-
// TODO(user): Confirm with fry@ that this is a reasonable substitute.
160+
// TODO(cgruber): Confirm with fry@ that this is a reasonable substitute.
161161
// Set<Entry<Object, Object>> entries = map.entrySet();
162162
// assertThat(entries).containsExactly(
163163
// Maps.immutableEntry(three, one), Maps.immutableEntry(one, two));

‎android/guava-tests/test/com/google/common/primitives/BooleansTest.java

+231
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,237 @@ public void testReverseIndexed() {
209209
new boolean[] {true, true, false, false}, 1, 3, new boolean[] {true, false, true, false});
210210
}
211211

212+
private static void testRotate(boolean[] input, int distance, boolean[] expectedOutput) {
213+
input = Arrays.copyOf(input, input.length);
214+
Booleans.rotate(input, distance);
215+
assertThat(input).isEqualTo(expectedOutput);
216+
}
217+
218+
private static void testRotate(
219+
boolean[] input, int distance, int fromIndex, int toIndex, boolean[] expectedOutput) {
220+
input = Arrays.copyOf(input, input.length);
221+
Booleans.rotate(input, distance, fromIndex, toIndex);
222+
assertThat(input).isEqualTo(expectedOutput);
223+
}
224+
225+
public void testRotate() {
226+
testRotate(new boolean[] {}, -1, new boolean[] {});
227+
testRotate(new boolean[] {}, 0, new boolean[] {});
228+
testRotate(new boolean[] {}, 1, new boolean[] {});
229+
230+
testRotate(new boolean[] {true}, -2, new boolean[] {true});
231+
testRotate(new boolean[] {true}, -1, new boolean[] {true});
232+
testRotate(new boolean[] {true}, 0, new boolean[] {true});
233+
testRotate(new boolean[] {true}, 1, new boolean[] {true});
234+
testRotate(new boolean[] {true}, 2, new boolean[] {true});
235+
236+
testRotate(new boolean[] {true, false}, -3, new boolean[] {false, true});
237+
testRotate(new boolean[] {true, false}, -1, new boolean[] {false, true});
238+
testRotate(new boolean[] {true, false}, -2, new boolean[] {true, false});
239+
testRotate(new boolean[] {true, false}, 0, new boolean[] {true, false});
240+
testRotate(new boolean[] {true, false}, 1, new boolean[] {false, true});
241+
testRotate(new boolean[] {true, false}, 2, new boolean[] {true, false});
242+
testRotate(new boolean[] {true, false}, 3, new boolean[] {false, true});
243+
244+
testRotate(new boolean[] {true, false, true}, -5, new boolean[] {true, true, false});
245+
testRotate(new boolean[] {true, false, true}, -4, new boolean[] {false, true, true});
246+
testRotate(new boolean[] {true, false, true}, -3, new boolean[] {true, false, true});
247+
testRotate(new boolean[] {true, false, true}, -2, new boolean[] {true, true, false});
248+
testRotate(new boolean[] {true, false, true}, -1, new boolean[] {false, true, true});
249+
testRotate(new boolean[] {true, false, true}, 0, new boolean[] {true, false, true});
250+
testRotate(new boolean[] {true, false, true}, 1, new boolean[] {true, true, false});
251+
testRotate(new boolean[] {true, false, true}, 2, new boolean[] {false, true, true});
252+
testRotate(new boolean[] {true, false, true}, 3, new boolean[] {true, false, true});
253+
testRotate(new boolean[] {true, false, true}, 4, new boolean[] {true, true, false});
254+
testRotate(new boolean[] {true, false, true}, 5, new boolean[] {false, true, true});
255+
256+
testRotate(
257+
new boolean[] {true, false, true, false}, -9, new boolean[] {false, true, false, true});
258+
testRotate(
259+
new boolean[] {true, false, true, false}, -5, new boolean[] {false, true, false, true});
260+
testRotate(
261+
new boolean[] {true, false, true, false}, -1, new boolean[] {false, true, false, true});
262+
testRotate(
263+
new boolean[] {true, false, true, false}, 0, new boolean[] {true, false, true, false});
264+
testRotate(
265+
new boolean[] {true, false, true, false}, 1, new boolean[] {false, true, false, true});
266+
testRotate(
267+
new boolean[] {true, false, true, false}, 5, new boolean[] {false, true, false, true});
268+
testRotate(
269+
new boolean[] {true, false, true, false}, 9, new boolean[] {false, true, false, true});
270+
271+
testRotate(
272+
new boolean[] {true, false, true, false, true},
273+
-6,
274+
new boolean[] {false, true, false, true, true});
275+
testRotate(
276+
new boolean[] {true, false, true, false, true},
277+
-4,
278+
new boolean[] {true, true, false, true, false});
279+
testRotate(
280+
new boolean[] {true, false, true, false, true},
281+
-3,
282+
new boolean[] {false, true, true, false, true});
283+
testRotate(
284+
new boolean[] {true, false, true, false, true},
285+
-1,
286+
new boolean[] {false, true, false, true, true});
287+
testRotate(
288+
new boolean[] {true, false, true, false, true},
289+
0,
290+
new boolean[] {true, false, true, false, true});
291+
testRotate(
292+
new boolean[] {true, false, true, false, true},
293+
1,
294+
new boolean[] {true, true, false, true, false});
295+
testRotate(
296+
new boolean[] {true, false, true, false, true},
297+
3,
298+
new boolean[] {true, false, true, true, false});
299+
testRotate(
300+
new boolean[] {true, false, true, false, true},
301+
4,
302+
new boolean[] {false, true, false, true, true});
303+
testRotate(
304+
new boolean[] {true, false, true, false, true},
305+
6,
306+
new boolean[] {true, true, false, true, false});
307+
}
308+
309+
public void testRotateIndexed() {
310+
testRotate(new boolean[] {}, 0, 0, 0, new boolean[] {});
311+
312+
testRotate(new boolean[] {true}, 0, 0, 1, new boolean[] {true});
313+
testRotate(new boolean[] {true}, 1, 0, 1, new boolean[] {true});
314+
testRotate(new boolean[] {true}, 1, 1, 1, new boolean[] {true});
315+
316+
// Rotate the central 5 elements, leaving the ends as-is
317+
testRotate(
318+
new boolean[] {false, true, false, true, false, true, false},
319+
-6,
320+
1,
321+
6,
322+
new boolean[] {false, false, true, false, true, true, false});
323+
testRotate(
324+
new boolean[] {false, true, false, true, false, true, false},
325+
-1,
326+
1,
327+
6,
328+
new boolean[] {false, false, true, false, true, true, false});
329+
testRotate(
330+
new boolean[] {false, true, false, true, false, true, false},
331+
0,
332+
1,
333+
6,
334+
new boolean[] {false, true, false, true, false, true, false});
335+
testRotate(
336+
new boolean[] {false, true, false, true, false, true, false},
337+
5,
338+
1,
339+
6,
340+
new boolean[] {false, true, false, true, false, true, false});
341+
testRotate(
342+
new boolean[] {false, true, false, true, false, true, false},
343+
14,
344+
1,
345+
6,
346+
new boolean[] {false, false, true, false, true, true, false});
347+
348+
// Rotate the first three elements
349+
testRotate(
350+
new boolean[] {false, true, false, true, false, true, false},
351+
-2,
352+
0,
353+
3,
354+
new boolean[] {false, false, true, true, false, true, false});
355+
testRotate(
356+
new boolean[] {false, true, false, true, false, true, false},
357+
-1,
358+
0,
359+
3,
360+
new boolean[] {true, false, false, true, false, true, false});
361+
testRotate(
362+
new boolean[] {false, true, false, true, false, true, false},
363+
0,
364+
0,
365+
3,
366+
new boolean[] {false, true, false, true, false, true, false});
367+
testRotate(
368+
new boolean[] {false, true, false, true, false, true, false},
369+
1,
370+
0,
371+
3,
372+
new boolean[] {false, false, true, true, false, true, false});
373+
testRotate(
374+
new boolean[] {false, true, false, true, false, true, false},
375+
2,
376+
0,
377+
3,
378+
new boolean[] {true, false, false, true, false, true, false});
379+
380+
// Rotate the last four elements
381+
testRotate(
382+
new boolean[] {false, true, false, true, false, true, false},
383+
-6,
384+
3,
385+
7,
386+
new boolean[] {false, true, false, true, false, true, false});
387+
testRotate(
388+
new boolean[] {false, true, false, true, false, true, false},
389+
-5,
390+
3,
391+
7,
392+
new boolean[] {false, true, false, false, true, false, true});
393+
testRotate(
394+
new boolean[] {false, true, false, true, false, true, false},
395+
-4,
396+
3,
397+
7,
398+
new boolean[] {false, true, false, true, false, true, false});
399+
testRotate(
400+
new boolean[] {false, true, false, true, false, true, false},
401+
-3,
402+
3,
403+
7,
404+
new boolean[] {false, true, false, false, true, false, true});
405+
testRotate(
406+
new boolean[] {false, true, false, true, false, true, false},
407+
-2,
408+
3,
409+
7,
410+
new boolean[] {false, true, false, true, false, true, false});
411+
testRotate(
412+
new boolean[] {false, true, false, true, false, true, false},
413+
-1,
414+
3,
415+
7,
416+
new boolean[] {false, true, false, false, true, false, true});
417+
testRotate(
418+
new boolean[] {false, true, false, true, false, true, false},
419+
0,
420+
3,
421+
7,
422+
new boolean[] {false, true, false, true, false, true, false});
423+
testRotate(
424+
new boolean[] {false, true, false, true, false, true, false},
425+
1,
426+
3,
427+
7,
428+
new boolean[] {false, true, false, false, true, false, true});
429+
testRotate(
430+
new boolean[] {false, true, false, true, false, true, false},
431+
2,
432+
3,
433+
7,
434+
new boolean[] {false, true, false, true, false, true, false});
435+
testRotate(
436+
new boolean[] {false, true, false, true, false, true, false},
437+
3,
438+
3,
439+
7,
440+
new boolean[] {false, true, false, false, true, false, true});
441+
}
442+
212443
public void testToArray() {
213444
// need explicit type parameter to avoid javac warning!?
214445
List<Boolean> none = Arrays.<Boolean>asList();

‎android/guava-tests/test/com/google/common/primitives/BytesTest.java

+97
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,103 @@ public void testReverseIndexed() {
270270
testReverse(new byte[] {-1, 1, -2, 2}, 1, 3, new byte[] {-1, -2, 1, 2});
271271
}
272272

273+
private static void testRotate(byte[] input, int distance, byte[] expectedOutput) {
274+
input = Arrays.copyOf(input, input.length);
275+
Bytes.rotate(input, distance);
276+
assertThat(input).isEqualTo(expectedOutput);
277+
}
278+
279+
private static void testRotate(
280+
byte[] input, int distance, int fromIndex, int toIndex, byte[] expectedOutput) {
281+
input = Arrays.copyOf(input, input.length);
282+
Bytes.rotate(input, distance, fromIndex, toIndex);
283+
assertThat(input).isEqualTo(expectedOutput);
284+
}
285+
286+
public void testRotate() {
287+
testRotate(new byte[] {}, -1, new byte[] {});
288+
testRotate(new byte[] {}, 0, new byte[] {});
289+
testRotate(new byte[] {}, 1, new byte[] {});
290+
291+
testRotate(new byte[] {1}, -2, new byte[] {1});
292+
testRotate(new byte[] {1}, -1, new byte[] {1});
293+
testRotate(new byte[] {1}, 0, new byte[] {1});
294+
testRotate(new byte[] {1}, 1, new byte[] {1});
295+
testRotate(new byte[] {1}, 2, new byte[] {1});
296+
297+
testRotate(new byte[] {1, 2}, -3, new byte[] {2, 1});
298+
testRotate(new byte[] {1, 2}, -1, new byte[] {2, 1});
299+
testRotate(new byte[] {1, 2}, -2, new byte[] {1, 2});
300+
testRotate(new byte[] {1, 2}, 0, new byte[] {1, 2});
301+
testRotate(new byte[] {1, 2}, 1, new byte[] {2, 1});
302+
testRotate(new byte[] {1, 2}, 2, new byte[] {1, 2});
303+
testRotate(new byte[] {1, 2}, 3, new byte[] {2, 1});
304+
305+
testRotate(new byte[] {1, 2, 3}, -5, new byte[] {3, 1, 2});
306+
testRotate(new byte[] {1, 2, 3}, -4, new byte[] {2, 3, 1});
307+
testRotate(new byte[] {1, 2, 3}, -3, new byte[] {1, 2, 3});
308+
testRotate(new byte[] {1, 2, 3}, -2, new byte[] {3, 1, 2});
309+
testRotate(new byte[] {1, 2, 3}, -1, new byte[] {2, 3, 1});
310+
testRotate(new byte[] {1, 2, 3}, 0, new byte[] {1, 2, 3});
311+
testRotate(new byte[] {1, 2, 3}, 1, new byte[] {3, 1, 2});
312+
testRotate(new byte[] {1, 2, 3}, 2, new byte[] {2, 3, 1});
313+
testRotate(new byte[] {1, 2, 3}, 3, new byte[] {1, 2, 3});
314+
testRotate(new byte[] {1, 2, 3}, 4, new byte[] {3, 1, 2});
315+
testRotate(new byte[] {1, 2, 3}, 5, new byte[] {2, 3, 1});
316+
317+
testRotate(new byte[] {1, 2, 3, 4}, -9, new byte[] {2, 3, 4, 1});
318+
testRotate(new byte[] {1, 2, 3, 4}, -5, new byte[] {2, 3, 4, 1});
319+
testRotate(new byte[] {1, 2, 3, 4}, -1, new byte[] {2, 3, 4, 1});
320+
testRotate(new byte[] {1, 2, 3, 4}, 0, new byte[] {1, 2, 3, 4});
321+
testRotate(new byte[] {1, 2, 3, 4}, 1, new byte[] {4, 1, 2, 3});
322+
testRotate(new byte[] {1, 2, 3, 4}, 5, new byte[] {4, 1, 2, 3});
323+
testRotate(new byte[] {1, 2, 3, 4}, 9, new byte[] {4, 1, 2, 3});
324+
325+
testRotate(new byte[] {1, 2, 3, 4, 5}, -6, new byte[] {2, 3, 4, 5, 1});
326+
testRotate(new byte[] {1, 2, 3, 4, 5}, -4, new byte[] {5, 1, 2, 3, 4});
327+
testRotate(new byte[] {1, 2, 3, 4, 5}, -3, new byte[] {4, 5, 1, 2, 3});
328+
testRotate(new byte[] {1, 2, 3, 4, 5}, -1, new byte[] {2, 3, 4, 5, 1});
329+
testRotate(new byte[] {1, 2, 3, 4, 5}, 0, new byte[] {1, 2, 3, 4, 5});
330+
testRotate(new byte[] {1, 2, 3, 4, 5}, 1, new byte[] {5, 1, 2, 3, 4});
331+
testRotate(new byte[] {1, 2, 3, 4, 5}, 3, new byte[] {3, 4, 5, 1, 2});
332+
testRotate(new byte[] {1, 2, 3, 4, 5}, 4, new byte[] {2, 3, 4, 5, 1});
333+
testRotate(new byte[] {1, 2, 3, 4, 5}, 6, new byte[] {5, 1, 2, 3, 4});
334+
}
335+
336+
public void testRotateIndexed() {
337+
testRotate(new byte[] {}, 0, 0, 0, new byte[] {});
338+
339+
testRotate(new byte[] {1}, 0, 0, 1, new byte[] {1});
340+
testRotate(new byte[] {1}, 1, 0, 1, new byte[] {1});
341+
testRotate(new byte[] {1}, 1, 1, 1, new byte[] {1});
342+
343+
// Rotate the central 5 elements, leaving the ends as-is
344+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -6, 1, 6, new byte[] {0, 2, 3, 4, 5, 1, 6});
345+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -1, 1, 6, new byte[] {0, 2, 3, 4, 5, 1, 6});
346+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 0, 1, 6, new byte[] {0, 1, 2, 3, 4, 5, 6});
347+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 5, 1, 6, new byte[] {0, 1, 2, 3, 4, 5, 6});
348+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 14, 1, 6, new byte[] {0, 2, 3, 4, 5, 1, 6});
349+
350+
// Rotate the first three elements
351+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -2, 0, 3, new byte[] {2, 0, 1, 3, 4, 5, 6});
352+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -1, 0, 3, new byte[] {1, 2, 0, 3, 4, 5, 6});
353+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 0, 0, 3, new byte[] {0, 1, 2, 3, 4, 5, 6});
354+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 1, 0, 3, new byte[] {2, 0, 1, 3, 4, 5, 6});
355+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 2, 0, 3, new byte[] {1, 2, 0, 3, 4, 5, 6});
356+
357+
// Rotate the last four elements
358+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -6, 3, 7, new byte[] {0, 1, 2, 5, 6, 3, 4});
359+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -5, 3, 7, new byte[] {0, 1, 2, 4, 5, 6, 3});
360+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -4, 3, 7, new byte[] {0, 1, 2, 3, 4, 5, 6});
361+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -3, 3, 7, new byte[] {0, 1, 2, 6, 3, 4, 5});
362+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -2, 3, 7, new byte[] {0, 1, 2, 5, 6, 3, 4});
363+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, -1, 3, 7, new byte[] {0, 1, 2, 4, 5, 6, 3});
364+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 0, 3, 7, new byte[] {0, 1, 2, 3, 4, 5, 6});
365+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 1, 3, 7, new byte[] {0, 1, 2, 6, 3, 4, 5});
366+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 2, 3, 7, new byte[] {0, 1, 2, 5, 6, 3, 4});
367+
testRotate(new byte[] {0, 1, 2, 3, 4, 5, 6}, 3, 3, 7, new byte[] {0, 1, 2, 4, 5, 6, 3});
368+
}
369+
273370
@GwtIncompatible // NullPointerTester
274371
public void testNulls() {
275372
new NullPointerTester().testAllPublicStaticMethods(Bytes.class);

0 commit comments

Comments
 (0)
Please sign in to comment.