blob: d9b61e7acf962edba76f83cf22fa7bb86dd71142 [file] [log] [blame]
jeffhao5d1ac922011-09-29 17:41:15 -07001/*
2 * Copyright (C) 2007 The Android Open Source Project
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
17import java.util.Arrays;
18
19/**
20 * System.arraycopy cases
21 */
22public class Main {
23 public static void main(String args[]) {
24 testObjectCopy();
25 testOverlappingMoves();
Andreas Gampec952ac92015-07-16 17:41:25 -070026 testFloatAndDouble();
jeffhao5d1ac922011-09-29 17:41:15 -070027 }
28
29 public static void testObjectCopy() {
30 String[] stringArray = new String[8];
31 Object[] objectArray = new Object[8];
32
33 for (int i = 0; i < stringArray.length; i++)
34 stringArray[i] = new String(Integer.toString(i));
35
36 System.out.println("string -> object");
37 System.arraycopy(stringArray, 0, objectArray, 0, stringArray.length);
38 System.out.println("object -> string");
39 System.arraycopy(objectArray, 0, stringArray, 0, stringArray.length);
40 System.out.println("object -> string (modified)");
41 objectArray[4] = new ImplA();
42 try {
43 System.arraycopy(objectArray, 0, stringArray, 0,stringArray.length);
44 }
45 catch (ArrayStoreException ase) {
46 System.out.println("caught ArrayStoreException (expected)");
47 }
48 }
49
50 static final int ARRAY_SIZE = 8;
51
52 static void initByteArray(byte[] array) {
53 for (int i = 0; i < ARRAY_SIZE; i++) {
54 array[i] = (byte) i;
55 }
56 }
57 static void initShortArray(short[] array) {
58 for (int i = 0; i < ARRAY_SIZE; i++) {
59 array[i] = (short) i;
60 }
61 }
62 static void initIntArray(int[] array) {
63 for (int i = 0; i < ARRAY_SIZE; i++) {
64 array[i] = (int) i;
65 }
66 }
67 static void initLongArray(long[] array) {
68 for (int i = 0; i < ARRAY_SIZE; i++) {
69 array[i] = (long) i;
70 }
71 }
Scott Wakelingd3d0da52016-02-29 15:17:20 +000072 static void initCharArray(char[] array) {
73 for (int i = 0; i < ARRAY_SIZE; i++) {
74 array[i] = (char) i;
75 }
76 }
jeffhao5d1ac922011-09-29 17:41:15 -070077
78 /*
79 * Perform an array copy operation on primitive arrays with different
80 * element widths.
81 */
82 static void makeCopies(int srcPos, int dstPos, int length) {
83 byte[] byteArray = new byte[ARRAY_SIZE];
84 short[] shortArray = new short[ARRAY_SIZE];
85 int[] intArray = new int[ARRAY_SIZE];
86 long[] longArray = new long[ARRAY_SIZE];
Scott Wakelingd3d0da52016-02-29 15:17:20 +000087 char[] charArray = new char[ARRAY_SIZE];
jeffhao5d1ac922011-09-29 17:41:15 -070088
89 initByteArray(byteArray);
90 initShortArray(shortArray);
91 initIntArray(intArray);
92 initLongArray(longArray);
Scott Wakelingd3d0da52016-02-29 15:17:20 +000093 initCharArray(charArray);
jeffhao5d1ac922011-09-29 17:41:15 -070094
95 System.arraycopy(byteArray, srcPos, byteArray, dstPos, length);
96 System.arraycopy(shortArray, srcPos, shortArray, dstPos, length);
97 System.arraycopy(intArray, srcPos, intArray, dstPos, length);
98 System.arraycopy(longArray, srcPos, longArray, dstPos, length);
Scott Wakelingd3d0da52016-02-29 15:17:20 +000099 System.arraycopy(charArray, srcPos, charArray, dstPos, length);
jeffhao5d1ac922011-09-29 17:41:15 -0700100
101 for (int i = 0; i < ARRAY_SIZE; i++) {
102 if (intArray[i] != byteArray[i]) {
103 System.out.println("mismatch int vs byte at " + i + " : " +
104 Arrays.toString(byteArray));
105 break;
106 } else if (intArray[i] != shortArray[i]) {
107 System.out.println("mismatch int vs short at " + i + " : " +
108 Arrays.toString(shortArray));
109 break;
110 } else if (intArray[i] != longArray[i]) {
111 System.out.println("mismatch int vs long at " + i + " : " +
112 Arrays.toString(longArray));
113 break;
Scott Wakelingd3d0da52016-02-29 15:17:20 +0000114 } else if (intArray[i] != charArray[i]) {
115 System.out.println("mismatch int vs char at " + i + " : " +
116 Arrays.toString(charArray));
117 break;
jeffhao5d1ac922011-09-29 17:41:15 -0700118 }
119 }
120
121 System.out.println("copy: " + srcPos + "," + dstPos + "," + length +
122 ": " + Arrays.toString(intArray));
123 }
124
125 public static void testOverlappingMoves() {
126 /* do nothing */
127 makeCopies(0, 0, 0);
128
129 /* do more nothing */
130 makeCopies(0, 0, ARRAY_SIZE);
131
132 /* copy forward, even alignment */
133 makeCopies(0, 2, 4);
134
135 /* copy backward, even alignment */
136 makeCopies(2, 0, 4);
137
138 /* copy forward, odd alignment */
139 makeCopies(1, 3, 4);
140
141 /* copy backward, odd alignment */
142 makeCopies(3, 1, 4);
143
144 /* copy backward, odd length */
145 makeCopies(3, 1, 5);
146
147 /* copy forward, odd length */
148 makeCopies(1, 3, 5);
149
150 /* copy forward, mixed alignment */
151 makeCopies(0, 3, 5);
152
153 /* copy backward, mixed alignment */
154 makeCopies(3, 0, 5);
155
156 /* copy forward, mixed alignment, trivial length */
157 makeCopies(0, 5, 1);
158 }
Andreas Gampec952ac92015-07-16 17:41:25 -0700159
160 private static void testFloatAndDouble() {
161 // Float & double copies have the same implementation as int & long. However, there are
162 // protective DCHECKs in the code (there is nothing unifying like ByteSizedArray or
163 // ShortSizedArray). Just test that we don't fail those checks.
164 final int len = 10;
165 System.arraycopy(new float[len], 0, new float[len], 0, len);
166 System.arraycopy(new double[len], 0, new double[len], 0, len);
167 }
jeffhao5d1ac922011-09-29 17:41:15 -0700168}