Merge from mainline (gomp-merge-2005-02-26).
[official-gcc.git] / libjava / java / nio / MappedByteBufferImpl.java
blobfdb64c5bb0f115baed244c05ac4e6a0a6b52e07c
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)
9 any later version.
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
19 02111-1307 USA.
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
24 combination.
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. */
39 package java.nio;
41 import gnu.gcj.RawData;
43 import java.io.IOException;
45 final class MappedByteBufferImpl extends MappedByteBuffer
47 boolean readOnly;
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. */
54 public long implLen;
56 public MappedByteBufferImpl(RawData address, int size, boolean readOnly)
57 throws IOException
59 super(size, size, 0, -1);
60 this.address = address;
61 this.readOnly = readOnly;
64 public boolean isReadOnly()
66 return readOnly;
69 public byte get()
71 checkForUnderflow();
73 int pos = position();
74 byte result = VMDirectByteBuffer.get(address, pos);
75 position(pos + 1);
76 return result;
79 public ByteBuffer put(byte value)
81 checkIfReadOnly();
82 checkForOverflow();
84 int pos = position();
85 VMDirectByteBuffer.put(address, pos, value);
86 position(pos + 1);
87 return this;
90 public byte get(int index)
92 checkIndex(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);
106 return this;
109 public ByteBuffer put(int index, byte value)
111 checkIfReadOnly();
112 checkIndex(index);
114 VMDirectByteBuffer.put(address, index, value);
115 return this;
118 public ByteBuffer compact()
120 checkIfReadOnly();
121 mark = -1;
122 int pos = position();
123 if (pos > 0)
125 int count = remaining();
126 // Call shiftDown method optimized for direct buffers.
127 VMDirectByteBuffer.shiftDown(address, 0, pos, count);
128 position(count);
129 limit(capacity());
131 else
133 position(limit());
134 limit(capacity());
136 return this;
139 public boolean isDirect()
141 return true;
144 public ByteBuffer slice()
146 int rem = remaining();
147 if (isReadOnly())
148 return new DirectByteBufferImpl.ReadOnly
149 (this, VMDirectByteBuffer.adjustAddress(address, position()),
150 rem, rem, 0);
151 else
152 return new DirectByteBufferImpl.ReadWrite
153 (this, VMDirectByteBuffer.adjustAddress(address, position()),
154 rem, rem, 0);
157 private ByteBuffer duplicate(boolean readOnly)
159 int pos = position();
160 reset();
161 int mark = position();
162 position(pos);
163 DirectByteBufferImpl result;
164 if (readOnly)
165 result = new DirectByteBufferImpl.ReadOnly(this, address, capacity(),
166 limit(), pos);
167 else
168 result = new DirectByteBufferImpl.ReadWrite(this, address, capacity(),
169 limit(), pos);
171 if (mark != pos)
173 result.position(mark);
174 result.mark();
175 result.position(pos);
177 return result;
180 public ByteBuffer duplicate()
182 return duplicate(isReadOnly());
185 public ByteBuffer asReadOnlyBuffer()
187 return duplicate(true);
190 public CharBuffer asCharBuffer()
192 return new CharViewBufferImpl(this, remaining() >> 1);
195 public ShortBuffer asShortBuffer()
197 return new ShortViewBufferImpl(this, remaining() >> 1);
200 public IntBuffer asIntBuffer()
202 return new IntViewBufferImpl(this, remaining() >> 2);
205 public LongBuffer asLongBuffer()
207 return new LongViewBufferImpl(this, remaining() >> 3);
210 public FloatBuffer asFloatBuffer()
212 return new FloatViewBufferImpl(this, remaining() >> 2);
215 public DoubleBuffer asDoubleBuffer()
217 return new DoubleViewBufferImpl(this, remaining() >> 3);
220 public char getChar()
222 return ByteBufferHelper.getChar(this, order());
225 public ByteBuffer putChar(char value)
227 ByteBufferHelper.putChar(this, value, order());
228 return this;
231 public char getChar(int index)
233 return ByteBufferHelper.getChar(this, index, order());
236 public ByteBuffer putChar(int index, char value)
238 ByteBufferHelper.putChar(this, index, value, order());
239 return this;
242 public short getShort()
244 return ByteBufferHelper.getShort(this, order());
247 public ByteBuffer putShort(short value)
249 ByteBufferHelper.putShort(this, value, order());
250 return this;
253 public short getShort(int index)
255 return ByteBufferHelper.getShort(this, index, order());
258 public ByteBuffer putShort(int index, short value)
260 ByteBufferHelper.putShort(this, index, value, order());
261 return this;
264 public int getInt()
266 return ByteBufferHelper.getInt(this, order());
269 public ByteBuffer putInt(int value)
271 ByteBufferHelper.putInt(this, value, order());
272 return this;
275 public int getInt(int index)
277 return ByteBufferHelper.getInt(this, index, order());
280 public ByteBuffer putInt(int index, int value)
282 ByteBufferHelper.putInt(this, index, value, order());
283 return this;
286 public long getLong()
288 return ByteBufferHelper.getLong(this, order());
291 public ByteBuffer putLong(long value)
293 ByteBufferHelper.putLong(this, value, order());
294 return this;
297 public long getLong(int index)
299 return ByteBufferHelper.getLong(this, index, order());
302 public ByteBuffer putLong(int index, long value)
304 ByteBufferHelper.putLong(this, index, value, order());
305 return this;
308 public float getFloat()
310 return ByteBufferHelper.getFloat(this, order());
313 public ByteBuffer putFloat(float value)
315 ByteBufferHelper.putFloat(this, value, order());
316 return this;
319 public float getFloat(int index)
321 return ByteBufferHelper.getFloat(this, index, order());
324 public ByteBuffer putFloat(int index, float value)
326 ByteBufferHelper.putFloat(this, index, value, order());
327 return this;
330 public double getDouble()
332 return ByteBufferHelper.getDouble(this, order());
335 public ByteBuffer putDouble(double value)
337 ByteBufferHelper.putDouble(this, value, order());
338 return this;
341 public double getDouble(int index)
343 return ByteBufferHelper.getDouble(this, index, order());
346 public ByteBuffer putDouble(int index, double value)
348 ByteBufferHelper.putDouble(this, index, value, order());
349 return this;
352 // NOTE: In libgcj these methods are implemented in natFileChannelXxx.cc,
353 // because they're small, and to put them next to FileChannelImpl::mapImpl.
354 native void unmapImpl();
355 native boolean isLoadedImpl();
356 // FIXME: Try to load all pages into memory.
357 native void loadImpl();
359 native void forceImpl();