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., 51 Franklin Street, Fifth Floor, 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()
122 int pos
= position();
125 int count
= remaining();
126 // Call shiftDown method optimized for direct buffers.
127 VMDirectByteBuffer
.shiftDown(address
, 0, pos
, count
);
139 public boolean isDirect()
144 public ByteBuffer
slice()
146 int rem
= remaining();
148 return new DirectByteBufferImpl
.ReadOnly
149 (this, VMDirectByteBuffer
.adjustAddress(address
, position()),
152 return new DirectByteBufferImpl
.ReadWrite
153 (this, VMDirectByteBuffer
.adjustAddress(address
, position()),
157 private ByteBuffer
duplicate(boolean readOnly
)
159 int pos
= position();
161 int mark
= position();
163 DirectByteBufferImpl result
;
165 result
= new DirectByteBufferImpl
.ReadOnly(this, address
, capacity(),
168 result
= new DirectByteBufferImpl
.ReadWrite(this, address
, capacity(),
173 result
.position(mark
);
175 result
.position(pos
);
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());
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());
242 public short getShort()
244 return ByteBufferHelper
.getShort(this, order());
247 public ByteBuffer
putShort(short value
)
249 ByteBufferHelper
.putShort(this, value
, order());
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());
266 return ByteBufferHelper
.getInt(this, order());
269 public ByteBuffer
putInt(int value
)
271 ByteBufferHelper
.putInt(this, value
, order());
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());
286 public long getLong()
288 return ByteBufferHelper
.getLong(this, order());
291 public ByteBuffer
putLong(long value
)
293 ByteBufferHelper
.putLong(this, value
, order());
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());
308 public float getFloat()
310 return ByteBufferHelper
.getFloat(this, order());
313 public ByteBuffer
putFloat(float value
)
315 ByteBufferHelper
.putFloat(this, value
, order());
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());
330 public double getDouble()
332 return ByteBufferHelper
.getDouble(this, order());
335 public ByteBuffer
putDouble(double value
)
337 ByteBufferHelper
.putDouble(this, value
, order());
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());
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();