Speed-up buffers that wrap ByteBuffer

This commit is contained in:
konsoletyper 2014-11-04 20:02:36 +03:00
parent ed6e6ae373
commit 3489f3c82c
16 changed files with 588 additions and 266 deletions

View File

@ -171,46 +171,51 @@ class TByteBufferImpl extends TByteBuffer {
@Override @Override
public TCharBuffer asCharBuffer() { public TCharBuffer asCharBuffer() {
int sz = remaining() / 2; int sz = remaining() / 2;
TCharBufferOverByteBuffer result = new TCharBufferOverByteBuffer(start + position, sz, this, 0, sz, if (order == TByteOrder.BIG_ENDIAN) {
isReadOnly()); return new TCharBufferOverByteBufferBigEndian(start + position, sz, this, 0, sz, isReadOnly());
result.byteOrder = order; } else {
return result; return new TCharBufferOverByteBufferLittleEndian(start + position, sz, this, 0, sz, isReadOnly());
}
} }
@Override @Override
public TShortBuffer asShortBuffer() { public TShortBuffer asShortBuffer() {
int sz = remaining() / 2; int sz = remaining() / 2;
TShortBufferOverByteBuffer result = new TShortBufferOverByteBuffer(start + position, sz, this, 0, sz, if (order == TByteOrder.BIG_ENDIAN) {
isReadOnly()); return new TShortBufferOverByteBufferBigEndian(start + position, sz, this, 0, sz, isReadOnly());
result.byteOrder = order; } else {
return result; return new TShortBufferOverByteBufferLittleEndian(start + position, sz, this, 0, sz, isReadOnly());
}
} }
@Override @Override
public TIntBuffer asIntBuffer() { public TIntBuffer asIntBuffer() {
int sz = remaining() / 4; int sz = remaining() / 4;
TIntBufferOverByteBuffer result = new TIntBufferOverByteBuffer(start + position, sz, this, 0, sz, if (order == TByteOrder.BIG_ENDIAN) {
isReadOnly()); return new TIntBufferOverByteBufferBigEndian(start + position, sz, this, 0, sz, isReadOnly());
result.byteOrder = order; } else {
return result; return new TIntBufferOverByteBufferLittleEndian(start + position, sz, this, 0, sz, isReadOnly());
}
} }
@Override @Override
public TLongBuffer asLongBuffer() { public TLongBuffer asLongBuffer() {
int sz = remaining() / 8; int sz = remaining() / 8;
TLongBufferOverByteBuffer result = new TLongBufferOverByteBuffer(start + position, sz, this, 0, sz, if (order == TByteOrder.BIG_ENDIAN) {
isReadOnly()); return new TLongBufferOverByteBufferBigEndian(start + position, sz, this, 0, sz, isReadOnly());
result.byteOrder = order; } else {
return result; return new TLongBufferOverByteBufferLittleEndian(start + position, sz, this, 0, sz, isReadOnly());
}
} }
@Override @Override
public TFloatBuffer asFloatBuffer() { public TFloatBuffer asFloatBuffer() {
int sz = remaining() / 4; int sz = remaining() / 4;
TFloatBufferOverByteBuffer result = new TFloatBufferOverByteBuffer(start + position, sz, this, 0, sz, if (order == TByteOrder.LITTLE_ENDIAN) {
isReadOnly()); return new TFloatBufferOverByteBufferBigEndian(start + position, sz, this, 0, sz, isReadOnly());
result.byteOrder = order; } else {
return result; return new TFloatBufferOverByteBufferLittleEndian(start + position, sz, this, 0, sz, isReadOnly());
}
} }
@Override @Override

View File

@ -19,11 +19,10 @@ package org.teavm.classlib.java.nio;
* *
* @author Alexey Andreev <konsoletyper@gmail.com> * @author Alexey Andreev <konsoletyper@gmail.com>
*/ */
class TCharBufferOverByteBuffer extends TCharBufferImpl { abstract class TCharBufferOverByteBuffer extends TCharBufferImpl {
private TByteBufferImpl byteByffer; TByteBufferImpl byteByffer;
TByteOrder byteOrder = TByteOrder.BIG_ENDIAN;
boolean readOnly; boolean readOnly;
private int start; int start;
public TCharBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit, public TCharBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit,
boolean readOnly) { boolean readOnly) {
@ -33,38 +32,6 @@ class TCharBufferOverByteBuffer extends TCharBufferImpl {
this.readOnly = readOnly; this.readOnly = readOnly;
} }
@Override
TCharBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
TCharBufferOverByteBuffer result = new TCharBufferOverByteBuffer(this.start + start * 2, capacity, byteByffer,
position, limit, readOnly);
result.byteOrder = byteOrder;
return result;
}
@Override
char getChar(int index) {
int value;
if (byteOrder == TByteOrder.BIG_ENDIAN) {
value = ((byteByffer.array[start + index * 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 2 + 1] & 0xFF);
} else {
value = ((byteByffer.array[start + index * 2 + 1] & 0xFF) << 8) |
(byteByffer.array[start + index * 2] & 0xFF);
}
return (char)value;
}
@Override
void putChar(int index, char value) {
if (byteOrder == TByteOrder.BIG_ENDIAN) {
byteByffer.array[start + index * 2] = (byte)(value >> 8);
byteByffer.array[start + index * 2 + 1] = (byte)value;
} else {
byteByffer.array[start + index * 2] = (byte)value;
byteByffer.array[start + index * 2 + 1] = (byte)(value >> 8);
}
}
@Override @Override
boolean isArrayPresent() { boolean isArrayPresent() {
return false; return false;
@ -84,9 +51,4 @@ class TCharBufferOverByteBuffer extends TCharBufferImpl {
boolean readOnly() { boolean readOnly() {
return readOnly; return readOnly;
} }
@Override
public TByteOrder order() {
return byteOrder;
}
} }

View File

@ -0,0 +1,51 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TCharBufferOverByteBufferBigEndian extends TCharBufferOverByteBuffer {
public TCharBufferOverByteBufferBigEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
char getChar(int index) {
int value = ((byteByffer.array[start + index * 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 2 + 1] & 0xFF);
return (char)value;
}
@Override
void putChar(int index, char value) {
byteByffer.array[start + index * 2] = (byte)(value >> 8);
byteByffer.array[start + index * 2 + 1] = (byte)value;
}
@Override
TCharBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TCharBufferOverByteBufferBigEndian(this.start + start * 2, capacity, byteByffer,
position, limit, readOnly);
}
@Override
public TByteOrder order() {
return TByteOrder.LITTLE_ENDIAN;
}
}

View File

@ -0,0 +1,51 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TCharBufferOverByteBufferLittleEndian extends TCharBufferOverByteBuffer {
public TCharBufferOverByteBufferLittleEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
char getChar(int index) {
int value = ((byteByffer.array[start + index * 2 + 1] & 0xFF) << 8) |
(byteByffer.array[start + index * 2] & 0xFF);
return (char)value;
}
@Override
void putChar(int index, char value) {
byteByffer.array[start + index * 2] = (byte)value;
byteByffer.array[start + index * 2 + 1] = (byte)(value >> 8);
}
@Override
public TByteOrder order() {
return TByteOrder.BIG_ENDIAN;
}
@Override
TCharBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TCharBufferOverByteBufferLittleEndian(this.start + start * 2, capacity, byteByffer,
position, limit, readOnly);
}
}

View File

@ -19,11 +19,10 @@ package org.teavm.classlib.java.nio;
* *
* @author Alexey Andreev <konsoletyper@gmail.com> * @author Alexey Andreev <konsoletyper@gmail.com>
*/ */
class TFloatBufferOverByteBuffer extends TFloatBufferImpl { abstract class TFloatBufferOverByteBuffer extends TFloatBufferImpl {
private TByteBufferImpl byteByffer; TByteBufferImpl byteByffer;
TByteOrder byteOrder = TByteOrder.BIG_ENDIAN;
boolean readOnly; boolean readOnly;
private int start; int start;
public TFloatBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit, public TFloatBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit,
boolean readOnly) { boolean readOnly) {
@ -33,47 +32,6 @@ class TFloatBufferOverByteBuffer extends TFloatBufferImpl {
this.readOnly = readOnly; this.readOnly = readOnly;
} }
@Override
TFloatBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
TFloatBufferOverByteBuffer result = new TFloatBufferOverByteBuffer(this.start + start * 2, capacity,
byteByffer, position, limit, readOnly);
result.byteOrder = byteOrder;
return result;
}
@Override
float getElement(int index) {
int value;
if (byteOrder == TByteOrder.BIG_ENDIAN) {
value = ((byteByffer.array[start + index * 4] & 0xFF) << 24) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 4 + 3] & 0xFF);
} else {
value = (byteByffer.array[start + index * 4] & 0xFF) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 8) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 3] & 0xFF) << 24);
}
return Float.intBitsToFloat(value);
}
@Override
void putElement(int index, float f) {
int value = Float.floatToIntBits(f);
if (byteOrder == TByteOrder.BIG_ENDIAN) {
byteByffer.array[start + index * 4] = (byte)(value >> 24);
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 3] = (byte)value;
} else {
byteByffer.array[start + index * 4] = (byte)value;
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 3] = (byte)(value >> 24);
}
}
@Override @Override
boolean isArrayPresent() { boolean isArrayPresent() {
return false; return false;
@ -93,9 +51,4 @@ class TFloatBufferOverByteBuffer extends TFloatBufferImpl {
boolean readOnly() { boolean readOnly() {
return readOnly; return readOnly;
} }
@Override
public TByteOrder order() {
return byteOrder;
}
} }

View File

@ -0,0 +1,56 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TFloatBufferOverByteBufferBigEndian extends TFloatBufferOverByteBuffer {
public TFloatBufferOverByteBufferBigEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TFloatBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TFloatBufferOverByteBufferBigEndian(this.start + start * 4, capacity,
byteByffer, position, limit, readOnly);
}
@Override
float getElement(int index) {
int value = (byteByffer.array[start + index * 4] & 0xFF) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 8) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 3] & 0xFF) << 24);
return Float.intBitsToFloat(value);
}
@Override
void putElement(int index, float f) {
int value = Float.floatToIntBits(f);
byteByffer.array[start + index * 4] = (byte)value;
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 3] = (byte)(value >> 24);
}
@Override
public TByteOrder order() {
return TByteOrder.BIG_ENDIAN;
}
}

View File

@ -0,0 +1,56 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TFloatBufferOverByteBufferLittleEndian extends TFloatBufferOverByteBuffer {
public TFloatBufferOverByteBufferLittleEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TFloatBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TFloatBufferOverByteBufferLittleEndian(this.start + start * 4, capacity,
byteByffer, position, limit, readOnly);
}
@Override
float getElement(int index) {
int value = ((byteByffer.array[start + index * 4] & 0xFF) << 24) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 4 + 3] & 0xFF);
return Float.intBitsToFloat(value);
}
@Override
void putElement(int index, float f) {
int value = Float.floatToIntBits(f);
byteByffer.array[start + index * 4] = (byte)(value >> 24);
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 3] = (byte)value;
}
@Override
public TByteOrder order() {
return TByteOrder.LITTLE_ENDIAN;
}
}

View File

@ -19,11 +19,10 @@ package org.teavm.classlib.java.nio;
* *
* @author Alexey Andreev <konsoletyper@gmail.com> * @author Alexey Andreev <konsoletyper@gmail.com>
*/ */
public class TIntBufferOverByteBuffer extends TIntBufferImpl { abstract class TIntBufferOverByteBuffer extends TIntBufferImpl {
private TByteBufferImpl byteByffer; TByteBufferImpl byteByffer;
TByteOrder byteOrder = TByteOrder.BIG_ENDIAN;
boolean readOnly; boolean readOnly;
private int start; int start;
public TIntBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit, public TIntBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit,
boolean readOnly) { boolean readOnly) {
@ -33,46 +32,6 @@ public class TIntBufferOverByteBuffer extends TIntBufferImpl {
this.readOnly = readOnly; this.readOnly = readOnly;
} }
@Override
TIntBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
TIntBufferOverByteBuffer result = new TIntBufferOverByteBuffer(this.start + start * 2, capacity,
byteByffer, position, limit, readOnly);
result.byteOrder = byteOrder;
return result;
}
@Override
int getElement(int index) {
int value;
if (byteOrder == TByteOrder.BIG_ENDIAN) {
value = ((byteByffer.array[start + index * 4] & 0xFF) << 24) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 4 + 3] & 0xFF);
} else {
value = (byteByffer.array[start + index * 4] & 0xFF) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 8) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 3] & 0xFF) << 24);
}
return value;
}
@Override
void putElement(int index, int value) {
if (byteOrder == TByteOrder.BIG_ENDIAN) {
byteByffer.array[start + index * 4] = (byte)(value >> 24);
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 3] = (byte)value;
} else {
byteByffer.array[start + index * 4] = (byte)value;
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 3] = (byte)(value >> 24);
}
}
@Override @Override
boolean isArrayPresent() { boolean isArrayPresent() {
return false; return false;
@ -92,9 +51,4 @@ public class TIntBufferOverByteBuffer extends TIntBufferImpl {
boolean readOnly() { boolean readOnly() {
return readOnly; return readOnly;
} }
@Override
public TByteOrder order() {
return byteOrder;
}
} }

View File

@ -0,0 +1,54 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TIntBufferOverByteBufferBigEndian extends TIntBufferOverByteBuffer {
public TIntBufferOverByteBufferBigEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TIntBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TIntBufferOverByteBufferBigEndian(this.start + start * 4, capacity,
byteByffer, position, limit, readOnly);
}
@Override
int getElement(int index) {
return ((byteByffer.array[start + index * 4] & 0xFF) << 24) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 4 + 3] & 0xFF);
}
@Override
void putElement(int index, int value) {
byteByffer.array[start + index * 4] = (byte)(value >> 24);
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 3] = (byte)value;
}
@Override
public TByteOrder order() {
return TByteOrder.BIG_ENDIAN;
}
}

View File

@ -0,0 +1,54 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TIntBufferOverByteBufferLittleEndian extends TIntBufferOverByteBuffer {
public TIntBufferOverByteBufferLittleEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TIntBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TIntBufferOverByteBufferLittleEndian(this.start + start * 4, capacity,
byteByffer, position, limit, readOnly);
}
@Override
int getElement(int index) {
return (byteByffer.array[start + index * 4] & 0xFF) |
((byteByffer.array[start + index * 4 + 1] & 0xFF) << 8) |
((byteByffer.array[start + index * 4 + 2] & 0xFF) << 16) |
((byteByffer.array[start + index * 4 + 3] & 0xFF) << 24);
}
@Override
void putElement(int index, int value) {
byteByffer.array[start + index * 4] = (byte)value;
byteByffer.array[start + index * 4 + 1] = (byte)(value >> 8);
byteByffer.array[start + index * 4 + 2] = (byte)(value >> 16);
byteByffer.array[start + index * 4 + 3] = (byte)(value >> 24);
}
@Override
public TByteOrder order() {
return TByteOrder.LITTLE_ENDIAN;
}
}

View File

@ -19,11 +19,10 @@ package org.teavm.classlib.java.nio;
* *
* @author Alexey Andreev <konsoletyper@gmail.com> * @author Alexey Andreev <konsoletyper@gmail.com>
*/ */
class TLongBufferOverByteBuffer extends TLongBufferImpl { abstract class TLongBufferOverByteBuffer extends TLongBufferImpl {
private TByteBufferImpl byteByffer; TByteBufferImpl byteByffer;
TByteOrder byteOrder = TByteOrder.BIG_ENDIAN;
boolean readOnly; boolean readOnly;
private int start; int start;
public TLongBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit, public TLongBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit,
boolean readOnly) { boolean readOnly) {
@ -33,62 +32,6 @@ class TLongBufferOverByteBuffer extends TLongBufferImpl {
this.readOnly = readOnly; this.readOnly = readOnly;
} }
@Override
TLongBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
TLongBufferOverByteBuffer result = new TLongBufferOverByteBuffer(this.start + start * 2, capacity,
byteByffer, position, limit, readOnly);
result.byteOrder = byteOrder;
return result;
}
@Override
long getElement(int index) {
long value;
if (byteOrder == TByteOrder.BIG_ENDIAN) {
value = (((long)byteByffer.array[start + index * 8] & 0xFF) << 56) |
(((long)byteByffer.array[start + index * 8 + 1] & 0xFF) << 48) |
(((long)byteByffer.array[start + index * 8 + 2] & 0xFF) << 40) |
(((long)byteByffer.array[start + index * 8 + 3] & 0xFF) << 32) |
(((long)byteByffer.array[start + index * 8 + 4] & 0xFF) << 24) |
(((long)byteByffer.array[start + index * 8 + 5] & 0xFF) << 16) |
(((long)byteByffer.array[start + index * 8 + 6] & 0xFF) << 8) |
(byteByffer.array[start + index * 8 + 7] & 0xFF);
} else {
value = (byteByffer.array[start + index * 8] & 0xFF) |
(((long)byteByffer.array[start + index * 8 + 1] & 0xFF) << 8) |
(((long)byteByffer.array[start + index * 8 + 2] & 0xFF) << 16) |
(((long)byteByffer.array[start + index * 8 + 3] & 0xFF) << 24) |
(((long)byteByffer.array[start + index * 8 + 4] & 0xFF) << 32) |
(((long)byteByffer.array[start + index * 8 + 5] & 0xFF) << 40) |
(((long)byteByffer.array[start + index * 8 + 6] & 0xFF) << 48) |
(((long)byteByffer.array[start + index * 8 + 7] & 0xFF) << 56);
}
return value;
}
@Override
void putElement(int index, long value) {
if (byteOrder == TByteOrder.BIG_ENDIAN) {
byteByffer.array[start + index * 8] = (byte)(value >> 56);
byteByffer.array[start + index * 8 + 1] = (byte)(value >> 48);
byteByffer.array[start + index * 8 + 2] = (byte)(value >> 40);
byteByffer.array[start + index * 8 + 3] = (byte)(value >> 32);
byteByffer.array[start + index * 8 + 4] = (byte)(value >> 24);
byteByffer.array[start + index * 8 + 5] = (byte)(value >> 16);
byteByffer.array[start + index * 8 + 6] = (byte)(value >> 8);
byteByffer.array[start + index * 8 + 7] = (byte)value;
} else {
byteByffer.array[start + index * 8] = (byte)value;
byteByffer.array[start + index * 8 + 1] = (byte)(value >> 8);
byteByffer.array[start + index * 8 + 2] = (byte)(value >> 16);
byteByffer.array[start + index * 8 + 3] = (byte)(value >> 24);
byteByffer.array[start + index * 8 + 4] = (byte)(value >> 32);
byteByffer.array[start + index * 8 + 5] = (byte)(value >> 40);
byteByffer.array[start + index * 8 + 6] = (byte)(value >> 48);
byteByffer.array[start + index * 8 + 7] = (byte)(value >> 56);
}
}
@Override @Override
boolean isArrayPresent() { boolean isArrayPresent() {
return false; return false;
@ -108,9 +51,4 @@ class TLongBufferOverByteBuffer extends TLongBufferImpl {
boolean readOnly() { boolean readOnly() {
return readOnly; return readOnly;
} }
@Override
public TByteOrder order() {
return byteOrder;
}
} }

View File

@ -0,0 +1,62 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TLongBufferOverByteBufferBigEndian extends TLongBufferOverByteBuffer {
public TLongBufferOverByteBufferBigEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TLongBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TLongBufferOverByteBufferBigEndian(this.start + start * 8, capacity,
byteByffer, position, limit, readOnly);
}
@Override
long getElement(int index) {
return (((long)byteByffer.array[start + index * 8] & 0xFF) << 56) |
(((long)byteByffer.array[start + index * 8 + 1] & 0xFF) << 48) |
(((long)byteByffer.array[start + index * 8 + 2] & 0xFF) << 40) |
(((long)byteByffer.array[start + index * 8 + 3] & 0xFF) << 32) |
(((long)byteByffer.array[start + index * 8 + 4] & 0xFF) << 24) |
(((long)byteByffer.array[start + index * 8 + 5] & 0xFF) << 16) |
(((long)byteByffer.array[start + index * 8 + 6] & 0xFF) << 8) |
(byteByffer.array[start + index * 8 + 7] & 0xFF);
}
@Override
void putElement(int index, long value) {
byteByffer.array[start + index * 8] = (byte)(value >> 56);
byteByffer.array[start + index * 8 + 1] = (byte)(value >> 48);
byteByffer.array[start + index * 8 + 2] = (byte)(value >> 40);
byteByffer.array[start + index * 8 + 3] = (byte)(value >> 32);
byteByffer.array[start + index * 8 + 4] = (byte)(value >> 24);
byteByffer.array[start + index * 8 + 5] = (byte)(value >> 16);
byteByffer.array[start + index * 8 + 6] = (byte)(value >> 8);
byteByffer.array[start + index * 8 + 7] = (byte)value;
}
@Override
public TByteOrder order() {
return TByteOrder.BIG_ENDIAN;
}
}

View File

@ -0,0 +1,62 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TLongBufferOverByteBufferLittleEndian extends TLongBufferOverByteBuffer {
public TLongBufferOverByteBufferLittleEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TLongBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TLongBufferOverByteBufferLittleEndian(this.start + start * 8, capacity,
byteByffer, position, limit, readOnly);
}
@Override
long getElement(int index) {
return (byteByffer.array[start + index * 8] & 0xFF) |
(((long)byteByffer.array[start + index * 8 + 1] & 0xFF) << 8) |
(((long)byteByffer.array[start + index * 8 + 2] & 0xFF) << 16) |
(((long)byteByffer.array[start + index * 8 + 3] & 0xFF) << 24) |
(((long)byteByffer.array[start + index * 8 + 4] & 0xFF) << 32) |
(((long)byteByffer.array[start + index * 8 + 5] & 0xFF) << 40) |
(((long)byteByffer.array[start + index * 8 + 6] & 0xFF) << 48) |
(((long)byteByffer.array[start + index * 8 + 7] & 0xFF) << 56);
}
@Override
void putElement(int index, long value) {
byteByffer.array[start + index * 8] = (byte)value;
byteByffer.array[start + index * 8 + 1] = (byte)(value >> 8);
byteByffer.array[start + index * 8 + 2] = (byte)(value >> 16);
byteByffer.array[start + index * 8 + 3] = (byte)(value >> 24);
byteByffer.array[start + index * 8 + 4] = (byte)(value >> 32);
byteByffer.array[start + index * 8 + 5] = (byte)(value >> 40);
byteByffer.array[start + index * 8 + 6] = (byte)(value >> 48);
byteByffer.array[start + index * 8 + 7] = (byte)(value >> 56);
}
@Override
public TByteOrder order() {
return TByteOrder.LITTLE_ENDIAN;
}
}

View File

@ -19,11 +19,10 @@ package org.teavm.classlib.java.nio;
* *
* @author Alexey Andreev <konsoletyper@gmail.com> * @author Alexey Andreev <konsoletyper@gmail.com>
*/ */
class TShortBufferOverByteBuffer extends TShortBufferImpl { abstract class TShortBufferOverByteBuffer extends TShortBufferImpl {
private TByteBufferImpl byteByffer; TByteBufferImpl byteByffer;
TByteOrder byteOrder = TByteOrder.BIG_ENDIAN;
boolean readOnly; boolean readOnly;
private int start; int start;
public TShortBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit, public TShortBufferOverByteBuffer(int start, int capacity, TByteBufferImpl byteBuffer, int position, int limit,
boolean readOnly) { boolean readOnly) {
@ -33,38 +32,6 @@ class TShortBufferOverByteBuffer extends TShortBufferImpl {
this.readOnly = readOnly; this.readOnly = readOnly;
} }
@Override
TShortBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
TShortBufferOverByteBuffer result = new TShortBufferOverByteBuffer(this.start + start * 2, capacity,
byteByffer, position, limit, readOnly);
result.byteOrder = byteOrder;
return result;
}
@Override
short getElement(int index) {
int value;
if (byteOrder == TByteOrder.BIG_ENDIAN) {
value = ((byteByffer.array[start + index * 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 2 + 1] & 0xFF);
} else {
value = ((byteByffer.array[start + index * 2 + 1] & 0xFF) << 8) |
(byteByffer.array[start + index * 2] & 0xFF);
}
return (short)value;
}
@Override
void putElement(int index, short value) {
if (byteOrder == TByteOrder.BIG_ENDIAN) {
byteByffer.array[start + index * 2] = (byte)(value >> 8);
byteByffer.array[start + index * 2 + 1] = (byte)value;
} else {
byteByffer.array[start + index * 2] = (byte)value;
byteByffer.array[start + index * 2 + 1] = (byte)(value >> 8);
}
}
@Override @Override
boolean isArrayPresent() { boolean isArrayPresent() {
return false; return false;
@ -84,9 +51,4 @@ class TShortBufferOverByteBuffer extends TShortBufferImpl {
boolean readOnly() { boolean readOnly() {
return readOnly; return readOnly;
} }
@Override
public TByteOrder order() {
return byteOrder;
}
} }

View File

@ -0,0 +1,51 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TShortBufferOverByteBufferBigEndian extends TShortBufferOverByteBuffer {
public TShortBufferOverByteBufferBigEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TShortBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TShortBufferOverByteBufferBigEndian(this.start + start * 2, capacity,
byteByffer, position, limit, readOnly);
}
@Override
short getElement(int index) {
int value = ((byteByffer.array[start + index * 2] & 0xFF) << 8) |
(byteByffer.array[start + index * 2 + 1] & 0xFF);
return (short)value;
}
@Override
void putElement(int index, short value) {
byteByffer.array[start + index * 2] = (byte)(value >> 8);
byteByffer.array[start + index * 2 + 1] = (byte)value;
}
@Override
public TByteOrder order() {
return TByteOrder.BIG_ENDIAN;
}
}

View File

@ -0,0 +1,51 @@
/*
* Copyright 2014 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.classlib.java.nio;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
class TShortBufferOverByteBufferLittleEndian extends TShortBufferOverByteBuffer {
public TShortBufferOverByteBufferLittleEndian(int start, int capacity, TByteBufferImpl byteBuffer, int position,
int limit, boolean readOnly) {
super(start, capacity, byteBuffer, position, limit, readOnly);
}
@Override
TShortBuffer duplicate(int start, int capacity, int position, int limit, boolean readOnly) {
return new TShortBufferOverByteBufferLittleEndian(this.start + start * 2, capacity,
byteByffer, position, limit, readOnly);
}
@Override
short getElement(int index) {
int value = (byteByffer.array[start + index * 2] & 0xFF) |
((byteByffer.array[start + index * 2 + 1] & 0xFF) << 8);
return (short)value;
}
@Override
void putElement(int index, short value) {
byteByffer.array[start + index * 2] = (byte)value;
byteByffer.array[start + index * 2 + 1] = (byte)(value >> 8);
}
@Override
public TByteOrder order() {
return TByteOrder.LITTLE_ENDIAN;
}
}