1 /* MappedByteBufferImpl.java --
2 Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
41 import gnu.gcj.RawData;
43 import java.io.IOException;
45 final class MappedByteBufferImpl extends MappedByteBuffer
49 /** Posix uses this for the pointer returned by mmap;
50 * Win32 uses it for the pointer returned by MapViewOfFile. */
51 public RawData implPtr;
52 /** Posix uses this for the actual length passed to mmap;
53 * Win32 uses it for the pointer returned by CreateFileMapping. */
56 public MappedByteBufferImpl(RawData address, int size, boolean readOnly)
59 super(size, size, 0, -1);
60 this.address = address;
61 this.readOnly = readOnly;
64 public boolean isReadOnly()
74 byte result = VMDirectByteBuffer.get(address, pos);
79 public ByteBuffer put(byte value)
85 VMDirectByteBuffer.put(address, pos, value);
90 public byte get(int index)
94 return VMDirectByteBuffer.get(address, index);
97 public ByteBuffer get(byte[] dst, int offset, int length)
99 checkArraySize(dst.length, offset, length);
100 checkForUnderflow(length);
102 int index = position();
103 VMDirectByteBuffer.get(address, index, dst, offset, length);
104 position(index+length);
109 public ByteBuffer put(int index, byte value)
114 VMDirectByteBuffer.put(address, index, value);
118 public ByteBuffer compact()
120 int pos = position();
123 int count = remaining();
124 // Call shiftDown method optimized for direct buffers.
125 VMDirectByteBuffer.shiftDown(address, 0, pos, count);
132 public boolean isDirect()
137 public ByteBuffer slice()
139 int rem = remaining();
141 return new DirectByteBufferImpl.ReadOnly
142 (this, VMDirectByteBuffer.adjustAddress(address, position()),
145 return new DirectByteBufferImpl.ReadWrite
146 (this, VMDirectByteBuffer.adjustAddress(address, position()),
150 private ByteBuffer duplicate(boolean readOnly)
152 int pos = position();
154 int mark = position();
156 DirectByteBufferImpl result;
158 result = new DirectByteBufferImpl.ReadOnly(this, address, capacity(),
161 result = new DirectByteBufferImpl.ReadWrite(this, address, capacity(),
166 result.position(mark);
168 result.position(pos);
173 public ByteBuffer duplicate()
175 return duplicate(isReadOnly());
178 public ByteBuffer asReadOnlyBuffer()
180 return duplicate(true);
183 public CharBuffer asCharBuffer()
185 return new CharViewBufferImpl(this, remaining() >> 1);
188 public ShortBuffer asShortBuffer()
190 return new ShortViewBufferImpl(this, remaining() >> 1);
193 public IntBuffer asIntBuffer()
195 return new IntViewBufferImpl(this, remaining() >> 2);
198 public LongBuffer asLongBuffer()
200 return new LongViewBufferImpl(this, remaining() >> 3);
203 public FloatBuffer asFloatBuffer()
205 return new FloatViewBufferImpl(this, remaining() >> 2);
208 public DoubleBuffer asDoubleBuffer()
210 return new DoubleViewBufferImpl(this, remaining() >> 3);
213 public char getChar()
215 return ByteBufferHelper.getChar(this, order());
218 public ByteBuffer putChar(char value)
220 ByteBufferHelper.putChar(this, value, order());
224 public char getChar(int index)
226 return ByteBufferHelper.getChar(this, index, order());
229 public ByteBuffer putChar(int index, char value)
231 ByteBufferHelper.putChar(this, index, value, order());
235 public short getShort()
237 return ByteBufferHelper.getShort(this, order());
240 public ByteBuffer putShort(short value)
242 ByteBufferHelper.putShort(this, value, order());
246 public short getShort(int index)
248 return ByteBufferHelper.getShort(this, index, order());
251 public ByteBuffer putShort(int index, short value)
253 ByteBufferHelper.putShort(this, index, value, order());
259 return ByteBufferHelper.getInt(this, order());
262 public ByteBuffer putInt(int value)
264 ByteBufferHelper.putInt(this, value, order());
268 public int getInt(int index)
270 return ByteBufferHelper.getInt(this, index, order());
273 public ByteBuffer putInt(int index, int value)
275 ByteBufferHelper.putInt(this, index, value, order());
279 public long getLong()
281 return ByteBufferHelper.getLong(this, order());
284 public ByteBuffer putLong(long value)
286 ByteBufferHelper.putLong(this, value, order());
290 public long getLong(int index)
292 return ByteBufferHelper.getLong(this, index, order());
295 public ByteBuffer putLong(int index, long value)
297 ByteBufferHelper.putLong(this, index, value, order());
301 public float getFloat()
303 return ByteBufferHelper.getFloat(this, order());
306 public ByteBuffer putFloat(float value)
308 ByteBufferHelper.putFloat(this, value, order());
312 public float getFloat(int index)
314 return ByteBufferHelper.getFloat(this, index, order());
317 public ByteBuffer putFloat(int index, float value)
319 ByteBufferHelper.putFloat(this, index, value, order());
323 public double getDouble()
325 return ByteBufferHelper.getDouble(this, order());
328 public ByteBuffer putDouble(double value)
330 ByteBufferHelper.putDouble(this, value, order());
334 public double getDouble(int index)
336 return ByteBufferHelper.getDouble(this, index, order());
339 public ByteBuffer putDouble(int index, double value)
341 ByteBufferHelper.putDouble(this, index, value, order());
345 // NOTE: In libgcj these methods are implemented in natFileChannelXxx.cc,
346 // because they're small, and to put them next to FileChannelImpl::mapImpl.
347 native void unmapImpl();
348 native boolean isLoadedImpl();
349 // FIXME: Try to load all pages into memory.
350 native void loadImpl();
352 native void forceImpl();