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 HeapDoubleBuffer.
31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */
32dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
33996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmeraclass HeapDoubleBuffer extends DoubleBuffer {
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 double[] hb;
40996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera      protected final int offset;
41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    */
43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
44996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    HeapDoubleBuffer(int cap, int lim) {            // package-private
45996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(cap, lim, false);
46dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
48dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    HeapDoubleBuffer(double[] buf, int off, int len) { // package-private
49996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(buf, off, len, false);
50996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
52996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    protected HeapDoubleBuffer(double[] buf,
53996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                               int mark, int pos, int lim, int cap,
54996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                               int off) {
55996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this(buf, mark, pos, lim, cap, off, false);
56996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
57dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
58996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    HeapDoubleBuffer(int cap, int lim, boolean isReadOnly) {            // package-private
59996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        super(-1, 0, lim, cap, new double[cap], 0);
60996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this.isReadOnly = isReadOnly;
61996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    }
62dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
63996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera    HeapDoubleBuffer(double[] buf, int off, int len, boolean isReadOnly) { // package-private
64996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        super(-1, off, off + len, buf.length, buf, 0);
65996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        this.isReadOnly = isReadOnly;
66dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
67dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
68dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    protected HeapDoubleBuffer(double[] 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
75996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera
76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public DoubleBuffer slice() {
77dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return new HeapDoubleBuffer(hb,
78996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    -1,
79996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    0,
80996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.remaining(),
81996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.remaining(),
82996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.position() + offset,
83996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    isReadOnly);
84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public DoubleBuffer duplicate() {
87dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return new HeapDoubleBuffer(hb,
88996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.markValue(),
89996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.position(),
90996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.limit(),
91996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    this.capacity(),
92996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    offset,
93996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera                                    isReadOnly);
94dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
95dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
96dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public DoubleBuffer asReadOnlyBuffer() {
97996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera        return new HeapDoubleBuffer(hb,
98dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                                     this.markValue(),
99dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                                     this.position(),
100dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                                     this.limit(),
101dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski                                     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 double get() {
110dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return hb[ix(nextGetIndex())];
111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
113dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public double get(int i) {
114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return hb[ix(checkIndex(i))];
115dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
116dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public DoubleBuffer get(double[] 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 DoubleBuffer put(double 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 DoubleBuffer put(int i, double 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 DoubleBuffer put(double[] 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 DoubleBuffer put(DoubleBuffer 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 HeapDoubleBuffer) {
170dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            HeapDoubleBuffer sb = (HeapDoubleBuffer)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 DoubleBuffer 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