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 HeapFloatBuffer.
31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */
32dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
33996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmeraclass HeapFloatBuffer extends FloatBuffer {
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 float[] hb;
40996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera      protected final int offset;
41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    */
43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
44dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    HeapFloatBuffer(int cap, int lim) {            // package-private
45996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(cap, lim, false);
46996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
48996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    HeapFloatBuffer(int cap, int lim, boolean isReadOnly) {            // package-private
49dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, 0, lim, cap, new float[cap], 0);
50996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this.isReadOnly = isReadOnly;
51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
52dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
53dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    HeapFloatBuffer(float[] buf, int off, int len) { // package-private
54996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(buf, off, len, false);
55996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
56dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
57996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    HeapFloatBuffer(float[] 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 HeapFloatBuffer(float[] 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 HeapFloatBuffer(float[] 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 FloatBuffer slice() {
76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return new HeapFloatBuffer(hb,
77190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                -1,
78190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                0,
79190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.remaining(),
80190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.remaining(),
81190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.position() + offset,
82190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                isReadOnly);
83dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer duplicate() {
86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return new HeapFloatBuffer(hb,
87190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.markValue(),
88190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.position(),
89190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.limit(),
90190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.capacity(),
91190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                offset,
92190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                isReadOnly);
93dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
94dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
95dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer asReadOnlyBuffer() {
96996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        return new HeapFloatBuffer(hb,
97190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.markValue(),
98190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.position(),
99190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.limit(),
100190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.capacity(),
101190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                offset, true);
102dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
103dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
104dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    protected int ix(int i) {
105dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return i + offset;
106dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
107dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
108dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public float get() {
109dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return hb[ix(nextGetIndex())];
110dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public float get(int i) {
113dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return hb[ix(checkIndex(i))];
114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
115dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
116dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer get(float[] dst, int offset, int length) {
117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        checkBounds(offset, length, dst.length);
118dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        if (length > remaining())
119dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            throw new BufferUnderflowException();
120dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        System.arraycopy(hb, ix(position()), dst, offset, length);
121dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(position() + length);
122dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
123dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
124dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
125dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public boolean isDirect() {
126dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return false;
127dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
128dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
129dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public boolean isReadOnly() {
130996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        return isReadOnly;
131dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
132dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
133dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer put(float x) {
134996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
135996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
136996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
137dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        hb[ix(nextPutIndex())] = x;
138dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
139dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
140dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
141dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer put(int i, float x) {
142996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
143996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
144996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
145dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        hb[ix(checkIndex(i))] = x;
146dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
147dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
148dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
149dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer put(float[] src, int offset, int length) {
150996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
151996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
152996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
153dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        checkBounds(offset, length, src.length);
154dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        if (length > remaining())
155dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            throw new BufferOverflowException();
156dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        System.arraycopy(src, offset, hb, ix(position()), length);
157dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(position() + length);
158dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
159dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
160dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
161dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer put(FloatBuffer src) {
1623f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov        if (src == this) {
1633f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov            throw new IllegalArgumentException();
1643f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov        }
165996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
166996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
167996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
168dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        if (src instanceof HeapFloatBuffer) {
169190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera            HeapFloatBuffer sb = (HeapFloatBuffer) src;
170dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            int n = sb.remaining();
171dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            if (n > remaining())
172dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                throw new BufferOverflowException();
173dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            System.arraycopy(sb.hb, sb.ix(sb.position()),
174190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                    hb, ix(position()), n);
175dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            sb.position(sb.position() + n);
176dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            position(position() + n);
177dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        } else if (src.isDirect()) {
178dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            int n = src.remaining();
179dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            if (n > remaining())
180dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                throw new BufferOverflowException();
181dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            src.get(hb, ix(position()), n);
182dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            position(position() + n);
183dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        } else {
184dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            super.put(src);
185dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        }
186dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
187dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
188dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
189dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer compact() {
190996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        if (isReadOnly) {
191996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera            throw new ReadOnlyBufferException();
192996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        }
193dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        System.arraycopy(hb, ix(position()), hb, ix(0), remaining());
194dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(remaining());
195dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        limit(capacity());
196dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        discardMark();
197dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
198dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
199dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
200dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteOrder order() {
201dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return ByteOrder.nativeOrder();
202dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
203dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski}
204