1dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
3dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
4dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
6dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
7dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
8dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
9dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
10dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
11dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
12dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
13dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
16dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * accompanied this code).
17dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
18dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
19dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
20dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
22dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
24dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * questions.
25dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */
26dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
27dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskipackage java.nio;
28dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
29dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski/**
30dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * A read/write HeapShortBuffer.
31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */
32dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
33996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmeraclass HeapShortBuffer extends ShortBuffer {
34dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
35dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // For speed these fields are actually declared in X-Buffer;
36dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // these declarations are here as documentation
37dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    /*
38dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
39996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera      protected final short[] hb;
40996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera      protected final int offset;
41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    */
43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
44dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    HeapShortBuffer(int cap, int lim) {            // package-private
45996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(cap, lim, false);
46996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
48996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    HeapShortBuffer(int cap, int lim, boolean isReadOnly) {            // package-private
49dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, 0, lim, cap, new short[cap], 0);
50996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this.isReadOnly = isReadOnly;
51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
52dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
53dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    HeapShortBuffer(short[] buf, int off, int len) { // package-private
54996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(buf, off, len, false);
55996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
56dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
57996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    HeapShortBuffer(short[] buf, int off, int len, boolean isReadOnly) { // package-private
58dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, off, off + len, buf.length, buf, 0);
59996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this.isReadOnly = isReadOnly;
60dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
61dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
62dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    protected HeapShortBuffer(short[] buf,
63996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                              int mark, int pos, int lim, int cap,
64996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                              int off) {
65996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(buf, mark, pos, lim, cap, off, false);
66996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
67dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
68996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    protected HeapShortBuffer(short[] buf,
69996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                              int mark, int pos, int lim, int cap,
70996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                              int off, boolean isReadOnly) {
71dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(mark, pos, lim, cap, buf, off);
72996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this.isReadOnly = isReadOnly;
73dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
74dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
75dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer slice() {
76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return new HeapShortBuffer(hb,
77996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   -1,
78996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   0,
79996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   this.remaining(),
80996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   this.remaining(),
81996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   this.position() + offset,
82996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   isReadOnly);
83dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer duplicate() {
86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return new HeapShortBuffer(hb,
87996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   this.markValue(),
88996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   this.position(),
89996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   this.limit(),
90996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   this.capacity(),
91996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   offset,
92996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                   isReadOnly);
93dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
94dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
95dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer asReadOnlyBuffer() {
96dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
97996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        return new HeapShortBuffer(hb,
98996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.markValue(),
99996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.position(),
100996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.limit(),
101996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.capacity(),
102996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    offset, true);
103dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
104dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
105dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    protected int ix(int i) {
106dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return i + offset;
107dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
108dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
109dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public short get() {
110dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return hb[ix(nextGetIndex())];
111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
113dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public short get(int i) {
114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return hb[ix(checkIndex(i))];
115dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
116dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer get(short[] dst, int offset, int length) {
118dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        checkBounds(offset, length, dst.length);
119dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        if (length > remaining())
120dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            throw new BufferUnderflowException();
121dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        System.arraycopy(hb, ix(position()), dst, offset, length);
122dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(position() + length);
123dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
124dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
125dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
126dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public boolean isDirect() {
127dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return false;
128dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
129dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
130dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public boolean isReadOnly() {
131996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        return isReadOnly;
132dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
133dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
134dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer put(short x) {
135996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
136996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
137996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
138dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        hb[ix(nextPutIndex())] = x;
139dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
140dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
141dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
142dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer put(int i, short x) {
143996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
144996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
145996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
146dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        hb[ix(checkIndex(i))] = x;
147dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
148dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
149dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
150dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer put(short[] src, int offset, int length) {
151996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
152996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
153996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
154dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        checkBounds(offset, length, src.length);
155dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        if (length > remaining())
156dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            throw new BufferOverflowException();
157dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        System.arraycopy(src, offset, hb, ix(position()), length);
158dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(position() + length);
159dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
160dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
161dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
162dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer put(ShortBuffer src) {
1633f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov        if (src == this) {
1643f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov            throw new IllegalArgumentException();
1653f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov        }
166996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
167996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
168996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
169dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        if (src instanceof HeapShortBuffer) {
170dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            HeapShortBuffer sb = (HeapShortBuffer)src;
171dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            int n = sb.remaining();
172dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            if (n > remaining())
173dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                throw new BufferOverflowException();
174dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            System.arraycopy(sb.hb, sb.ix(sb.position()),
175dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                             hb, ix(position()), n);
176dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            sb.position(sb.position() + n);
177dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            position(position() + n);
178dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        } else if (src.isDirect()) {
179dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            int n = src.remaining();
180dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            if (n > remaining())
181dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                throw new BufferOverflowException();
182dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            src.get(hb, ix(position()), n);
183dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            position(position() + n);
184dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        } else {
185dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            super.put(src);
186dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        }
187dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
188dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
189dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
190dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer compact() {
191996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
192996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
193996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
194dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        System.arraycopy(hb, ix(position()), hb, ix(0), remaining());
195dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(remaining());
196dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        limit(capacity());
197dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        discardMark();
198dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
199dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
200dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
201dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteOrder order() {
202dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return ByteOrder.nativeOrder();
203dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
204dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski}
205