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
47 private final 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. */
56 public MappedByteBufferImpl(RawData address
, int size
, boolean readOnly
)
59 super(size
, size
, 0, -1, address
);
60 this.readOnly
= readOnly
;
63 public boolean isReadOnly()
73 byte result
= VMDirectByteBuffer
.get(address
, pos
);
78 public ByteBuffer
put(byte value
)
84 VMDirectByteBuffer
.put(address
, pos
, value
);
89 public byte get(int index
)
93 return VMDirectByteBuffer
.get(address
, index
);
96 public ByteBuffer
get(byte[] dst
, int offset
, int length
)
98 checkArraySize(dst
.length
, offset
, length
);
99 checkForUnderflow(length
);
101 int index
= position();
102 VMDirectByteBuffer
.get(address
, index
, dst
, offset
, length
);
103 position(index
+length
);
108 public ByteBuffer
put(int index
, byte value
)
113 VMDirectByteBuffer
.put(address
, index
, value
);
117 public ByteBuffer
compact()
121 int pos
= position();
124 int count
= remaining();
125 // Call shiftDown method optimized for direct buffers.
126 VMDirectByteBuffer
.shiftDown(address
, 0, pos
, count
);
138 public boolean isDirect()
143 public ByteBuffer
slice()
145 int rem
= remaining();
147 return new DirectByteBufferImpl
.ReadOnly
148 (this, VMDirectByteBuffer
.adjustAddress(address
, position()),
151 return new DirectByteBufferImpl
.ReadWrite
152 (this, VMDirectByteBuffer
.adjustAddress(address
, position()),
156 private ByteBuffer
duplicate(boolean readOnly
)
158 int pos
= position();
160 int mark
= position();
162 DirectByteBufferImpl result
;
164 result
= new DirectByteBufferImpl
.ReadOnly(this, address
, capacity(),
167 result
= new DirectByteBufferImpl
.ReadWrite(this, address
, capacity(),
172 result
.position(mark
);
174 result
.position(pos
);
179 public ByteBuffer
duplicate()
181 return duplicate(isReadOnly());
184 public ByteBuffer
asReadOnlyBuffer()
186 return duplicate(true);
189 public CharBuffer
asCharBuffer()
191 return new CharViewBufferImpl(this, remaining() >> 1);
194 public ShortBuffer
asShortBuffer()
196 return new ShortViewBufferImpl(this, remaining() >> 1);
199 public IntBuffer
asIntBuffer()
201 return new IntViewBufferImpl(this, remaining() >> 2);
204 public LongBuffer
asLongBuffer()
206 return new LongViewBufferImpl(this, remaining() >> 3);
209 public FloatBuffer
asFloatBuffer()
211 return new FloatViewBufferImpl(this, remaining() >> 2);
214 public DoubleBuffer
asDoubleBuffer()
216 return new DoubleViewBufferImpl(this, remaining() >> 3);
219 public char getChar()
221 return ByteBufferHelper
.getChar(this, order());
224 public ByteBuffer
putChar(char value
)
226 ByteBufferHelper
.putChar(this, value
, order());
230 public char getChar(int index
)
232 return ByteBufferHelper
.getChar(this, index
, order());
235 public ByteBuffer
putChar(int index
, char value
)
237 ByteBufferHelper
.putChar(this, index
, value
, order());
241 public short getShort()
243 return ByteBufferHelper
.getShort(this, order());
246 public ByteBuffer
putShort(short value
)
248 ByteBufferHelper
.putShort(this, value
, order());
252 public short getShort(int index
)
254 return ByteBufferHelper
.getShort(this, index
, order());
257 public ByteBuffer
putShort(int index
, short value
)
259 ByteBufferHelper
.putShort(this, index
, value
, order());
265 return ByteBufferHelper
.getInt(this, order());
268 public ByteBuffer
putInt(int value
)
270 ByteBufferHelper
.putInt(this, value
, order());
274 public int getInt(int index
)
276 return ByteBufferHelper
.getInt(this, index
, order());
279 public ByteBuffer
putInt(int index
, int value
)
281 ByteBufferHelper
.putInt(this, index
, value
, order());
285 public long getLong()
287 return ByteBufferHelper
.getLong(this, order());
290 public ByteBuffer
putLong(long value
)
292 ByteBufferHelper
.putLong(this, value
, order());
296 public long getLong(int index
)
298 return ByteBufferHelper
.getLong(this, index
, order());
301 public ByteBuffer
putLong(int index
, long value
)
303 ByteBufferHelper
.putLong(this, index
, value
, order());
307 public float getFloat()
309 return ByteBufferHelper
.getFloat(this, order());
312 public ByteBuffer
putFloat(float value
)
314 ByteBufferHelper
.putFloat(this, value
, order());
318 public float getFloat(int index
)
320 return ByteBufferHelper
.getFloat(this, index
, order());
323 public ByteBuffer
putFloat(int index
, float value
)
325 ByteBufferHelper
.putFloat(this, index
, value
, order());
329 public double getDouble()
331 return ByteBufferHelper
.getDouble(this, order());
334 public ByteBuffer
putDouble(double value
)
336 ByteBufferHelper
.putDouble(this, value
, order());
340 public double getDouble(int index
)
342 return ByteBufferHelper
.getDouble(this, index
, order());
345 public ByteBuffer
putDouble(int index
, double value
)
347 ByteBufferHelper
.putDouble(this, index
, value
, order());
351 // NOTE: In libgcj these methods are implemented in natFileChannelXxx.cc,
352 // because they're small, and to put them next to FileChannelImpl::mapImpl.
353 native void unmapImpl();
354 native boolean isLoadedImpl();
355 // FIXME: Try to load all pages into memory.
356 native void loadImpl();
358 native void forceImpl();