ByteBufferAs-X-Buffer.java.template revision 2362
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * This code is free software; you can redistribute it and/or modify it
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * under the terms of the GNU General Public License version 2 only, as
fa9e4066f08beec538e775443c5be79dd423fcabahrens * published by the Free Software Foundation. Oracle designates this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * particular file as subject to the "Classpath" exception as provided
fa9e4066f08beec538e775443c5be79dd423fcabahrens * by Oracle in the LICENSE file that accompanied this code.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This code is distributed in the hope that it will be useful, but WITHOUT
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fa9e4066f08beec538e775443c5be79dd423fcabahrens * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
fa9e4066f08beec538e775443c5be79dd423fcabahrens * version 2 for more details (a copy is included in the LICENSE file that
fa9e4066f08beec538e775443c5be79dd423fcabahrens * accompanied this code).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You should have received a copy of the GNU General Public License version
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 2 along with this work; if not, write to the Free Software Foundation,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
f94275ce205810a201404c5f35f4cc96057022b1Adam Leventhal * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or visit www.oracle.com if you need additional information or have any
27dd1e87cd3d939264769dd4af7e6a529cde001fMark Shellenbaum * questions.
4263d13f00c9691fa14620eff82abef795be0693George Wilson */
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
fa9e4066f08beec538e775443c5be79dd423fcabahrens#warn This file is preprocessed before being compiled
fa9e4066f08beec538e775443c5be79dd423fcabahrens
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musantepackage java.nio;
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensclass ByteBufferAs$Type$Buffer$RW$$BO$ // package-private
fa9e4066f08beec538e775443c5be79dd423fcabahrens extends {#if[ro]?ByteBufferAs}$Type$Buffer{#if[ro]?$BO$}
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby{
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens protected final ByteBuffer bb;
fa9e4066f08beec538e775443c5be79dd423fcabahrens protected final int offset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#end[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ByteBufferAs$Type$Buffer$RW$$BO$(ByteBuffer bb) { // package-private
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens super(-1, 0,
fa9e4066f08beec538e775443c5be79dd423fcabahrens bb.remaining() >> $LG_BYTES_PER_VALUE$,
fa9e4066f08beec538e775443c5be79dd423fcabahrens bb.remaining() >> $LG_BYTES_PER_VALUE$);
fa9e4066f08beec538e775443c5be79dd423fcabahrens this.bb = bb;
fa9e4066f08beec538e775443c5be79dd423fcabahrens // enforce limit == capacity
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cap = this.capacity();
b1b8ab34de515a5e83206da22c3d7e563241b021lling this.limit(cap);
b1b8ab34de515a5e83206da22c3d7e563241b021lling int pos = this.position();
fa9e4066f08beec538e775443c5be79dd423fcabahrens assert (pos <= cap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens offset = pos;
990b4856d0eaada6f8140335733a1b1771ed2746lling#else[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens super(bb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#end[rw]
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor }
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor ByteBufferAs$Type$Buffer$RW$$BO$(ByteBuffer bb,
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor int mark, int pos, int lim, int cap,
fa9e4066f08beec538e775443c5be79dd423fcabahrens int off)
990b4856d0eaada6f8140335733a1b1771ed2746lling {
990b4856d0eaada6f8140335733a1b1771ed2746lling#if[rw]
990b4856d0eaada6f8140335733a1b1771ed2746lling super(mark, pos, lim, cap);
66e2aacc02a4625d105fb249ad16c27e79604ff2gw this.bb = bb;
fa9e4066f08beec538e775443c5be79dd423fcabahrens offset = off;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens super(bb, mark, pos, lim, cap, off);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#end[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public $Type$Buffer slice() {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int pos = this.position();
fa9e4066f08beec538e775443c5be79dd423fcabahrens int lim = this.limit();
fa9e4066f08beec538e775443c5be79dd423fcabahrens assert (pos <= lim);
fa9e4066f08beec538e775443c5be79dd423fcabahrens int rem = (pos <= lim ? lim - pos : 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens int off = (pos << $LG_BYTES_PER_VALUE$) + offset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens assert (off >= 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return new ByteBufferAs$Type$Buffer$RW$$BO$(bb, -1, 0, rem, rem, off);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public $Type$Buffer duplicate() {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return new ByteBufferAs$Type$Buffer$RW$$BO$(bb,
fa9e4066f08beec538e775443c5be79dd423fcabahrens this.markValue(),
fa9e4066f08beec538e775443c5be79dd423fcabahrens this.position(),
fa9e4066f08beec538e775443c5be79dd423fcabahrens this.limit(),
fa9e4066f08beec538e775443c5be79dd423fcabahrens this.capacity(),
fa9e4066f08beec538e775443c5be79dd423fcabahrens offset);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public $Type$Buffer asReadOnlyBuffer() {
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee#if[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens return new ByteBufferAs$Type$BufferR$BO$(bb,
66e2aacc02a4625d105fb249ad16c27e79604ff2gw this.markValue(),
66e2aacc02a4625d105fb249ad16c27e79604ff2gw this.position(),
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock this.limit(),
66e2aacc02a4625d105fb249ad16c27e79604ff2gw this.capacity(),
7b55fa8ea6046becb3b72f8886a503979c322084ck offset);
d0ad202d2eff2cc0c70ee550686a703ddda7106cahrens#else[rw]
b1b8ab34de515a5e83206da22c3d7e563241b021lling return duplicate();
e7437265dc2a4920c197ed4337665539d358b22cahrens#end[rw]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#if[rw]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw protected int ix(int i) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (i << $LG_BYTES_PER_VALUE$) + offset;
a9799022bd90b13722204e80112efaa5bf573099ck }
a9799022bd90b13722204e80112efaa5bf573099ck
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock public $type$ get() {
3baa08fc5b6bea08a475b0cfe3ad161d74c5864bek return Bits.get$Type$$BO$(bb, ix(nextGetIndex()));
3baa08fc5b6bea08a475b0cfe3ad161d74c5864bek }
74e7dc986c89efca1f2e4451c7a572e05e4a6e4fMatthew Ahrens
74e7dc986c89efca1f2e4451c7a572e05e4a6e4fMatthew Ahrens public $type$ get(int i) {
74e7dc986c89efca1f2e4451c7a572e05e4a6e4fMatthew Ahrens return Bits.get$Type$$BO$(bb, ix(checkIndex(i)));
74e7dc986c89efca1f2e4451c7a572e05e4a6e4fMatthew Ahrens }
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor#end[rw]
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby public $Type$Buffer put($type$ x) {
e09fa4dacfb671e707d50a55ae9b5cc191e1b8cbNeil Perrin#if[rw]
1d7132005da8d75994a6ad204e6ec05ef5ffaa4bEric Schrock Bits.put$Type$$BO$(bb, ix(nextPutIndex()), x);
1d7132005da8d75994a6ad204e6ec05ef5ffaa4bEric Schrock return this;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick#else[rw]
4201a95e0468170d576f82c3aa63afecf718497aRic Aleshire throw new ReadOnlyBufferException();
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante#end[rw]
187d6ac08adc31ea6868bde0cfbbb288826254e8Matt Ahrens }
19b94df933188a15d4f0d6c568f0bab3f127892eMatthew Ahrens
19b94df933188a15d4f0d6c568f0bab3f127892eMatthew Ahrens public $Type$Buffer put(int i, $type$ x) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens#if[rw]
fa9e4066f08beec538e775443c5be79dd423fcabahrens Bits.put$Type$$BO$(bb, ix(checkIndex(i)), x);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return this;
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens#else[rw]
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens throw new ReadOnlyBufferException();
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens#end[rw]
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens }
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens public $Type$Buffer compact() {
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens#if[rw]
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens int pos = position();
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens int lim = limit();
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens assert (pos <= lim);
990b4856d0eaada6f8140335733a1b1771ed2746lling int rem = (pos <= lim ? lim - pos : 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling
b87f3af36bb994656da117319f5129ddfd05ed21perrin ByteBuffer db = bb.duplicate();
990b4856d0eaada6f8140335733a1b1771ed2746lling db.limit(ix(lim));
990b4856d0eaada6f8140335733a1b1771ed2746lling db.position(ix(0));
990b4856d0eaada6f8140335733a1b1771ed2746lling ByteBuffer sb = db.slice();
990b4856d0eaada6f8140335733a1b1771ed2746lling sb.position(pos << $LG_BYTES_PER_VALUE$);
990b4856d0eaada6f8140335733a1b1771ed2746lling sb.compact();
990b4856d0eaada6f8140335733a1b1771ed2746lling position(rem);
990b4856d0eaada6f8140335733a1b1771ed2746lling limit(capacity());
990b4856d0eaada6f8140335733a1b1771ed2746lling discardMark();
990b4856d0eaada6f8140335733a1b1771ed2746lling return this;
990b4856d0eaada6f8140335733a1b1771ed2746lling#else[rw]
990b4856d0eaada6f8140335733a1b1771ed2746lling throw new ReadOnlyBufferException();
990b4856d0eaada6f8140335733a1b1771ed2746lling#end[rw]
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock public boolean isDirect() {
0a4e9518a44f226be6d39383330b5b1792d2f184gw return bb.isDirect();
d5b5bb256c576fe5ef26e0795bd40abe77f93246Rich Morris }
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick public boolean isReadOnly() {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick return {#if[rw]?false:true};
485bbbf5450c6645352388d798251c1a89ef4c9cGeorge Wilson }
485bbbf5450c6645352388d798251c1a89ef4c9cGeorge Wilson
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson#if[char]
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald
4263d13f00c9691fa14620eff82abef795be0693George Wilson public String toString(int start, int end) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((end > limit()) || (start > end))
990b4856d0eaada6f8140335733a1b1771ed2746lling throw new IndexOutOfBoundsException();
b1b8ab34de515a5e83206da22c3d7e563241b021lling try {
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald int len = end - start;
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald char[] ca = new char[len];
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald CharBuffer cb = CharBuffer.wrap(ca);
990b4856d0eaada6f8140335733a1b1771ed2746lling CharBuffer db = this.duplicate();
990b4856d0eaada6f8140335733a1b1771ed2746lling db.position(start);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock db.limit(end);
990b4856d0eaada6f8140335733a1b1771ed2746lling cb.put(db);
990b4856d0eaada6f8140335733a1b1771ed2746lling return new String(ca);
7f7322febbcfe774b7270abc3b191c094bfcc517eschrock } catch (StringIndexOutOfBoundsException x) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling throw new IndexOutOfBoundsException();
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson // --- Methods to support CharSequence ---
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson
990b4856d0eaada6f8140335733a1b1771ed2746lling public CharBuffer subSequence(int start, int end) {
990b4856d0eaada6f8140335733a1b1771ed2746lling int pos = position();
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson int lim = limit();
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson assert (pos <= lim);
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson pos = (pos <= lim ? pos : lim);
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson int len = lim - pos;
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson if ((start < 0) || (end > len) || (start > end))
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson throw new IndexOutOfBoundsException();
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson return new ByteBufferAsCharBuffer$RW$$BO$(bb,
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson -1,
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson pos + start,
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson pos + end,
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson capacity(),
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson offset);
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson }
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson#end[char]
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling public ByteOrder order() {
990b4856d0eaada6f8140335733a1b1771ed2746lling#if[boB]
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return ByteOrder.BIG_ENDIAN;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh#end[boB]
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh#if[boL]
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return ByteOrder.LITTLE_ENDIAN;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh#end[boL]
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh }
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling