KickJava   Java API By Example, From Geeks To Geeks.

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


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 import com.imagero.uio.buffer.MemoryAccessManager;
35
36
37 /**
38  * Gives possibility to read and write an double array using RandomAccess interface
39  *
40  * @author Andrei Kouznetsov
41  * Date: 01.06.2004
42  * Time: 22:35:58
43  */

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

53     public DoubleArrayBufferManager(double[] data) {
54         this(data, Math.min(TILE_SIZE, data.length));
55     }
56
57     /**
58      * Create FloatArrayBufferManager with specified tile size
59      *
60      * @param data int array
61      * @param size tile length (for Buffer)
62      */

63     public DoubleArrayBufferManager(double[] data, int size) {
64         this(data, 0, data.length, size);
65     }
66
67     /**
68      * Create FloatArrayBufferManager with standard tile size
69      *
70      * @param data int array
71      * @param offset start offset in <code>data</code>
72      * @param length length to read
73      */

74     public DoubleArrayBufferManager(double[] data, int offset, int length) {
75         this(data, offset, length, TILE_SIZE);
76     }
77
78     /**
79      * Create FloatArrayBufferManager with specified tile size
80      *
81      * @param data int array
82      * @param offset start offset in <code>data</code>
83      * @param length length to read
84      * @param size tile length (for Buffer)
85      */

86     public DoubleArrayBufferManager(double[] data, int offset, int length, int size) {
87         this.data = data;
88         this.tileSize = size;
89         this.unitSize = 8;
90         this.length = length;
91         this.offset = offset;
92         accessManager = MemoryAccessManager.createMemoryAccessManager();
93     }
94
95     /**
96      * write appropriate unit (int) in LITTLE_ENDIAN order
97      *
98      * @param source source byte array
99      * @param sourceOffset offset in source array
100      * @param destOffset offset in destination array
101      *
102      * @return new offset in source array (for next writeUnitXX)
103      */

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

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

148     protected int readUnitBE(int offset, byte[] dest, int destOffset) {
149         double d = data[offset];
150         long v = Double.doubleToLongBits(d);
151         dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
152         dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
153         dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
154         dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
155         dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
156         dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
157         dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
158         dest[destOffset++] = (byte) (v & 0xFF);
159         return destOffset;
160     }
161
162     /**
163      * read appropriate unit (int) in LITTLE_ENDIAN order
164      *
165      * @param offset offset in source array
166      * @param dest byte array (destination)
167      * @param destOffset offset in destination array
168      *
169      * @return offset in destination array (updated)
170      */

171     protected int readUnitLE(int offset, byte[] dest, int destOffset) {
172         double d = data[offset];
173         long v = Double.doubleToLongBits(d);
174         dest[destOffset++] = (byte) (v & 0xFF);
175         dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
176         dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
177         dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
178         dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
179         dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
180         dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
181         dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
182         return destOffset;
183     }
184 }
185
Popular Tags