1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.BufferOverflowException;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.ByteBuffer;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.ByteOrder;
200a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFaddenimport java.nio.CharBuffer;
210a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFaddenimport java.nio.DoubleBuffer;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.FloatBuffer;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.IntBuffer;
240a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFaddenimport java.nio.LongBuffer;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.ShortBuffer;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Main {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void main(String[] args) {
290a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        ByteBuffer buf = ByteBuffer.allocateDirect(16);
300a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        System.out.println("Direct byte buffer has array: " + buf.hasArray());
310a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
320a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        intFloatTest();
330a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        basicShortTest();
340a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        primTest();
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a buffer and fiddle with it.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void basicShortTest() {
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer directBuf = ByteBuffer.allocateDirect(64);
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //ByteBuffer directBuf = ByteBuffer.allocateDirect(65);
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ShortBuffer shortBuf = directBuf.asShortBuffer();
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        short[] myShorts = {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007,
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015,
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023,
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        shortBuf.position(0);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        shortBuf.put(myShorts, 0, 32);      // should work
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        shortBuf.position(0);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        shortBuf.put(myShorts, 16, 16);     // should work
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        shortBuf.put(myShorts, 16, 16);     // advance to end
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            shortBuf.put(myShorts, 0, 1);     // should fail
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.err.println("ERROR: out-of-bounds put succeeded\n");
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BufferOverflowException boe) {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.out.println("Got expected buffer overflow exception");
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            shortBuf.position(0);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            shortBuf.put(myShorts, 0, 33);     // should fail
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.err.println("ERROR: out-of-bounds put succeeded\n");
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IndexOutOfBoundsException ioobe) {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.out.println("Got expected out-of-bounds exception");
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            shortBuf.position(16);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            shortBuf.put(myShorts, 0, 17);     // should fail
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.err.println("ERROR: out-of-bounds put succeeded\n");
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BufferOverflowException boe) {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.out.println("Got expected buffer overflow exception");
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Try this with either floats or ints; ints fail with
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * BufferOverflowException, floats work.
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * From http://code.google.com/p/android/issues/detail?id=1585 .
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void intFloatTest() {
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer direct = ByteBuffer.allocateDirect(100);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        direct.order(ByteOrder.nativeOrder());
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        IntBuffer int1 = direct.asIntBuffer();
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int data[] = new int[25];
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //FloatBuffer int1 = direct.asFloatBuffer();
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //float data[] = new float[25];
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int1.clear ();
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int1.put (data);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int1.position (0);
99de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int1.clear ();
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int1.put (data);
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int1.position (0);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1040a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1050a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    /*
1060a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden     * Exercise all "view buffer" classes, in both byte orders.
1070a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden     */
1080a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    public static void primTest() {
1090a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        ByteBuffer directBuf = ByteBuffer.allocateDirect(36);
1100a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        directBuf.order(ByteOrder.BIG_ENDIAN);
1110a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        storeValues(directBuf);
1120a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1130a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        for (int i = 0; i < 36; i++) {
1140a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            directBuf.put(i, (byte) 0xcc);
1150a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1160a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1170a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        directBuf.order(ByteOrder.LITTLE_ENDIAN);
1180a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        storeValues(directBuf);
1190a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    }
1200a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1210a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    static void storeValues(ByteBuffer directBuf) {
1220a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        directBuf.position(0);
1230a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        ShortBuffer shortBuf = directBuf.asShortBuffer();
1240a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        CharBuffer charBuf = directBuf.asCharBuffer();
1250a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        IntBuffer intBuf = directBuf.asIntBuffer();
1260a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        FloatBuffer floatBuf = directBuf.asFloatBuffer();
1270a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        LongBuffer longBuf = directBuf.asLongBuffer();
1280a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        DoubleBuffer doubleBuf = directBuf.asDoubleBuffer();
1290a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1300a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        final byte byteValue = -5;
1310a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        final short shortValue = -1234;
1320a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        final char charValue = 49200;
1330a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        final int intValue = 0x12345678;
1340a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        final float floatValue = 3.14159f;
1350a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        final long longValue = 0x1122334455667788L;
1360a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        final double doubleValue = Double.MIN_VALUE;
1370a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1380a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (directBuf.put(1, byteValue).get(1) != byteValue) {
1390a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            throw new RuntimeException("byte get/store failed");
1400a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1410a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (shortBuf.put(1, shortValue).get(1) != shortValue) {
1420a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            throw new RuntimeException("short get/store failed");
1430a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1440a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (charBuf.put(2, charValue).get(2) != charValue) {
1450a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            throw new RuntimeException("char get/store failed");
1460a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1470a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (intBuf.put(2, intValue).get(2) != intValue) {
1480a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            throw new RuntimeException("int get/store failed");
1490a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1500a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (floatBuf.put(3, floatValue).get(3) != floatValue) {
1510a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            throw new RuntimeException("float get/store failed");
1520a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1530a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (longBuf.put(2, longValue).get(2) != longValue) {
1540a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            throw new RuntimeException("long get/store failed");
1550a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1560a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (doubleBuf.put(3, doubleValue).get(3) != doubleValue) {
1570a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            throw new RuntimeException("double get/store failed");
1580a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1590a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1600a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        directBuf.position(0);
1610a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        char[] outBuf = new char[directBuf.limit() * 2];
1620a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        for (int i = 0; i < directBuf.limit(); i++) {
1630a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            byte b = directBuf.get();
1640a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            outBuf[i*2] = hexChar((byte) ((b >> 4) & 0x0f));
1650a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            outBuf[i*2+1] = hexChar((byte) (b & 0x0f));
1660a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1670a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        System.out.println(new String(outBuf));
1680a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    }
1690a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1700a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    static char hexChar(byte b) {
1710a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        if (b < 10) {
1720a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            return (char) ('0' + b);
1730a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        } else {
1740a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            return (char) ('a' + b - 10);
1750a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
1760a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    }
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
178