java doublebuffer_ByteBufferAsDoubleBuffer.java

/* Licensed to the Apache Software Foundation (ASF) under one or more

* contributor license agreements. See the NOTICE file distributed with

* this work for additional information regarding copyright ownership.

* The ASF licenses this file to You 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 java.nio;

import libcore.io.SizeOf;

/**

* This class wraps a byte buffer to be a double buffer.

*

* Implementation notice:

**

After a byte buffer instance is wrapped, it becomes privately owned by

* the adapter. It must NOT be accessed outside the adapter any more.

*

The byte buffer's position and limit are NOT linked with the adapter.

* The adapter extends Buffer, thus has its own position and limit.

*

*

*

*/

final class ByteBufferAsDoubleBuffer extends DoubleBuffer {

private final ByteBuffer byteBuffer;

static DoubleBuffer asDoubleBuffer(ByteBuffer byteBuffer) {

ByteBuffer slice = byteBuffer.slice();

slice.order(byteBuffer.order());

return new ByteBufferAsDoubleBuffer(slice);

}

private ByteBufferAsDoubleBuffer(ByteBuffer byteBuffer) {

super(byteBuffer.capacity() / SizeOf.DOUBLE, byteBuffer.effectiveDirectAddress);

this.byteBuffer = byteBuffer;

this.byteBuffer.clear();

}

@Override

public DoubleBuffer asReadOnlyBuffer() {

ByteBufferAsDoubleBuffer buf = new ByteBufferAsDoubleBuffer(byteBuffer.asReadOnlyBuffer());

buf.limit = limit;

buf.position = position;

buf.mark = mark;

buf.byteBuffer.order = byteBuffer.order;

return buf;

}

@Override

public DoubleBuffer compact() {

if (byteBuffer.isReadOnly()) {

throw new ReadOnlyBufferException();

}

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

byteBuffer.compact();

byteBuffer.clear();

position = limit - position;

limit = capacity;

mark = UNSET_MARK;

return this;

}

@Override

public DoubleBuffer duplicate() {

ByteBuffer bb = byteBuffer.duplicate().order(byteBuffer.order());

ByteBufferAsDoubleBuffer buf = new ByteBufferAsDoubleBuffer(bb);

buf.limit = limit;

buf.position = position;

buf.mark = mark;

return buf;

}

@Override

public double get() {

if (position == limit) {

throw new BufferUnderflowException();

}

return byteBuffer.getDouble(position++ * SizeOf.DOUBLE);

}

@Override

public double get(int index) {

checkIndex(index);

return byteBuffer.getDouble(index * SizeOf.DOUBLE);

}

@Override

public DoubleBuffer get(double[] dst, int dstOffset, int doubleCount) {

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

if (byteBuffer instanceof DirectByteBuffer) {

((DirectByteBuffer) byteBuffer).get(dst, dstOffset, doubleCount);

} else {

((ByteArrayBuffer) byteBuffer).get(dst, dstOffset, doubleCount);

}

this.position += doubleCount;

return this;

}

@Override

public boolean isDirect() {

return byteBuffer.isDirect();

}

@Override

public boolean isReadOnly() {

return byteBuffer.isReadOnly();

}

@Override

public ByteOrder order() {

return byteBuffer.order();

}

@Override double[] protectedArray() {

throw new UnsupportedOperationException();

}

@Override int protectedArrayOffset() {

throw new UnsupportedOperationException();

}

@Override boolean protectedHasArray() {

return false;

}

@Override

public DoubleBuffer put(double c) {

if (position == limit) {

throw new BufferOverflowException();

}

byteBuffer.putDouble(position++ * SizeOf.DOUBLE, c);

return this;

}

@Override

public DoubleBuffer put(int index, double c) {

checkIndex(index);

byteBuffer.putDouble(index * SizeOf.DOUBLE, c);

return this;

}

@Override

public DoubleBuffer put(double[] src, int srcOffset, int doubleCount) {

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

if (byteBuffer instanceof DirectByteBuffer) {

((DirectByteBuffer) byteBuffer).put(src, srcOffset, doubleCount);

} else {

((ByteArrayBuffer) byteBuffer).put(src, srcOffset, doubleCount);

}

this.position += doubleCount;

return this;

}

@Override

public DoubleBuffer slice() {

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

ByteBuffer bb = byteBuffer.slice().order(byteBuffer.order());

DoubleBuffer result = new ByteBufferAsDoubleBuffer(bb);

byteBuffer.clear();

return result;

}

}

Java程序

|

179行

|

5.39 KB

/* Licensed to the Apache Software Foundation (ASF) under one or more

* contributor license agreements. See the NOTICE file distributed with

* this work for additional information regarding copyright ownership.

* The ASF licenses this file to You 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 java.nio;

import libcore.io.SizeOf;

/**

* This class wraps a byte buffer to be a double buffer.

*

* Implementation notice:

*

*

After a byte buffer instance is wrapped, it becomes privately owned by

* the adapter. It must NOT be accessed outside the adapter any more.

*

The byte buffer's position and limit are NOT linked with the adapter.

* The adapter extends Buffer, thus has its own position and limit.

*

*

*

*/

final class ByteBufferAsDoubleBuffer extends DoubleBuffer {

private final ByteBuffer byteBuffer;

static DoubleBuffer asDoubleBuffer(ByteBuffer byteBuffer) {

ByteBuffer slice = byteBuffer.slice();

slice.order(byteBuffer.order());

return new ByteBufferAsDoubleBuffer(slice);

}

private ByteBufferAsDoubleBuffer(ByteBuffer byteBuffer) {

super(byteBuffer.capacity() / SizeOf.DOUBLE, byteBuffer.effectiveDirectAddress);

this.byteBuffer = byteBuffer;

this.byteBuffer.clear();

}

@Override

public DoubleBuffer asReadOnlyBuffer() {

ByteBufferAsDoubleBuffer buf = new ByteBufferAsDoubleBuffer(byteBuffer.asReadOnlyBuffer());

buf.limit = limit;

buf.position = position;

buf.mark = mark;

buf.byteBuffer.order = byteBuffer.order;

return buf;

}

@Override

public DoubleBuffer compact() {

if (byteBuffer.isReadOnly()) {

throw new ReadOnlyBufferException();

}

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

byteBuffer.compact();

byteBuffer.clear();

position = limit - position;

limit = capacity;

mark = UNSET_MARK;

return this;

}

@Override

public DoubleBuffer duplicate() {

ByteBuffer bb = byteBuffer.duplicate().order(byteBuffer.order());

ByteBufferAsDoubleBuffer buf = new ByteBufferAsDoubleBuffer(bb);

buf.limit = limit;

buf.position = position;

buf.mark = mark;

return buf;

}

@Override

public double get() {

if (position == limit) {

throw new BufferUnderflowException();

}

return byteBuffer.getDouble(position++ * SizeOf.DOUBLE);

}

@Override

public double get(int index) {

checkIndex(index);

return byteBuffer.getDouble(index * SizeOf.DOUBLE);

}

@Override

public DoubleBuffer get(double[] dst, int dstOffset, int doubleCount) {

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

if (byteBuffer instanceof DirectByteBuffer) {

((DirectByteBuffer) byteBuffer).get(dst, dstOffset, doubleCount);

} else {

((ByteArrayBuffer) byteBuffer).get(dst, dstOffset, doubleCount);

}

this.position += doubleCount;

return this;

}

@Override

public boolean isDirect() {

return byteBuffer.isDirect();

}

@Override

public boolean isReadOnly() {

return byteBuffer.isReadOnly();

}

@Override

public ByteOrder order() {

return byteBuffer.order();

}

@Override double[] protectedArray() {

throw new UnsupportedOperationException();

}

@Override int protectedArrayOffset() {

throw new UnsupportedOperationException();

}

@Override boolean protectedHasArray() {

return false;

}

@Override

public DoubleBuffer put(double c) {

if (position == limit) {

throw new BufferOverflowException();

}

byteBuffer.putDouble(position++ * SizeOf.DOUBLE, c);

return this;

}

@Override

public DoubleBuffer put(int index, double c) {

checkIndex(index);

byteBuffer.putDouble(index * SizeOf.DOUBLE, c);

return this;

}

@Override

public DoubleBuffer put(double[] src, int srcOffset, int doubleCount) {

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

if (byteBuffer instanceof DirectByteBuffer) {

((DirectByteBuffer) byteBuffer).put(src, srcOffset, doubleCount);

} else {

((ByteArrayBuffer) byteBuffer).put(src, srcOffset, doubleCount);

}

this.position += doubleCount;

return this;

}

@Override

public DoubleBuffer slice() {

byteBuffer.limit(limit * SizeOf.DOUBLE);

byteBuffer.position(position * SizeOf.DOUBLE);

ByteBuffer bb = byteBuffer.slice().order(byteBuffer.order());

DoubleBuffer result = new ByteBufferAsDoubleBuffer(bb);

byteBuffer.clear();

return result;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值