android short byte,ByteBufferAsShortBuffer.java

/*

* Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.

* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

*

* This code is free software; you can redistribute it and/or modify it

* under the terms of the GNU General Public License version 2 only, as

* published by the Free Software Foundation. Oracle designates this

* particular file as subject to the "Classpath" exception as provided

* by Oracle in the LICENSE file that accompanied this code.

*

* This code is distributed in the hope that it will be useful, but WITHOUT

* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License

* version 2 for more details (a copy is included in the LICENSE file that

* accompanied this code).

*

* You should have received a copy of the GNU General Public License version

* 2 along with this work; if not, write to the Free Software Foundation,

* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

*

* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

* or visit www.oracle.com if you need additional information or have any

* questions.

*/

package java.nio;

import libcore.io.Memory;

class ByteBufferAsShortBuffer extends ShortBuffer { // package-private

protected final ByteBuffer bb;

protected final int offset;

private final ByteOrder order;

ByteBufferAsShortBuffer(ByteBuffer bb,

int mark, int pos, int lim, int cap,

int off, ByteOrder order) {

super(mark, pos, lim, cap);

this.bb = bb.duplicate();

this.isReadOnly = bb.isReadOnly;

// There are only two possibilities for the type of ByteBuffer "bb", viz, DirectByteBuffer and

// HeapByteBuffer. We only have to initialize the field when bb is an instance of

// DirectByteBuffer.

// The address field is use by NIOAccess#getBasePointer and GetDirectBufferAddress method

// in art which return the address of the first usable byte of the underlying memory, i.e,

// the position of parent buffer. Therefore, value of "off" will be equal to parent buffer's

// position when the method is called from either HeapByteBuffer or DirectByteBuffer.

if (bb instanceof DirectByteBuffer) {

this.address = bb.address + off;

}

this.bb.order(order);

this.order = order;

offset = off;

}

public ShortBuffer slice() {

int pos = this.position();

int lim = this.limit();

assert (pos <= lim);

int rem = (pos <= lim ? lim - pos : 0);

int off = (pos << 1) + offset;

assert (off >= 0);

return new ByteBufferAsShortBuffer(bb, -1, 0, rem, rem, off, order);

}

public ShortBuffer duplicate() {

return new ByteBufferAsShortBuffer(bb,

this.markValue(),

this.position(),

this.limit(),

this.capacity(),

offset, order);

}

public ShortBuffer asReadOnlyBuffer() {

return new ByteBufferAsShortBuffer(bb.asReadOnlyBuffer(),

this.markValue(),

this.position(),

this.limit(),

this.capacity(),

offset, order);

}

protected int ix(int i) {

return (i << 1) + offset;

}

public short get() {

return get(nextGetIndex());

}

public short get(int i) {

return bb.getShortUnchecked(ix(checkIndex(i)));

}

public ShortBuffer get(short[] dst, int offset, int length) {

checkBounds(offset, length, dst.length);

if (length > remaining())

throw new BufferUnderflowException();

bb.getUnchecked(ix(position), dst, offset, length);

position += length;

return this;

}

public ShortBuffer put(short x) {

put(nextPutIndex(), x);

return this;

}

public ShortBuffer put(int i, short x) {

if (isReadOnly) {

throw new ReadOnlyBufferException();

}

bb.putShortUnchecked(ix(checkIndex(i)), x);

return this;

}

public ShortBuffer put(short[] src, int offset, int length) {

checkBounds(offset, length, src.length);

if (length > remaining())

throw new BufferOverflowException();

bb.putUnchecked(ix(position), src, offset, length);

position += length;

return this;

}

public ShortBuffer compact() {

if (isReadOnly) {

throw new ReadOnlyBufferException();

}

int pos = position();

int lim = limit();

assert (pos <= lim);

int rem = (pos <= lim ? lim - pos : 0);

if (!(bb instanceof DirectByteBuffer)) {

System.arraycopy(bb.array(), ix(pos), bb.array(), ix(0), rem << 1);

} else {

Memory.memmove(this, ix(0), this, ix(pos), rem << 1);

}

position(rem);

limit(capacity());

discardMark();

return this;

}

public boolean isDirect() {

return bb.isDirect();

}

public boolean isReadOnly() {

return isReadOnly;

}

public ByteOrder order() {

return order;

}

}

Java程序

|

160行

|

5.2 KB

/*

* Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.

* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

*

* This code is free software; you can redistribute it and/or modify it

* under the terms of the GNU General Public License version 2 only, as

* published by the Free Software Foundation. Oracle designates this

* particular file as subject to the "Classpath" exception as provided

* by Oracle in the LICENSE file that accompanied this code.

*

* This code is distributed in the hope that it will be useful, but WITHOUT

* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License

* version 2 for more details (a copy is included in the LICENSE file that

* accompanied this code).

*

* You should have received a copy of the GNU General Public License version

* 2 along with this work; if not, write to the Free Software Foundation,

* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

*

* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

* or visit www.oracle.com if you need additional information or have any

* questions.

*/

package java.nio;

import libcore.io.Memory;

class ByteBufferAsShortBuffer extends ShortBuffer { // package-private

protected final ByteBuffer bb;

protected final int offset;

private final ByteOrder order;

ByteBufferAsShortBuffer(ByteBuffer bb,

int mark, int pos, int lim, int cap,

int off, ByteOrder order) {

super(mark, pos, lim, cap);

this.bb = bb.duplicate();

this.isReadOnly = bb.isReadOnly;

// There are only two possibilities for the type of ByteBuffer "bb", viz, DirectByteBuffer and

// HeapByteBuffer. We only have to initialize the field when bb is an instance of

// DirectByteBuffer.

// The address field is use by NIOAccess#getBasePointer and GetDirectBufferAddress method

// in art which return the address of the first usable byte of the underlying memory, i.e,

// the position of parent buffer. Therefore, value of "off" will be equal to parent buffer's

// position when the method is called from either HeapByteBuffer or DirectByteBuffer.

if (bb instanceof DirectByteBuffer) {

this.address = bb.address + off;

}

this.bb.order(order);

this.order = order;

offset = off;

}

public ShortBuffer slice() {

int pos = this.position();

int lim = this.limit();

assert (pos <= lim);

int rem = (pos <= lim ? lim - pos : 0);

int off = (pos << 1) + offset;

assert (off >= 0);

return new ByteBufferAsShortBuffer(bb, -1, 0, rem, rem, off, order);

}

public ShortBuffer duplicate() {

return new ByteBufferAsShortBuffer(bb,

this.markValue(),

this.position(),

this.limit(),

this.capacity(),

offset, order);

}

public ShortBuffer asReadOnlyBuffer() {

return new ByteBufferAsShortBuffer(bb.asReadOnlyBuffer(),

this.markValue(),

this.position(),

this.limit(),

this.capacity(),

offset, order);

}

protected int ix(int i) {

return (i << 1) + offset;

}

public short get() {

return get(nextGetIndex());

}

public short get(int i) {

return bb.getShortUnchecked(ix(checkIndex(i)));

}

public ShortBuffer get(short[] dst, int offset, int length) {

checkBounds(offset, length, dst.length);

if (length > remaining())

throw new BufferUnderflowException();

bb.getUnchecked(ix(position), dst, offset, length);

position += length;

return this;

}

public ShortBuffer put(short x) {

put(nextPutIndex(), x);

return this;

}

public ShortBuffer put(int i, short x) {

if (isReadOnly) {

throw new ReadOnlyBufferException();

}

bb.putShortUnchecked(ix(checkIndex(i)), x);

return this;

}

public ShortBuffer put(short[] src, int offset, int length) {

checkBounds(offset, length, src.length);

if (length > remaining())

throw new BufferOverflowException();

bb.putUnchecked(ix(position), src, offset, length);

position += length;

return this;

}

public ShortBuffer compact() {

if (isReadOnly) {

throw new ReadOnlyBufferException();

}

int pos = position();

int lim = limit();

assert (pos <= lim);

int rem = (pos <= lim ? lim - pos : 0);

if (!(bb instanceof DirectByteBuffer)) {

System.arraycopy(bb.array(), ix(pos), bb.array(), ix(0), rem << 1);

} else {

Memory.memmove(this, ix(0), this, ix(pos), rem << 1);

}

position(rem);

limit(capacity());

discardMark();

return this;

}

public boolean isDirect() {

return bb.isDirect();

}

public boolean isReadOnly() {

return isReadOnly;

}

public ByteOrder order() {

return order;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值