KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > imagero > uio > buffer > arrays > LongArrayBufferManager


1 /*
2  * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
3  *
4  * http://uio.imagero.com
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * o Redistributions of source code must retain the above copyright notice,
10  * this list of conditions and the following disclaimer.
11  *
12  * o Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  *
16  * o Neither the name of imagero Andrei Kouznetsov nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */

32 package com.imagero.uio.buffer.arrays;
33
34
35 import com.imagero.uio.buffer.MemoryAccessManager;
36
37 /**
38  * Gives possibility to read and write a long array using RandomAccess interface
39  *
40  * @author Andrei Kouznetsov
41  * Date: 01.06.2004
42  * Time: 22:35:58
43  */

44 public class LongArrayBufferManager extends AbstractArrayBufferManager {
45
46     long[] data;
47
48     /**
49      * Create LongArrayBufferManager with standard tile size
50      *
51      * @param data int array
52      */

53     public LongArrayBufferManager(long[] data) {
54         this(data, Math.min(TILE_SIZE, data.length));
55     }
56
57     /**
58      * @param data int array
59      * @param size tile length (for Buffer)
60      */

61     public LongArrayBufferManager(long[] data, int size) {
62         this(data, 0, data.length, size);
63     }
64
65     /**
66      * @param data int array
67      * @param offset start offset in <code>data</code>
68      * @param length length to read
69      */

70     public LongArrayBufferManager(long[] data, int offset, int length) {
71         this(data, offset, length, TILE_SIZE);
72     }
73
74     /**
75      * @param data int array
76      * @param offset start offset in <code>data</code>
77      * @param length length to read
78      * @param size tile length (for Buffer)
79      */

80     public LongArrayBufferManager(long[] data, int offset, int length, int size) {
81         this.data = data;
82         this.tileSize = size;
83         this.unitSize = 8;
84         this.length = length;
85         this.offset = offset;
86         accessManager = MemoryAccessManager.createMemoryAccessManager();
87     }
88
89     /**
90      * write appropriate unit (int) in LITTLE_ENDIAN order
91      *
92      * @param source source byte array
93      * @param sourceOffset offset in source array
94      * @param destOffset offset in destination array
95      *
96      * @return new offset in source array (for next writeUnitXX)
97      */

98     protected int writeUnitBE(byte[] source, int sourceOffset, int destOffset) {
99         long v = ((long) (source[sourceOffset++] & 0xFF) << 56)
100                 | ((long) (source[sourceOffset++] & 0xFF) << 48)
101                 | ((long) (source[sourceOffset++] & 0xFF) << 40)
102                 | ((long) (source[sourceOffset++] & 0xFF) << 32)
103                 | ((long) (source[sourceOffset++] & 0xFF) << 24)
104                 | ((long) (source[sourceOffset++] & 0xFF) << 16)
105                 | ((long) (source[sourceOffset++] & 0xFF) << 8)
106                 | (source[sourceOffset++] & 0xFF);
107
108         data[destOffset] = v;
109         return sourceOffset;
110     }
111
112     /**
113      * write appropriate unit (int) in BIG_ENDIAN order
114      *
115      * @param source source byte array
116      * @param sourceOffset offset in source array
117      * @param destOffset offset in destination array
118      *
119      * @return new offset in source array (for next writeUnitXX)
120      */

121     protected int writeUnitLE(byte[] source, int sourceOffset, int destOffset) {
122         long v = (source[sourceOffset++] & 0xFF)
123                 | ((long) (source[sourceOffset++] & 0xFF) << 8)
124                 | ((long) (source[sourceOffset++] & 0xFF) << 16)
125                 | ((long) (source[sourceOffset++] & 0xFF) << 24)
126                 | ((long) (source[sourceOffset++] & 0xFF) << 32)
127                 | ((long) (source[sourceOffset++] & 0xFF) << 40)
128                 | ((long) (source[sourceOffset++] & 0xFF) << 48)
129                 | ((long) (source[sourceOffset++] & 0xFF) << 56);
130         data[destOffset] = v;
131         return sourceOffset;
132     }
133
134     /**
135      * read unit (int) in BIG_ENDIAN order
136      *
137      * @param offset offset in source array
138      * @param dest byte array (destination)
139      * @param destOffset offset in destination array
140      *
141      * @return offset in destination array (updated)
142      */

143     protected int readUnitLE(int offset, byte[] dest, int destOffset) {
144         long v = data[offset];
145         dest[destOffset++] = (byte) (v & 0xFF);
146         dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
147         dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
148         dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
149         dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
150         dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
151         dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
152         dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
153
154         return destOffset;
155     }
156
157     /**
158      * read appropriate unit (int) in LITTLE_ENDIAN order
159      *
160      * @param offset offset in source array
161      * @param dest byte array (destination)
162      * @param destOffset offset in destination array
163      *
164      * @return offset in destination array (updated)
165      */

166     protected int readUnitBE(int offset, byte[] dest, int destOffset) {
167         long v = data[offset];
168         dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
169         dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
170         dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
171         dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
172         dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
173         dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
174         dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
175         dest[destOffset++] = (byte) (v & 0xFF);
176
177         return destOffset;
178     }
179
180 // public static void main(String[] args) throws IOException {
181
// int unitSize = 8;
182
// long[] a = new long[2];
183
// byte[] b = new byte[]{
184
// (byte) 0xEE, (byte) 0xDD, (byte) 0xCC, (byte) 0xBB, (byte) 0xAA, (byte) 0x99, (byte) 0x88, 0x77,
185
// (byte) 0xEE, (byte) 0xDD, (byte) 0xCC, (byte) 0xBB, (byte) 0xAA, (byte) 0x99, (byte) 0x88, 0x77};
186
//
187
// DataInputStream dis = new DataInputStream(new ByteArrayInputStream(b));
188
// a[0] = dis.readLong();
189
// a[1] = dis.readLong();
190
//
191
// Sys.out.println("b");
192
// AbstractArrayBufferManager.printHex(b);
193
//
194
// Sys.out.println("a");
195
// AbstractArrayBufferManager.printHex(a);
196
//
197
// LongArrayBufferManager iadsm = new LongArrayBufferManager(a, a.length);
198
//
199
// byte[] bLE = new byte[unitSize * a.length];
200
// iadsm.readLE(bLE, 0);
201
// Sys.out.println("bLE");
202
// AbstractArrayBufferManager.printHex(bLE);
203
//
204
// RandomAccessRO r0 = new RandomAccessByteArray(bLE, RandomAccessFactory.LITTLE_ENDIAN);
205
// long[] aLE = new long[a.length];
206
// r0.readFully(aLE);
207
//
208
// Sys.out.println("aLE");
209
// AbstractArrayBufferManager.printHex(aLE);
210
//
211
//
212
// byte[] bBE = new byte[unitSize * a.length];
213
// iadsm.readBE(bBE, 0);
214
//
215
// Sys.out.println("bBE");
216
// AbstractArrayBufferManager.printHex(bBE);
217
//
218
// RandomAccessRO r1 = new RandomAccessByteArray(bBE, RandomAccessFactory.BIG_ENDIAN);
219
// long[] aBE = new long[a.length];
220
// r1.readFully(aBE);
221
//
222
// Sys.out.println("aBE");
223
// AbstractArrayBufferManager.printHex(aBE);
224
//
225
// }
226
}
227
Popular Tags