xref: /aosp_15_r20/art/test/070-nio-buffer/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker import java.nio.BufferOverflowException;
18*795d594fSAndroid Build Coastguard Worker import java.nio.ByteBuffer;
19*795d594fSAndroid Build Coastguard Worker import java.nio.ByteOrder;
20*795d594fSAndroid Build Coastguard Worker import java.nio.CharBuffer;
21*795d594fSAndroid Build Coastguard Worker import java.nio.DoubleBuffer;
22*795d594fSAndroid Build Coastguard Worker import java.nio.FloatBuffer;
23*795d594fSAndroid Build Coastguard Worker import java.nio.IntBuffer;
24*795d594fSAndroid Build Coastguard Worker import java.nio.LongBuffer;
25*795d594fSAndroid Build Coastguard Worker import java.nio.ShortBuffer;
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker public class Main {
main(String[] args)28*795d594fSAndroid Build Coastguard Worker     public static void main(String[] args) {
29*795d594fSAndroid Build Coastguard Worker         ByteBuffer buf = ByteBuffer.allocateDirect(16);
30*795d594fSAndroid Build Coastguard Worker         System.out.println("Direct byte buffer has array: " + buf.hasArray());
31*795d594fSAndroid Build Coastguard Worker 
32*795d594fSAndroid Build Coastguard Worker         intFloatTest();
33*795d594fSAndroid Build Coastguard Worker         basicShortTest();
34*795d594fSAndroid Build Coastguard Worker         primTest();
35*795d594fSAndroid Build Coastguard Worker     }
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker     /*
38*795d594fSAndroid Build Coastguard Worker      * Create a buffer and fiddle with it.
39*795d594fSAndroid Build Coastguard Worker      */
basicShortTest()40*795d594fSAndroid Build Coastguard Worker     public static void basicShortTest() {
41*795d594fSAndroid Build Coastguard Worker         ByteBuffer directBuf = ByteBuffer.allocateDirect(64);
42*795d594fSAndroid Build Coastguard Worker         //ByteBuffer directBuf = ByteBuffer.allocateDirect(65);
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker         ShortBuffer shortBuf = directBuf.asShortBuffer();
45*795d594fSAndroid Build Coastguard Worker 
46*795d594fSAndroid Build Coastguard Worker         short[] myShorts = {
47*795d594fSAndroid Build Coastguard Worker             1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007,
48*795d594fSAndroid Build Coastguard Worker             1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015,
49*795d594fSAndroid Build Coastguard Worker             1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023,
50*795d594fSAndroid Build Coastguard Worker             1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031
51*795d594fSAndroid Build Coastguard Worker         };
52*795d594fSAndroid Build Coastguard Worker 
53*795d594fSAndroid Build Coastguard Worker         shortBuf.position(0);
54*795d594fSAndroid Build Coastguard Worker         shortBuf.put(myShorts, 0, 32);      // should work
55*795d594fSAndroid Build Coastguard Worker         shortBuf.position(0);
56*795d594fSAndroid Build Coastguard Worker         shortBuf.put(myShorts, 16, 16);     // should work
57*795d594fSAndroid Build Coastguard Worker         shortBuf.put(myShorts, 16, 16);     // advance to end
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker         try {
60*795d594fSAndroid Build Coastguard Worker             shortBuf.put(myShorts, 0, 1);     // should fail
61*795d594fSAndroid Build Coastguard Worker             System.out.println("ERROR: out-of-bounds put succeeded\n");
62*795d594fSAndroid Build Coastguard Worker         } catch (BufferOverflowException boe) {
63*795d594fSAndroid Build Coastguard Worker             System.out.println("Got expected buffer overflow exception");
64*795d594fSAndroid Build Coastguard Worker         }
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker         try {
67*795d594fSAndroid Build Coastguard Worker             shortBuf.position(0);
68*795d594fSAndroid Build Coastguard Worker             shortBuf.put(myShorts, 0, 33);     // should fail
69*795d594fSAndroid Build Coastguard Worker             System.out.println("ERROR: out-of-bounds put succeeded\n");
70*795d594fSAndroid Build Coastguard Worker         } catch (IndexOutOfBoundsException ioobe) {
71*795d594fSAndroid Build Coastguard Worker             System.out.println("Got expected out-of-bounds exception");
72*795d594fSAndroid Build Coastguard Worker         }
73*795d594fSAndroid Build Coastguard Worker 
74*795d594fSAndroid Build Coastguard Worker         try {
75*795d594fSAndroid Build Coastguard Worker             shortBuf.position(16);
76*795d594fSAndroid Build Coastguard Worker             shortBuf.put(myShorts, 0, 17);     // should fail
77*795d594fSAndroid Build Coastguard Worker             System.out.println("ERROR: out-of-bounds put succeeded\n");
78*795d594fSAndroid Build Coastguard Worker         } catch (BufferOverflowException boe) {
79*795d594fSAndroid Build Coastguard Worker             System.out.println("Got expected buffer overflow exception");
80*795d594fSAndroid Build Coastguard Worker         }
81*795d594fSAndroid Build Coastguard Worker     }
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker     /*
84*795d594fSAndroid Build Coastguard Worker      * Try this with either floats or ints; ints fail with
85*795d594fSAndroid Build Coastguard Worker      * BufferOverflowException, floats work.
86*795d594fSAndroid Build Coastguard Worker      *
87*795d594fSAndroid Build Coastguard Worker      * From http://code.google.com/p/android/issues/detail?id=1585 .
88*795d594fSAndroid Build Coastguard Worker      */
intFloatTest()89*795d594fSAndroid Build Coastguard Worker     public static void intFloatTest() {
90*795d594fSAndroid Build Coastguard Worker         ByteBuffer direct = ByteBuffer.allocateDirect(100);
91*795d594fSAndroid Build Coastguard Worker         direct.order(ByteOrder.nativeOrder());
92*795d594fSAndroid Build Coastguard Worker         IntBuffer int1 = direct.asIntBuffer();
93*795d594fSAndroid Build Coastguard Worker         int data[] = new int[25];
94*795d594fSAndroid Build Coastguard Worker         //FloatBuffer int1 = direct.asFloatBuffer();
95*795d594fSAndroid Build Coastguard Worker         //float data[] = new float[25];
96*795d594fSAndroid Build Coastguard Worker         int1.clear ();
97*795d594fSAndroid Build Coastguard Worker         int1.put (data);
98*795d594fSAndroid Build Coastguard Worker         int1.position (0);
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker         int1.clear ();
101*795d594fSAndroid Build Coastguard Worker         int1.put (data);
102*795d594fSAndroid Build Coastguard Worker         int1.position (0);
103*795d594fSAndroid Build Coastguard Worker     }
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker     /*
106*795d594fSAndroid Build Coastguard Worker      * Exercise all "view buffer" classes, in both byte orders.
107*795d594fSAndroid Build Coastguard Worker      */
primTest()108*795d594fSAndroid Build Coastguard Worker     public static void primTest() {
109*795d594fSAndroid Build Coastguard Worker         ByteBuffer directBuf = ByteBuffer.allocateDirect(36);
110*795d594fSAndroid Build Coastguard Worker         directBuf.order(ByteOrder.BIG_ENDIAN);
111*795d594fSAndroid Build Coastguard Worker         storeValues(directBuf);
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 36; i++) {
114*795d594fSAndroid Build Coastguard Worker             directBuf.put(i, (byte) 0xcc);
115*795d594fSAndroid Build Coastguard Worker         }
116*795d594fSAndroid Build Coastguard Worker 
117*795d594fSAndroid Build Coastguard Worker         directBuf.order(ByteOrder.LITTLE_ENDIAN);
118*795d594fSAndroid Build Coastguard Worker         storeValues(directBuf);
119*795d594fSAndroid Build Coastguard Worker     }
120*795d594fSAndroid Build Coastguard Worker 
storeValues(ByteBuffer directBuf)121*795d594fSAndroid Build Coastguard Worker     static void storeValues(ByteBuffer directBuf) {
122*795d594fSAndroid Build Coastguard Worker         directBuf.position(0);
123*795d594fSAndroid Build Coastguard Worker         ShortBuffer shortBuf = directBuf.asShortBuffer();
124*795d594fSAndroid Build Coastguard Worker         CharBuffer charBuf = directBuf.asCharBuffer();
125*795d594fSAndroid Build Coastguard Worker         IntBuffer intBuf = directBuf.asIntBuffer();
126*795d594fSAndroid Build Coastguard Worker         FloatBuffer floatBuf = directBuf.asFloatBuffer();
127*795d594fSAndroid Build Coastguard Worker         LongBuffer longBuf = directBuf.asLongBuffer();
128*795d594fSAndroid Build Coastguard Worker         DoubleBuffer doubleBuf = directBuf.asDoubleBuffer();
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker         final byte byteValue = -5;
131*795d594fSAndroid Build Coastguard Worker         final short shortValue = -1234;
132*795d594fSAndroid Build Coastguard Worker         final char charValue = 49200;
133*795d594fSAndroid Build Coastguard Worker         final int intValue = 0x12345678;
134*795d594fSAndroid Build Coastguard Worker         final float floatValue = 3.14159f;
135*795d594fSAndroid Build Coastguard Worker         final long longValue = 0x1122334455667788L;
136*795d594fSAndroid Build Coastguard Worker         final double doubleValue = Double.MIN_VALUE;
137*795d594fSAndroid Build Coastguard Worker 
138*795d594fSAndroid Build Coastguard Worker         if (directBuf.put(1, byteValue).get(1) != byteValue) {
139*795d594fSAndroid Build Coastguard Worker             throw new RuntimeException("byte get/store failed");
140*795d594fSAndroid Build Coastguard Worker         }
141*795d594fSAndroid Build Coastguard Worker         if (shortBuf.put(1, shortValue).get(1) != shortValue) {
142*795d594fSAndroid Build Coastguard Worker             throw new RuntimeException("short get/store failed");
143*795d594fSAndroid Build Coastguard Worker         }
144*795d594fSAndroid Build Coastguard Worker         if (charBuf.put(2, charValue).get(2) != charValue) {
145*795d594fSAndroid Build Coastguard Worker             throw new RuntimeException("char get/store failed");
146*795d594fSAndroid Build Coastguard Worker         }
147*795d594fSAndroid Build Coastguard Worker         if (intBuf.put(2, intValue).get(2) != intValue) {
148*795d594fSAndroid Build Coastguard Worker             throw new RuntimeException("int get/store failed");
149*795d594fSAndroid Build Coastguard Worker         }
150*795d594fSAndroid Build Coastguard Worker         if (floatBuf.put(3, floatValue).get(3) != floatValue) {
151*795d594fSAndroid Build Coastguard Worker             throw new RuntimeException("float get/store failed");
152*795d594fSAndroid Build Coastguard Worker         }
153*795d594fSAndroid Build Coastguard Worker         if (longBuf.put(2, longValue).get(2) != longValue) {
154*795d594fSAndroid Build Coastguard Worker             throw new RuntimeException("long get/store failed");
155*795d594fSAndroid Build Coastguard Worker         }
156*795d594fSAndroid Build Coastguard Worker         if (doubleBuf.put(3, doubleValue).get(3) != doubleValue) {
157*795d594fSAndroid Build Coastguard Worker             throw new RuntimeException("double get/store failed");
158*795d594fSAndroid Build Coastguard Worker         }
159*795d594fSAndroid Build Coastguard Worker 
160*795d594fSAndroid Build Coastguard Worker         directBuf.position(0);
161*795d594fSAndroid Build Coastguard Worker         char[] outBuf = new char[directBuf.limit() * 2];
162*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < directBuf.limit(); i++) {
163*795d594fSAndroid Build Coastguard Worker             byte b = directBuf.get();
164*795d594fSAndroid Build Coastguard Worker             outBuf[i*2] = hexChar((byte) ((b >> 4) & 0x0f));
165*795d594fSAndroid Build Coastguard Worker             outBuf[i*2+1] = hexChar((byte) (b & 0x0f));
166*795d594fSAndroid Build Coastguard Worker         }
167*795d594fSAndroid Build Coastguard Worker         System.out.println(new String(outBuf));
168*795d594fSAndroid Build Coastguard Worker     }
169*795d594fSAndroid Build Coastguard Worker 
hexChar(byte b)170*795d594fSAndroid Build Coastguard Worker     static char hexChar(byte b) {
171*795d594fSAndroid Build Coastguard Worker         if (b < 10) {
172*795d594fSAndroid Build Coastguard Worker             return (char) ('0' + b);
173*795d594fSAndroid Build Coastguard Worker         } else {
174*795d594fSAndroid Build Coastguard Worker             return (char) ('a' + b - 10);
175*795d594fSAndroid Build Coastguard Worker         }
176*795d594fSAndroid Build Coastguard Worker     }
177*795d594fSAndroid Build Coastguard Worker }
178