1/*
2 * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#warn This file is preprocessed before being compiled
27
28package java.nio;
29
30#if[char]
31import java.io.IOException;
32#end[char]
33#if[streamableType]
34import java.util.Spliterator;
35import java.util.stream.StreamSupport;
36import java.util.stream.$Streamtype$Stream;
37#end[streamableType]
38
39/**
40 * $A$ $type$ buffer.
41 *
42 * <p> This class defines {#if[byte]?six:four} categories of operations upon
43 * $type$ buffers:
44 *
45 * <ul>
46 *
47 *   <li><p> Absolute and relative {@link #get() <i>get</i>} and
48 *   {@link #put($type$) <i>put</i>} methods that read and write
49 *   single $type$s; </p></li>
50 *
51 *   <li><p> Relative {@link #get($type$[]) <i>bulk get</i>}
52 *   methods that transfer contiguous sequences of $type$s from this buffer
53 *   into an array; {#if[!byte]?and}</p></li>
54 *
55 *   <li><p> Relative {@link #put($type$[]) <i>bulk put</i>}
56 *   methods that transfer contiguous sequences of $type$s from $a$
57 *   $type$ array{#if[char]?,&#32;a&#32;string,} or some other $type$
58 *   buffer into this buffer;{#if[!byte]?&#32;and} </p></li>
59 *
60#if[byte]
61 *
62 *   <li><p> Absolute and relative {@link #getChar() <i>get</i>}
63 *   and {@link #putChar(char) <i>put</i>} methods that read and
64 *   write values of other primitive types, translating them to and from
65 *   sequences of bytes in a particular byte order; </p></li>
66 *
67 *   <li><p> Methods for creating <i><a href="#views">view buffers</a></i>,
68 *   which allow a byte buffer to be viewed as a buffer containing values of
69 *   some other primitive type; and </p></li>
70 *
71#end[byte]
72 *
73 *   <li><p> A method for {@link #compact compacting}
74 *   $a$ $type$ buffer.  </p></li>
75 *
76 * </ul>
77 *
78 * <p> $Type$ buffers can be created either by {@link #allocate
79 * <i>allocation</i>}, which allocates space for the buffer's
80 *
81#if[byte]
82 *
83 * content, or by {@link #wrap($type$[]) <i>wrapping</i>} an
84 * existing $type$ array {#if[char]?or&#32;string} into a buffer.
85 *
86#else[byte]
87 *
88 * content, by {@link #wrap($type$[]) <i>wrapping</i>} an existing
89 * $type$ array {#if[char]?or&#32;string} into a buffer, or by creating a
90 * <a href="ByteBuffer.html#views"><i>view</i></a> of an existing byte buffer.
91 *
92#end[byte]
93 *
94#if[byte]
95 *
96 * <a id="direct"></a>
97 * <h2> Direct <i>vs.</i> non-direct buffers </h2>
98 *
99 * <p> A byte buffer is either <i>direct</i> or <i>non-direct</i>.  Given a
100 * direct byte buffer, the Java virtual machine will make a best effort to
101 * perform native I/O operations directly upon it.  That is, it will attempt to
102 * avoid copying the buffer's content to (or from) an intermediate buffer
103 * before (or after) each invocation of one of the underlying operating
104 * system's native I/O operations.
105 *
106 * <p> A direct byte buffer may be created by invoking the {@link
107 * #allocateDirect(int) allocateDirect} factory method of this class.  The
108 * buffers returned by this method typically have somewhat higher allocation
109 * and deallocation costs than non-direct buffers.  The contents of direct
110 * buffers may reside outside of the normal garbage-collected heap, and so
111 * their impact upon the memory footprint of an application might not be
112 * obvious.  It is therefore recommended that direct buffers be allocated
113 * primarily for large, long-lived buffers that are subject to the underlying
114 * system's native I/O operations.  In general it is best to allocate direct
115 * buffers only when they yield a measureable gain in program performance.
116 *
117 * <p> A direct byte buffer may also be created by {@link
118 * java.nio.channels.FileChannel#map mapping} a region of a file
119 * directly into memory.  An implementation of the Java platform may optionally
120 * support the creation of direct byte buffers from native code via JNI.  If an
121 * instance of one of these kinds of buffers refers to an inaccessible region
122 * of memory then an attempt to access that region will not change the buffer's
123 * content and will cause an unspecified exception to be thrown either at the
124 * time of the access or at some later time.
125 *
126 * <p> Whether a byte buffer is direct or non-direct may be determined by
127 * invoking its {@link #isDirect isDirect} method.  This method is provided so
128 * that explicit buffer management can be done in performance-critical code.
129 *
130 *
131 * <a id="bin"></a>
132 * <h2> Access to binary data </h2>
133 *
134 * <p> This class defines methods for reading and writing values of all other
135 * primitive types, except {@code boolean}.  Primitive values are translated
136 * to (or from) sequences of bytes according to the buffer's current byte
137 * order, which may be retrieved and modified via the {@link #order order}
138 * methods.  Specific byte orders are represented by instances of the {@link
139 * ByteOrder} class.  The initial order of a byte buffer is always {@link
140 * ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
141 *
142 * <p> For access to heterogeneous binary data, that is, sequences of values of
143 * different types, this class defines a family of absolute and relative
144 * <i>get</i> and <i>put</i> methods for each type.  For 32-bit floating-point
145 * values, for example, this class defines:
146 *
147 * <blockquote><pre>
148 * float  {@link #getFloat()}
149 * float  {@link #getFloat(int) getFloat(int index)}
150 *  void  {@link #putFloat(float) putFloat(float f)}
151 *  void  {@link #putFloat(int,float) putFloat(int index, float f)}</pre></blockquote>
152 *
153 * <p> Corresponding methods are defined for the types {@code char,
154 * short, int, long}, and {@code double}.  The index
155 * parameters of the absolute <i>get</i> and <i>put</i> methods are in terms of
156 * bytes rather than of the type being read or written.
157 *
158 * <a id="views"></a>
159 *
160 * <p> For access to homogeneous binary data, that is, sequences of values of
161 * the same type, this class defines methods that can create <i>views</i> of a
162 * given byte buffer.  A <i>view buffer</i> is simply another buffer whose
163 * content is backed by the byte buffer.  Changes to the byte buffer's content
164 * will be visible in the view buffer, and vice versa; the two buffers'
165 * position, limit, and mark values are independent.  The {@link
166 * #asFloatBuffer() asFloatBuffer} method, for example, creates an instance of
167 * the {@link FloatBuffer} class that is backed by the byte buffer upon which
168 * the method is invoked.  Corresponding view-creation methods are defined for
169 * the types {@code char, short, int, long}, and {@code double}.
170 *
171 * <p> View buffers have three important advantages over the families of
172 * type-specific <i>get</i> and <i>put</i> methods described above:
173 *
174 * <ul>
175 *
176 *   <li><p> A view buffer is indexed not in terms of bytes but rather in terms
177 *   of the type-specific size of its values;  </p></li>
178 *
179 *   <li><p> A view buffer provides relative bulk <i>get</i> and <i>put</i>
180 *   methods that can transfer contiguous sequences of values between a buffer
181 *   and an array or some other buffer of the same type; and  </p></li>
182 *
183 *   <li><p> A view buffer is potentially much more efficient because it will
184 *   be direct if, and only if, its backing byte buffer is direct.  </p></li>
185 *
186 * </ul>
187 *
188 * <p> The byte order of a view buffer is fixed to be that of its byte buffer
189 * at the time that the view is created.  </p>
190 *
191#end[byte]
192*
193#if[!byte]
194 *
195 * <p> Like a byte buffer, $a$ $type$ buffer is either <a
196 * href="ByteBuffer.html#direct"><i>direct</i> or <i>non-direct</i></a>.  A
197 * $type$ buffer created via the {@code wrap} methods of this class will
198 * be non-direct.  $A$ $type$ buffer created as a view of a byte buffer will
199 * be direct if, and only if, the byte buffer itself is direct.  Whether or not
200 * $a$ $type$ buffer is direct may be determined by invoking the {@link
201 * #isDirect isDirect} method.  </p>
202 *
203#end[!byte]
204*
205#if[char]
206 *
207 * <p> This class implements the {@link CharSequence} interface so that
208 * character buffers may be used wherever character sequences are accepted, for
209 * example in the regular-expression package {@link java.util.regex}.
210 * </p>
211 *
212#end[char]
213 *
214#if[byte]
215 * <h2> Invocation chaining </h2>
216#end[byte]
217 *
218 * <p> Methods in this class that do not otherwise have a value to return are
219 * specified to return the buffer upon which they are invoked.  This allows
220 * method invocations to be chained.
221 *
222#if[byte]
223 *
224 * The sequence of statements
225 *
226 * <blockquote><pre>
227 * bb.putInt(0xCAFEBABE);
228 * bb.putShort(3);
229 * bb.putShort(45);</pre></blockquote>
230 *
231 * can, for example, be replaced by the single statement
232 *
233 * <blockquote><pre>
234 * bb.putInt(0xCAFEBABE).putShort(3).putShort(45);</pre></blockquote>
235 *
236#end[byte]
237#if[char]
238 *
239 * The sequence of statements
240 *
241 * <blockquote><pre>
242 * cb.put("text/");
243 * cb.put(subtype);
244 * cb.put("; charset=");
245 * cb.put(enc);</pre></blockquote>
246 *
247 * can, for example, be replaced by the single statement
248 *
249 * <blockquote><pre>
250 * cb.put("text/").put(subtype).put("; charset=").put(enc);</pre></blockquote>
251 *
252#end[char]
253 *
254 *
255 * @author Mark Reinhold
256 * @author JSR-51 Expert Group
257 * @since 1.4
258 */
259
260public abstract class $Type$Buffer
261    extends Buffer
262    implements Comparable<$Type$Buffer>{#if[char]?, Appendable, CharSequence, Readable}
263{
264
265    // These fields are declared here rather than in Heap-X-Buffer in order to
266    // reduce the number of virtual method invocations needed to access these
267    // values, which is especially costly when coding small buffers.
268    //
269    final $type$[] hb;                  // Non-null only for heap buffers
270    final int offset;
271    boolean isReadOnly;
272
273    // Creates a new buffer with the given mark, position, limit, capacity,
274    // backing array, and array offset
275    //
276    $Type$Buffer(int mark, int pos, int lim, int cap,   // package-private
277                 $type$[] hb, int offset)
278    {
279        super(mark, pos, lim, cap);
280        this.hb = hb;
281        this.offset = offset;
282    }
283
284    // Creates a new buffer with the given mark, position, limit, and capacity
285    //
286    $Type$Buffer(int mark, int pos, int lim, int cap) { // package-private
287        this(mark, pos, lim, cap, null, 0);
288    }
289
290#if[byte]
291
292    /**
293     * Allocates a new direct $type$ buffer.
294     *
295     * <p> The new buffer's position will be zero, its limit will be its
296     * capacity, its mark will be undefined, each of its elements will be
297     * initialized to zero, and its byte order will be
298     * {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.  Whether or not it has a
299     * {@link #hasArray backing array} is unspecified.
300     *
301     * @param  capacity
302     *         The new buffer's capacity, in $type$s
303     *
304     * @return  The new $type$ buffer
305     *
306     * @throws  IllegalArgumentException
307     *          If the {@code capacity} is a negative integer
308     */
309    public static $Type$Buffer allocateDirect(int capacity) {
310        return new Direct$Type$Buffer(capacity);
311    }
312
313#end[byte]
314
315    /**
316     * Allocates a new $type$ buffer.
317     *
318     * <p> The new buffer's position will be zero, its limit will be its
319     * capacity, its mark will be undefined, each of its elements will be
320     * initialized to zero, and its byte order will be
321#if[byte]
322     * {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
323#else[byte]
324     * the {@link ByteOrder#nativeOrder native order} of the underlying
325     * hardware.
326#end[byte]
327     * It will have a {@link #array backing array}, and its
328     * {@link #arrayOffset array offset} will be zero.
329     *
330     * @param  capacity
331     *         The new buffer's capacity, in $type$s
332     *
333     * @return  The new $type$ buffer
334     *
335     * @throws  IllegalArgumentException
336     *          If the {@code capacity} is a negative integer
337     */
338    public static $Type$Buffer allocate(int capacity) {
339        if (capacity < 0)
340            throw createCapacityException(capacity);
341        return new Heap$Type$Buffer(capacity, capacity);
342    }
343
344    /**
345     * Wraps $a$ $type$ array into a buffer.
346     *
347     * <p> The new buffer will be backed by the given $type$ array;
348     * that is, modifications to the buffer will cause the array to be modified
349     * and vice versa.  The new buffer's capacity will be
350     * {@code array.length}, its position will be {@code offset}, its limit
351     * will be {@code offset + length}, its mark will be undefined, and its
352     * byte order will be
353#if[byte]
354     * {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
355#else[byte]
356     * the {@link ByteOrder#nativeOrder native order} of the underlying
357     * hardware.
358#end[byte]
359     * Its {@link #array backing array} will be the given array, and
360     * its {@link #arrayOffset array offset} will be zero.  </p>
361     *
362     * @param  array
363     *         The array that will back the new buffer
364     *
365     * @param  offset
366     *         The offset of the subarray to be used; must be non-negative and
367     *         no larger than {@code array.length}.  The new buffer's position
368     *         will be set to this value.
369     *
370     * @param  length
371     *         The length of the subarray to be used;
372     *         must be non-negative and no larger than
373     *         {@code array.length - offset}.
374     *         The new buffer's limit will be set to {@code offset + length}.
375     *
376     * @return  The new $type$ buffer
377     *
378     * @throws  IndexOutOfBoundsException
379     *          If the preconditions on the {@code offset} and {@code length}
380     *          parameters do not hold
381     */
382    public static $Type$Buffer wrap($type$[] array,
383                                    int offset, int length)
384    {
385        try {
386            return new Heap$Type$Buffer(array, offset, length);
387        } catch (IllegalArgumentException x) {
388            throw new IndexOutOfBoundsException();
389        }
390    }
391
392    /**
393     * Wraps $a$ $type$ array into a buffer.
394     *
395     * <p> The new buffer will be backed by the given $type$ array;
396     * that is, modifications to the buffer will cause the array to be modified
397     * and vice versa.  The new buffer's capacity and limit will be
398     * {@code array.length}, its position will be zero, its mark will be
399     * undefined, and its byte order will be
400#if[byte]
401     * {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
402#else[byte]
403     * the {@link ByteOrder#nativeOrder native order} of the underlying
404     * hardware.
405#end[byte]
406     * Its {@link #array backing array} will be the given array, and its
407     * {@link #arrayOffset array offset} will be zero.  </p>
408     *
409     * @param  array
410     *         The array that will back this buffer
411     *
412     * @return  The new $type$ buffer
413     */
414    public static $Type$Buffer wrap($type$[] array) {
415        return wrap(array, 0, array.length);
416    }
417
418#if[char]
419
420    /**
421     * Attempts to read characters into the specified character buffer.
422     * The buffer is used as a repository of characters as-is: the only
423     * changes made are the results of a put operation. No flipping or
424     * rewinding of the buffer is performed.
425     *
426     * @param target the buffer to read characters into
427     * @return The number of characters added to the buffer, or
428     *         -1 if this source of characters is at its end
429     * @throws IOException if an I/O error occurs
430     * @throws NullPointerException if target is null
431     * @throws ReadOnlyBufferException if target is a read only buffer
432     * @since 1.5
433     */
434    public int read(CharBuffer target) throws IOException {
435        // Determine the number of bytes n that can be transferred
436        int targetRemaining = target.remaining();
437        int remaining = remaining();
438        if (remaining == 0)
439            return -1;
440        int n = Math.min(remaining, targetRemaining);
441        int limit = limit();
442        // Set source limit to prevent target overflow
443        if (targetRemaining < remaining)
444            limit(position() + n);
445        try {
446            if (n > 0)
447                target.put(this);
448        } finally {
449            limit(limit); // restore real limit
450        }
451        return n;
452    }
453
454    /**
455     * Wraps a character sequence into a buffer.
456     *
457     * <p> The content of the new, read-only buffer will be the content of the
458     * given character sequence.  The buffer's capacity will be
459     * {@code csq.length()}, its position will be {@code start}, its limit
460     * will be {@code end}, and its mark will be undefined.  </p>
461     *
462     * @param  csq
463     *         The character sequence from which the new character buffer is to
464     *         be created
465     *
466     * @param  start
467     *         The index of the first character to be used;
468     *         must be non-negative and no larger than {@code csq.length()}.
469     *         The new buffer's position will be set to this value.
470     *
471     * @param  end
472     *         The index of the character following the last character to be
473     *         used; must be no smaller than {@code start} and no larger
474     *         than {@code csq.length()}.
475     *         The new buffer's limit will be set to this value.
476     *
477     * @return  The new character buffer
478     *
479     * @throws  IndexOutOfBoundsException
480     *          If the preconditions on the {@code start} and {@code end}
481     *          parameters do not hold
482     */
483    public static CharBuffer wrap(CharSequence csq, int start, int end) {
484        try {
485            return new StringCharBuffer(csq, start, end);
486        } catch (IllegalArgumentException x) {
487            throw new IndexOutOfBoundsException();
488        }
489    }
490
491    /**
492     * Wraps a character sequence into a buffer.
493     *
494     * <p> The content of the new, read-only buffer will be the content of the
495     * given character sequence.  The new buffer's capacity and limit will be
496     * {@code csq.length()}, its position will be zero, and its mark will be
497     * undefined.  </p>
498     *
499     * @param  csq
500     *         The character sequence from which the new character buffer is to
501     *         be created
502     *
503     * @return  The new character buffer
504     */
505    public static CharBuffer wrap(CharSequence csq) {
506        return wrap(csq, 0, csq.length());
507    }
508
509#end[char]
510
511    /**
512     * Creates a new $type$ buffer whose content is a shared subsequence of
513     * this buffer's content.
514     *
515     * <p> The content of the new buffer will start at this buffer's current
516     * position.  Changes to this buffer's content will be visible in the new
517     * buffer, and vice versa; the two buffers' position, limit, and mark
518     * values will be independent.
519     *
520     * <p> The new buffer's position will be zero, its capacity and its limit
521     * will be the number of $type$s remaining in this buffer, its mark will be
522     * undefined, and its byte order will be
523#if[byte]
524     * {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
525#else[byte]
526     * identical to that of this buffer.
527#end[byte]
528     * The new buffer will be direct if, and only if, this buffer is direct, and
529     * it will be read-only if, and only if, this buffer is read-only.  </p>
530     *
531     * @return  The new $type$ buffer
532#if[byte]
533     *
534     * @see #alignedSlice(int)
535#end[byte]
536     */
537    @Override
538    public abstract $Type$Buffer slice();
539
540    /**
541     * Creates a new $type$ buffer that shares this buffer's content.
542     *
543     * <p> The content of the new buffer will be that of this buffer.  Changes
544     * to this buffer's content will be visible in the new buffer, and vice
545     * versa; the two buffers' position, limit, and mark values will be
546     * independent.
547     *
548     * <p> The new buffer's capacity, limit, position,
549#if[byte]
550     * and mark values will be identical to those of this buffer, and its byte
551     * order will be {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
552#else[byte]
553     * mark values, and byte order will be identical to those of this buffer.
554#end[byte]
555     * The new buffer will be direct if, and only if, this buffer is direct, and
556     * it will be read-only if, and only if, this buffer is read-only.  </p>
557     *
558     * @return  The new $type$ buffer
559     */
560    @Override
561    public abstract $Type$Buffer duplicate();
562
563    /**
564     * Creates a new, read-only $type$ buffer that shares this buffer's
565     * content.
566     *
567     * <p> The content of the new buffer will be that of this buffer.  Changes
568     * to this buffer's content will be visible in the new buffer; the new
569     * buffer itself, however, will be read-only and will not allow the shared
570     * content to be modified.  The two buffers' position, limit, and mark
571     * values will be independent.
572     *
573     * <p> The new buffer's capacity, limit, position,
574#if[byte]
575     * and mark values will be identical to those of this buffer, and its byte
576     * order will be {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
577#else[byte]
578     * mark values, and byte order will be identical to those of this buffer.
579#end[byte]
580     *
581     * <p> If this buffer is itself read-only then this method behaves in
582     * exactly the same way as the {@link #duplicate duplicate} method.  </p>
583     *
584     * @return  The new, read-only $type$ buffer
585     */
586    public abstract $Type$Buffer asReadOnlyBuffer();
587
588
589    // -- Singleton get/put methods --
590
591    /**
592     * Relative <i>get</i> method.  Reads the $type$ at this buffer's
593     * current position, and then increments the position.
594     *
595     * @return  The $type$ at the buffer's current position
596     *
597     * @throws  BufferUnderflowException
598     *          If the buffer's current position is not smaller than its limit
599     */
600    public abstract $type$ get();
601
602    /**
603     * Relative <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>.
604     *
605     * <p> Writes the given $type$ into this buffer at the current
606     * position, and then increments the position. </p>
607     *
608     * @param  $x$
609     *         The $type$ to be written
610     *
611     * @return  This buffer
612     *
613     * @throws  BufferOverflowException
614     *          If this buffer's current position is not smaller than its limit
615     *
616     * @throws  ReadOnlyBufferException
617     *          If this buffer is read-only
618     */
619    public abstract $Type$Buffer put($type$ $x$);
620
621    /**
622     * Absolute <i>get</i> method.  Reads the $type$ at the given
623     * index.
624     *
625     * @param  index
626     *         The index from which the $type$ will be read
627     *
628     * @return  The $type$ at the given index
629     *
630     * @throws  IndexOutOfBoundsException
631     *          If {@code index} is negative
632     *          or not smaller than the buffer's limit
633     */
634    public abstract $type$ get(int index);
635
636#if[streamableType]
637    /**
638     * Absolute <i>get</i> method.  Reads the $type$ at the given
639     * index without any validation of the index.
640     *
641     * @param  index
642     *         The index from which the $type$ will be read
643     *
644     * @return  The $type$ at the given index
645     */
646    abstract $type$ getUnchecked(int index);   // package-private
647#end[streamableType]
648
649    /**
650     * Absolute <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>.
651     *
652     * <p> Writes the given $type$ into this buffer at the given
653     * index. </p>
654     *
655     * @param  index
656     *         The index at which the $type$ will be written
657     *
658     * @param  $x$
659     *         The $type$ value to be written
660     *
661     * @return  This buffer
662     *
663     * @throws  IndexOutOfBoundsException
664     *          If {@code index} is negative
665     *          or not smaller than the buffer's limit
666     *
667     * @throws  ReadOnlyBufferException
668     *          If this buffer is read-only
669     */
670    public abstract $Type$Buffer put(int index, $type$ $x$);
671
672
673    // -- Bulk get operations --
674
675    /**
676     * Relative bulk <i>get</i> method.
677     *
678     * <p> This method transfers $type$s from this buffer into the given
679     * destination array.  If there are fewer $type$s remaining in the
680     * buffer than are required to satisfy the request, that is, if
681     * {@code length}&nbsp;{@code >}&nbsp;{@code remaining()}, then no
682     * $type$s are transferred and a {@link BufferUnderflowException} is
683     * thrown.
684     *
685     * <p> Otherwise, this method copies {@code length} $type$s from this
686     * buffer into the given array, starting at the current position of this
687     * buffer and at the given offset in the array.  The position of this
688     * buffer is then incremented by {@code length}.
689     *
690     * <p> In other words, an invocation of this method of the form
691     * <code>src.get(dst,&nbsp;off,&nbsp;len)</code> has exactly the same effect as
692     * the loop
693     *
694     * <pre>{@code
695     *     for (int i = off; i < off + len; i++)
696     *         dst[i] = src.get():
697     * }</pre>
698     *
699     * except that it first checks that there are sufficient $type$s in
700     * this buffer and it is potentially much more efficient.
701     *
702     * @param  dst
703     *         The array into which $type$s are to be written
704     *
705     * @param  offset
706     *         The offset within the array of the first $type$ to be
707     *         written; must be non-negative and no larger than
708     *         {@code dst.length}
709     *
710     * @param  length
711     *         The maximum number of $type$s to be written to the given
712     *         array; must be non-negative and no larger than
713     *         {@code dst.length - offset}
714     *
715     * @return  This buffer
716     *
717     * @throws  BufferUnderflowException
718     *          If there are fewer than {@code length} $type$s
719     *          remaining in this buffer
720     *
721     * @throws  IndexOutOfBoundsException
722     *          If the preconditions on the {@code offset} and {@code length}
723     *          parameters do not hold
724     */
725    public $Type$Buffer get($type$[] dst, int offset, int length) {
726        checkBounds(offset, length, dst.length);
727        if (length > remaining())
728            throw new BufferUnderflowException();
729        int end = offset + length;
730        for (int i = offset; i < end; i++)
731            dst[i] = get();
732        return this;
733    }
734
735    /**
736     * Relative bulk <i>get</i> method.
737     *
738     * <p> This method transfers $type$s from this buffer into the given
739     * destination array.  An invocation of this method of the form
740     * {@code src.get(a)} behaves in exactly the same way as the invocation
741     *
742     * <pre>
743     *     src.get(a, 0, a.length) </pre>
744     *
745     * @param   dst
746     *          The destination array
747     *
748     * @return  This buffer
749     *
750     * @throws  BufferUnderflowException
751     *          If there are fewer than {@code length} $type$s
752     *          remaining in this buffer
753     */
754    public $Type$Buffer get($type$[] dst) {
755        return get(dst, 0, dst.length);
756    }
757
758
759    // -- Bulk put operations --
760
761    /**
762     * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>.
763     *
764     * <p> This method transfers the $type$s remaining in the given source
765     * buffer into this buffer.  If there are more $type$s remaining in the
766     * source buffer than in this buffer, that is, if
767     * {@code src.remaining()}&nbsp;{@code >}&nbsp;{@code remaining()},
768     * then no $type$s are transferred and a {@link
769     * BufferOverflowException} is thrown.
770     *
771     * <p> Otherwise, this method copies
772     * <i>n</i>&nbsp;=&nbsp;{@code src.remaining()} $type$s from the given
773     * buffer into this buffer, starting at each buffer's current position.
774     * The positions of both buffers are then incremented by <i>n</i>.
775     *
776     * <p> In other words, an invocation of this method of the form
777     * {@code dst.put(src)} has exactly the same effect as the loop
778     *
779     * <pre>
780     *     while (src.hasRemaining())
781     *         dst.put(src.get()); </pre>
782     *
783     * except that it first checks that there is sufficient space in this
784     * buffer and it is potentially much more efficient.
785     *
786     * @param  src
787     *         The source buffer from which $type$s are to be read;
788     *         must not be this buffer
789     *
790     * @return  This buffer
791     *
792     * @throws  BufferOverflowException
793     *          If there is insufficient space in this buffer
794     *          for the remaining $type$s in the source buffer
795     *
796     * @throws  IllegalArgumentException
797     *          If the source buffer is this buffer
798     *
799     * @throws  ReadOnlyBufferException
800     *          If this buffer is read-only
801     */
802    public $Type$Buffer put($Type$Buffer src) {
803        if (src == this)
804            throw createSameBufferException();
805        if (isReadOnly())
806            throw new ReadOnlyBufferException();
807        int n = src.remaining();
808        if (n > remaining())
809            throw new BufferOverflowException();
810        for (int i = 0; i < n; i++)
811            put(src.get());
812        return this;
813    }
814
815    /**
816     * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>.
817     *
818     * <p> This method transfers $type$s into this buffer from the given
819     * source array.  If there are more $type$s to be copied from the array
820     * than remain in this buffer, that is, if
821     * {@code length}&nbsp;{@code >}&nbsp;{@code remaining()}, then no
822     * $type$s are transferred and a {@link BufferOverflowException} is
823     * thrown.
824     *
825     * <p> Otherwise, this method copies {@code length} $type$s from the
826     * given array into this buffer, starting at the given offset in the array
827     * and at the current position of this buffer.  The position of this buffer
828     * is then incremented by {@code length}.
829     *
830     * <p> In other words, an invocation of this method of the form
831     * <code>dst.put(src,&nbsp;off,&nbsp;len)</code> has exactly the same effect as
832     * the loop
833     *
834     * <pre>{@code
835     *     for (int i = off; i < off + len; i++)
836     *         dst.put(a[i]);
837     * }</pre>
838     *
839     * except that it first checks that there is sufficient space in this
840     * buffer and it is potentially much more efficient.
841     *
842     * @param  src
843     *         The array from which $type$s are to be read
844     *
845     * @param  offset
846     *         The offset within the array of the first $type$ to be read;
847     *         must be non-negative and no larger than {@code array.length}
848     *
849     * @param  length
850     *         The number of $type$s to be read from the given array;
851     *         must be non-negative and no larger than
852     *         {@code array.length - offset}
853     *
854     * @return  This buffer
855     *
856     * @throws  BufferOverflowException
857     *          If there is insufficient space in this buffer
858     *
859     * @throws  IndexOutOfBoundsException
860     *          If the preconditions on the {@code offset} and {@code length}
861     *          parameters do not hold
862     *
863     * @throws  ReadOnlyBufferException
864     *          If this buffer is read-only
865     */
866    public $Type$Buffer put($type$[] src, int offset, int length) {
867        checkBounds(offset, length, src.length);
868        if (length > remaining())
869            throw new BufferOverflowException();
870        int end = offset + length;
871        for (int i = offset; i < end; i++)
872            this.put(src[i]);
873        return this;
874    }
875
876    /**
877     * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>.
878     *
879     * <p> This method transfers the entire content of the given source
880     * $type$ array into this buffer.  An invocation of this method of the
881     * form {@code dst.put(a)} behaves in exactly the same way as the
882     * invocation
883     *
884     * <pre>
885     *     dst.put(a, 0, a.length) </pre>
886     *
887     * @param   src
888     *          The source array
889     *
890     * @return  This buffer
891     *
892     * @throws  BufferOverflowException
893     *          If there is insufficient space in this buffer
894     *
895     * @throws  ReadOnlyBufferException
896     *          If this buffer is read-only
897     */
898    public final $Type$Buffer put($type$[] src) {
899        return put(src, 0, src.length);
900    }
901
902#if[char]
903
904    /**
905     * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>.
906     *
907     * <p> This method transfers $type$s from the given string into this
908     * buffer.  If there are more $type$s to be copied from the string than
909     * remain in this buffer, that is, if
910     * <code>end&nbsp;-&nbsp;start</code>&nbsp;{@code >}&nbsp;{@code remaining()},
911     * then no $type$s are transferred and a {@link
912     * BufferOverflowException} is thrown.
913     *
914     * <p> Otherwise, this method copies
915     * <i>n</i>&nbsp;=&nbsp;{@code end}&nbsp;-&nbsp;{@code start} $type$s
916     * from the given string into this buffer, starting at the given
917     * {@code start} index and at the current position of this buffer.  The
918     * position of this buffer is then incremented by <i>n</i>.
919     *
920     * <p> In other words, an invocation of this method of the form
921     * <code>dst.put(src,&nbsp;start,&nbsp;end)</code> has exactly the same effect
922     * as the loop
923     *
924     * <pre>{@code
925     *     for (int i = start; i < end; i++)
926     *         dst.put(src.charAt(i));
927     * }</pre>
928     *
929     * except that it first checks that there is sufficient space in this
930     * buffer and it is potentially much more efficient.
931     *
932     * @param  src
933     *         The string from which $type$s are to be read
934     *
935     * @param  start
936     *         The offset within the string of the first $type$ to be read;
937     *         must be non-negative and no larger than
938     *         {@code string.length()}
939     *
940     * @param  end
941     *         The offset within the string of the last $type$ to be read,
942     *         plus one; must be non-negative and no larger than
943     *         {@code string.length()}
944     *
945     * @return  This buffer
946     *
947     * @throws  BufferOverflowException
948     *          If there is insufficient space in this buffer
949     *
950     * @throws  IndexOutOfBoundsException
951     *          If the preconditions on the {@code start} and {@code end}
952     *          parameters do not hold
953     *
954     * @throws  ReadOnlyBufferException
955     *          If this buffer is read-only
956     */
957    public $Type$Buffer put(String src, int start, int end) {
958        checkBounds(start, end - start, src.length());
959        if (isReadOnly())
960            throw new ReadOnlyBufferException();
961        if (end - start > remaining())
962            throw new BufferOverflowException();
963        for (int i = start; i < end; i++)
964            this.put(src.charAt(i));
965        return this;
966    }
967
968    /**
969     * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>.
970     *
971     * <p> This method transfers the entire content of the given source string
972     * into this buffer.  An invocation of this method of the form
973     * {@code dst.put(s)} behaves in exactly the same way as the invocation
974     *
975     * <pre>
976     *     dst.put(s, 0, s.length()) </pre>
977     *
978     * @param   src
979     *          The source string
980     *
981     * @return  This buffer
982     *
983     * @throws  BufferOverflowException
984     *          If there is insufficient space in this buffer
985     *
986     * @throws  ReadOnlyBufferException
987     *          If this buffer is read-only
988     */
989    public final $Type$Buffer put(String src) {
990        return put(src, 0, src.length());
991    }
992
993#end[char]
994
995
996    // -- Other stuff --
997
998    /**
999     * Tells whether or not this buffer is backed by an accessible $type$
1000     * array.
1001     *
1002     * <p> If this method returns {@code true} then the {@link #array() array}
1003     * and {@link #arrayOffset() arrayOffset} methods may safely be invoked.
1004     * </p>
1005     *
1006     * @return  {@code true} if, and only if, this buffer
1007     *          is backed by an array and is not read-only
1008     */
1009    public final boolean hasArray() {
1010        return (hb != null) && !isReadOnly;
1011    }
1012
1013    /**
1014     * Returns the $type$ array that backs this
1015     * buffer&nbsp;&nbsp;<i>(optional operation)</i>.
1016     *
1017     * <p> Modifications to this buffer's content will cause the returned
1018     * array's content to be modified, and vice versa.
1019     *
1020     * <p> Invoke the {@link #hasArray hasArray} method before invoking this
1021     * method in order to ensure that this buffer has an accessible backing
1022     * array.  </p>
1023     *
1024     * @return  The array that backs this buffer
1025     *
1026     * @throws  ReadOnlyBufferException
1027     *          If this buffer is backed by an array but is read-only
1028     *
1029     * @throws  UnsupportedOperationException
1030     *          If this buffer is not backed by an accessible array
1031     */
1032    public final $type$[] array() {
1033        if (hb == null)
1034            throw new UnsupportedOperationException();
1035        if (isReadOnly)
1036            throw new ReadOnlyBufferException();
1037        return hb;
1038    }
1039
1040    /**
1041     * Returns the offset within this buffer's backing array of the first
1042     * element of the buffer&nbsp;&nbsp;<i>(optional operation)</i>.
1043     *
1044     * <p> If this buffer is backed by an array then buffer position <i>p</i>
1045     * corresponds to array index <i>p</i>&nbsp;+&nbsp;{@code arrayOffset()}.
1046     *
1047     * <p> Invoke the {@link #hasArray hasArray} method before invoking this
1048     * method in order to ensure that this buffer has an accessible backing
1049     * array.  </p>
1050     *
1051     * @return  The offset within this buffer's array
1052     *          of the first element of the buffer
1053     *
1054     * @throws  ReadOnlyBufferException
1055     *          If this buffer is backed by an array but is read-only
1056     *
1057     * @throws  UnsupportedOperationException
1058     *          If this buffer is not backed by an accessible array
1059     */
1060    public final int arrayOffset() {
1061        if (hb == null)
1062            throw new UnsupportedOperationException();
1063        if (isReadOnly)
1064            throw new ReadOnlyBufferException();
1065        return offset;
1066    }
1067
1068    // -- Covariant return type overrides
1069
1070    /**
1071     * {@inheritDoc}
1072     */
1073    @Override
1074    public
1075#if[!byte]
1076    final
1077#end[!byte]
1078    $Type$Buffer position(int newPosition) {
1079        super.position(newPosition);
1080        return this;
1081    }
1082    
1083    /**
1084     * {@inheritDoc}
1085     */
1086    @Override
1087    public
1088#if[!byte]
1089    final
1090#end[!byte]
1091    $Type$Buffer limit(int newLimit) {
1092        super.limit(newLimit);
1093        return this;
1094    }
1095    
1096    /**
1097     * {@inheritDoc}
1098     */
1099    @Override
1100    public 
1101#if[!byte]
1102    final
1103#end[!byte]
1104    $Type$Buffer mark() {
1105        super.mark();
1106        return this;
1107    }
1108
1109    /**
1110     * {@inheritDoc}
1111     */
1112    @Override
1113    public 
1114#if[!byte]
1115    final
1116#end[!byte]
1117    $Type$Buffer reset() {
1118        super.reset();
1119        return this;
1120    }
1121
1122    /**
1123     * {@inheritDoc}
1124     */
1125    @Override
1126    public 
1127#if[!byte]
1128    final
1129#end[!byte]
1130    $Type$Buffer clear() {
1131        super.clear();
1132        return this;
1133    }
1134
1135    /**
1136     * {@inheritDoc}
1137     */
1138    @Override
1139    public 
1140#if[!byte]
1141    final
1142#end[!byte]
1143    $Type$Buffer flip() {
1144        super.flip();
1145        return this;
1146    }
1147
1148    /**
1149     * {@inheritDoc}
1150     */
1151    @Override
1152    public 
1153#if[!byte]
1154    final
1155#end[!byte]
1156    $Type$Buffer rewind() {
1157        super.rewind();
1158        return this;
1159    }
1160
1161    /**
1162     * Compacts this buffer&nbsp;&nbsp;<i>(optional operation)</i>.
1163     *
1164     * <p> The $type$s between the buffer's current position and its limit,
1165     * if any, are copied to the beginning of the buffer.  That is, the
1166     * $type$ at index <i>p</i>&nbsp;=&nbsp;{@code position()} is copied
1167     * to index zero, the $type$ at index <i>p</i>&nbsp;+&nbsp;1 is copied
1168     * to index one, and so forth until the $type$ at index
1169     * {@code limit()}&nbsp;-&nbsp;1 is copied to index
1170     * <i>n</i>&nbsp;=&nbsp;{@code limit()}&nbsp;-&nbsp;{@code 1}&nbsp;-&nbsp;<i>p</i>.
1171     * The buffer's position is then set to <i>n+1</i> and its limit is set to
1172     * its capacity.  The mark, if defined, is discarded.
1173     *
1174     * <p> The buffer's position is set to the number of $type$s copied,
1175     * rather than to zero, so that an invocation of this method can be
1176     * followed immediately by an invocation of another relative <i>put</i>
1177     * method. </p>
1178     *
1179#if[byte]
1180     *
1181     * <p> Invoke this method after writing data from a buffer in case the
1182     * write was incomplete.  The following loop, for example, copies bytes
1183     * from one channel to another via the buffer {@code buf}:
1184     *
1185     * <blockquote><pre>{@code
1186     *   buf.clear();          // Prepare buffer for use
1187     *   while (in.read(buf) >= 0 || buf.position != 0) {
1188     *       buf.flip();
1189     *       out.write(buf);
1190     *       buf.compact();    // In case of partial write
1191     *   }
1192     * }</pre></blockquote>
1193     *
1194#end[byte]
1195     *
1196     * @return  This buffer
1197     *
1198     * @throws  ReadOnlyBufferException
1199     *          If this buffer is read-only
1200     */
1201    public abstract $Type$Buffer compact();
1202
1203    /**
1204     * Tells whether or not this $type$ buffer is direct.
1205     *
1206     * @return  {@code true} if, and only if, this buffer is direct
1207     */
1208    public abstract boolean isDirect();
1209
1210#if[!char]
1211
1212    /**
1213     * Returns a string summarizing the state of this buffer.
1214     *
1215     * @return  A summary string
1216     */
1217    public String toString() {
1218        StringBuffer sb = new StringBuffer();
1219        sb.append(getClass().getName());
1220        sb.append("[pos=");
1221        sb.append(position());
1222        sb.append(" lim=");
1223        sb.append(limit());
1224        sb.append(" cap=");
1225        sb.append(capacity());
1226        sb.append("]");
1227        return sb.toString();
1228    }
1229
1230#end[!char]
1231
1232
1233    // ## Should really use unchecked accessors here for speed
1234
1235    /**
1236     * Returns the current hash code of this buffer.
1237     *
1238     * <p> The hash code of a $type$ buffer depends only upon its remaining
1239     * elements; that is, upon the elements from {@code position()} up to, and
1240     * including, the element at {@code limit()}&nbsp;-&nbsp;{@code 1}.
1241     *
1242     * <p> Because buffer hash codes are content-dependent, it is inadvisable
1243     * to use buffers as keys in hash maps or similar data structures unless it
1244     * is known that their contents will not change.  </p>
1245     *
1246     * @return  The current hash code of this buffer
1247     */
1248    public int hashCode() {
1249        int h = 1;
1250        int p = position();
1251        for (int i = limit() - 1; i >= p; i--)
1252#if[int]
1253            h = 31 * h + get(i);
1254#else[int]
1255            h = 31 * h + (int)get(i);
1256#end[int]
1257        return h;
1258    }
1259
1260    /**
1261     * Tells whether or not this buffer is equal to another object.
1262     *
1263     * <p> Two $type$ buffers are equal if, and only if,
1264     *
1265     * <ol>
1266     *
1267     *   <li><p> They have the same element type,  </p></li>
1268     *
1269     *   <li><p> They have the same number of remaining elements, and
1270     *   </p></li>
1271     *
1272     *   <li><p> The two sequences of remaining elements, considered
1273     *   independently of their starting positions, are pointwise equal.
1274#if[floatingPointType]
1275     *   This method considers two $type$ elements {@code a} and {@code b}
1276     *   to be equal if
1277     *   {@code (a == b) || ($Fulltype$.isNaN(a) && $Fulltype$.isNaN(b))}.
1278     *   The values {@code -0.0} and {@code +0.0} are considered to be
1279     *   equal, unlike {@link $Fulltype$#equals(Object)}.
1280#end[floatingPointType]
1281     *   </p></li>
1282     *
1283     * </ol>
1284     *
1285     * <p> A $type$ buffer is not equal to any other type of object.  </p>
1286     *
1287     * @param  ob  The object to which this buffer is to be compared
1288     *
1289     * @return  {@code true} if, and only if, this buffer is equal to the
1290     *           given object
1291     */
1292    public boolean equals(Object ob) {
1293        if (this == ob)
1294            return true;
1295        if (!(ob instanceof $Type$Buffer))
1296            return false;
1297        $Type$Buffer that = ($Type$Buffer)ob;
1298        if (this.remaining() != that.remaining())
1299            return false;
1300        int p = this.position();
1301        for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--)
1302            if (!equals(this.get(i), that.get(j)))
1303                return false;
1304        return true;
1305    }
1306
1307    private static boolean equals($type$ x, $type$ y) {
1308#if[floatingPointType]
1309        return (x == y) || ($Fulltype$.isNaN(x) && $Fulltype$.isNaN(y));
1310#else[floatingPointType]
1311        return x == y;
1312#end[floatingPointType]
1313    }
1314
1315    /**
1316     * Compares this buffer to another.
1317     *
1318     * <p> Two $type$ buffers are compared by comparing their sequences of
1319     * remaining elements lexicographically, without regard to the starting
1320     * position of each sequence within its corresponding buffer.
1321#if[floatingPointType]
1322     * Pairs of {@code $type$} elements are compared as if by invoking
1323     * {@link $Fulltype$#compare($type$,$type$)}, except that
1324     * {@code -0.0} and {@code 0.0} are considered to be equal.
1325     * {@code $Fulltype$.NaN} is considered by this method to be equal
1326     * to itself and greater than all other {@code $type$} values
1327     * (including {@code $Fulltype$.POSITIVE_INFINITY}).
1328#else[floatingPointType]
1329     * Pairs of {@code $type$} elements are compared as if by invoking
1330     * {@link $Fulltype$#compare($type$,$type$)}.
1331#end[floatingPointType]
1332     *
1333     * <p> A $type$ buffer is not comparable to any other type of object.
1334     *
1335     * @return  A negative integer, zero, or a positive integer as this buffer
1336     *          is less than, equal to, or greater than the given buffer
1337     */
1338    public int compareTo($Type$Buffer that) {
1339        int n = this.position() + Math.min(this.remaining(), that.remaining());
1340        for (int i = this.position(), j = that.position(); i < n; i++, j++) {
1341            int cmp = compare(this.get(i), that.get(j));
1342            if (cmp != 0)
1343                return cmp;
1344        }
1345        return this.remaining() - that.remaining();
1346    }
1347
1348    private static int compare($type$ x, $type$ y) {
1349#if[floatingPointType]
1350        return ((x < y)  ? -1 :
1351                (x > y)  ? +1 :
1352                (x == y) ?  0 :
1353                $Fulltype$.isNaN(x) ? ($Fulltype$.isNaN(y) ? 0 : +1) : -1);
1354#else[floatingPointType]
1355        return $Fulltype$.compare(x, y);
1356#end[floatingPointType]
1357    }
1358
1359    // -- Other char stuff --
1360
1361#if[char]
1362
1363    /**
1364     * Returns a string containing the characters in this buffer.
1365     *
1366     * <p> The first character of the resulting string will be the character at
1367     * this buffer's position, while the last character will be the character
1368     * at index {@code limit()}&nbsp;-&nbsp;1.  Invoking this method does not
1369     * change the buffer's position. </p>
1370     *
1371     * @return  The specified string
1372     */
1373    public String toString() {
1374        return toString(position(), limit());
1375    }
1376
1377    abstract String toString(int start, int end);       // package-private
1378
1379
1380    // --- Methods to support CharSequence ---
1381
1382    /**
1383     * Returns the length of this character buffer.
1384     *
1385     * <p> When viewed as a character sequence, the length of a character
1386     * buffer is simply the number of characters between the position
1387     * (inclusive) and the limit (exclusive); that is, it is equivalent to
1388     * {@code remaining()}. </p>
1389     *
1390     * @return  The length of this character buffer
1391     */
1392    public final int length() {
1393        return remaining();
1394    }
1395
1396    /**
1397     * Reads the character at the given index relative to the current
1398     * position.
1399     *
1400     * @param  index
1401     *         The index of the character to be read, relative to the position;
1402     *         must be non-negative and smaller than {@code remaining()}
1403     *
1404     * @return  The character at index
1405     *          <code>position()&nbsp;+&nbsp;index</code>
1406     *
1407     * @throws  IndexOutOfBoundsException
1408     *          If the preconditions on {@code index} do not hold
1409     */
1410    public final char charAt(int index) {
1411        return get(position() + checkIndex(index, 1));
1412    }
1413
1414    /**
1415     * Creates a new character buffer that represents the specified subsequence
1416     * of this buffer, relative to the current position.
1417     *
1418     * <p> The new buffer will share this buffer's content; that is, if the
1419     * content of this buffer is mutable then modifications to one buffer will
1420     * cause the other to be modified.  The new buffer's capacity will be that
1421     * of this buffer, its position will be
1422     * {@code position()}&nbsp;+&nbsp;{@code start}, and its limit will be
1423     * {@code position()}&nbsp;+&nbsp;{@code end}.  The new buffer will be
1424     * direct if, and only if, this buffer is direct, and it will be read-only
1425     * if, and only if, this buffer is read-only.  </p>
1426     *
1427     * @param  start
1428     *         The index, relative to the current position, of the first
1429     *         character in the subsequence; must be non-negative and no larger
1430     *         than {@code remaining()}
1431     *
1432     * @param  end
1433     *         The index, relative to the current position, of the character
1434     *         following the last character in the subsequence; must be no
1435     *         smaller than {@code start} and no larger than
1436     *         {@code remaining()}
1437     *
1438     * @return  The new character buffer
1439     *
1440     * @throws  IndexOutOfBoundsException
1441     *          If the preconditions on {@code start} and {@code end}
1442     *          do not hold
1443     */
1444    public abstract CharBuffer subSequence(int start, int end);
1445
1446
1447    // --- Methods to support Appendable ---
1448
1449    /**
1450     * Appends the specified character sequence  to this
1451     * buffer&nbsp;&nbsp;<i>(optional operation)</i>.
1452     *
1453     * <p> An invocation of this method of the form {@code dst.append(csq)}
1454     * behaves in exactly the same way as the invocation
1455     *
1456     * <pre>
1457     *     dst.put(csq.toString()) </pre>
1458     *
1459     * <p> Depending on the specification of {@code toString} for the
1460     * character sequence {@code csq}, the entire sequence may not be
1461     * appended.  For instance, invoking the {@link $Type$Buffer#toString()
1462     * toString} method of a character buffer will return a subsequence whose
1463     * content depends upon the buffer's position and limit.
1464     *
1465     * @param  csq
1466     *         The character sequence to append.  If {@code csq} is
1467     *         {@code null}, then the four characters {@code "null"} are
1468     *         appended to this character buffer.
1469     *
1470     * @return  This buffer
1471     *
1472     * @throws  BufferOverflowException
1473     *          If there is insufficient space in this buffer
1474     *
1475     * @throws  ReadOnlyBufferException
1476     *          If this buffer is read-only
1477     *
1478     * @since  1.5
1479     */
1480    public $Type$Buffer append(CharSequence csq) {
1481        if (csq == null)
1482            return put("null");
1483        else
1484            return put(csq.toString());
1485    }
1486
1487    /**
1488     * Appends a subsequence of the  specified character sequence  to this
1489     * buffer&nbsp;&nbsp;<i>(optional operation)</i>.
1490     *
1491     * <p> An invocation of this method of the form {@code dst.append(csq, start,
1492     * end)} when {@code csq} is not {@code null}, behaves in exactly the
1493     * same way as the invocation
1494     *
1495     * <pre>
1496     *     dst.put(csq.subSequence(start, end).toString()) </pre>
1497     *
1498     * @param  csq
1499     *         The character sequence from which a subsequence will be
1500     *         appended.  If {@code csq} is {@code null}, then characters
1501     *         will be appended as if {@code csq} contained the four
1502     *         characters {@code "null"}.
1503     *
1504     * @return  This buffer
1505     *
1506     * @throws  BufferOverflowException
1507     *          If there is insufficient space in this buffer
1508     *
1509     * @throws  IndexOutOfBoundsException
1510     *          If {@code start} or {@code end} are negative, {@code start}
1511     *          is greater than {@code end}, or {@code end} is greater than
1512     *          {@code csq.length()}
1513     *
1514     * @throws  ReadOnlyBufferException
1515     *          If this buffer is read-only
1516     *
1517     * @since  1.5
1518     */
1519    public $Type$Buffer append(CharSequence csq, int start, int end) {
1520        CharSequence cs = (csq == null ? "null" : csq);
1521        return put(cs.subSequence(start, end).toString());
1522    }
1523
1524    /**
1525     * Appends the specified $type$  to this
1526     * buffer&nbsp;&nbsp;<i>(optional operation)</i>.
1527     *
1528     * <p> An invocation of this method of the form {@code dst.append($x$)}
1529     * behaves in exactly the same way as the invocation
1530     *
1531     * <pre>
1532     *     dst.put($x$) </pre>
1533     *
1534     * @param  $x$
1535     *         The 16-bit $type$ to append
1536     *
1537     * @return  This buffer
1538     *
1539     * @throws  BufferOverflowException
1540     *          If there is insufficient space in this buffer
1541     *
1542     * @throws  ReadOnlyBufferException
1543     *          If this buffer is read-only
1544     *
1545     * @since  1.5
1546     */
1547    public $Type$Buffer append($type$ $x$) {
1548        return put($x$);
1549    }
1550
1551#end[char]
1552
1553
1554    // -- Other byte stuff: Access to binary data --
1555
1556#if[!byte]
1557
1558    /**
1559     * Retrieves this buffer's byte order.
1560     *
1561     * <p> The byte order of $a$ $type$ buffer created by allocation or by
1562     * wrapping an existing {@code $type$} array is the {@link
1563     * ByteOrder#nativeOrder native order} of the underlying
1564     * hardware.  The byte order of $a$ $type$ buffer created as a <a
1565     * href="ByteBuffer.html#views">view</a> of a byte buffer is that of the
1566     * byte buffer at the moment that the view is created.  </p>
1567     *
1568     * @return  This buffer's byte order
1569     */
1570    public abstract ByteOrder order();
1571
1572#end[!byte]
1573
1574#if[byte]
1575
1576    boolean bigEndian                                   // package-private
1577        = true;
1578    boolean nativeByteOrder                             // package-private
1579        = (Bits.byteOrder() == ByteOrder.BIG_ENDIAN);
1580
1581    /**
1582     * Retrieves this buffer's byte order.
1583     *
1584     * <p> The byte order is used when reading or writing multibyte values, and
1585     * when creating buffers that are views of this byte buffer.  The order of
1586     * a newly-created byte buffer is always {@link ByteOrder#BIG_ENDIAN
1587     * BIG_ENDIAN}.  </p>
1588     *
1589     * @return  This buffer's byte order
1590     */
1591    public final ByteOrder order() {
1592        return bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
1593    }
1594
1595    /**
1596     * Modifies this buffer's byte order.
1597     *
1598     * @param  bo
1599     *         The new byte order,
1600     *         either {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}
1601     *         or {@link ByteOrder#LITTLE_ENDIAN LITTLE_ENDIAN}
1602     *
1603     * @return  This buffer
1604     */
1605    public final $Type$Buffer order(ByteOrder bo) {
1606        bigEndian = (bo == ByteOrder.BIG_ENDIAN);
1607        nativeByteOrder =
1608            (bigEndian == (Bits.byteOrder() == ByteOrder.BIG_ENDIAN));
1609        return this;
1610    }
1611
1612    /**
1613     * Returns the memory address, pointing to the byte at the given index,
1614     * modulus the given unit size.
1615     *
1616     * <p> A return value greater than zero indicates the address of the byte at
1617     * the index is misaligned for the unit size, and the value's quantity
1618     * indicates how much the index should be rounded up or down to locate a
1619     * byte at an aligned address.  Otherwise, a value of {@code 0} indicates
1620     * that the address of the byte at the index is aligned for the unit size.
1621     *
1622     * @apiNote
1623     * This method may be utilized to determine if unit size bytes from an
1624     * index can be accessed atomically, if supported by the native platform.
1625     *
1626     * @implNote
1627     * This implementation throws {@code UnsupportedOperationException} for
1628     * non-direct buffers when the given unit size is greater then {@code 8}.
1629     *
1630     * @param  index
1631     *         The index to query for alignment offset, must be non-negative, no
1632     *         upper bounds check is performed
1633     *
1634     * @param  unitSize
1635     *         The unit size in bytes, must be a power of {@code 2}
1636     *
1637     * @return  The indexed byte's memory address modulus the unit size
1638     *
1639     * @throws IllegalArgumentException
1640     *         If the index is negative or the unit size is not a power of
1641     *         {@code 2}
1642     *
1643     * @throws UnsupportedOperationException
1644     *         If the native platform does not guarantee stable alignment offset
1645     *         values for the given unit size when managing the memory regions
1646     *         of buffers of the same kind as this buffer (direct or
1647     *         non-direct).  For example, if garbage collection would result
1648     *         in the moving of a memory region covered by a non-direct buffer
1649     *         from one location to another and both locations have different
1650     *         alignment characteristics.
1651     *
1652     * @see #alignedSlice(int)
1653     * @since 9
1654     */
1655    public final int alignmentOffset(int index, int unitSize) {
1656        if (index < 0)
1657            throw new IllegalArgumentException("Index less than zero: " + index);
1658        if (unitSize < 1 || (unitSize & (unitSize - 1)) != 0)
1659            throw new IllegalArgumentException("Unit size not a power of two: " + unitSize);
1660        if (unitSize > 8 && !isDirect())
1661            throw new UnsupportedOperationException("Unit size unsupported for non-direct buffers: " + unitSize);
1662
1663        return (int) ((address + index) % unitSize);
1664    }
1665
1666    /**
1667     * Creates a new byte buffer whose content is a shared and aligned
1668     * subsequence of this buffer's content.
1669     *
1670     * <p> The content of the new buffer will start at this buffer's current
1671     * position rounded up to the index of the nearest aligned byte for the
1672     * given unit size, and end at this buffer's limit rounded down to the index
1673     * of the nearest aligned byte for the given unit size.
1674     * If rounding results in out-of-bound values then the new buffer's capacity
1675     * and limit will be zero.  If rounding is within bounds the following
1676     * expressions will be true for a new buffer {@code nb} and unit size
1677     * {@code unitSize}:
1678     * <pre>{@code
1679     * nb.alignmentOffset(0, unitSize) == 0
1680     * nb.alignmentOffset(nb.limit(), unitSize) == 0
1681     * }</pre>
1682     *
1683     * <p> Changes to this buffer's content will be visible in the new
1684     * buffer, and vice versa; the two buffers' position, limit, and mark
1685     * values will be independent.
1686     *
1687     * <p> The new buffer's position will be zero, its capacity and its limit
1688     * will be the number of bytes remaining in this buffer or fewer subject to
1689     * alignment, its mark will be undefined, and its byte order will be
1690     * {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
1691     *
1692     * The new buffer will be direct if, and only if, this buffer is direct, and
1693     * it will be read-only if, and only if, this buffer is read-only.  </p>
1694     *
1695     * @apiNote
1696     * This method may be utilized to create a new buffer where unit size bytes
1697     * from index, that is a multiple of the unit size, may be accessed
1698     * atomically, if supported by the native platform.
1699     *
1700     * @implNote
1701     * This implementation throws {@code UnsupportedOperationException} for
1702     * non-direct buffers when the given unit size is greater then {@code 8}.
1703     *
1704     * @param  unitSize
1705     *         The unit size in bytes, must be a power of {@code 2}
1706     *
1707     * @return  The new byte buffer
1708     *
1709     * @throws IllegalArgumentException
1710     *         If the unit size not a power of {@code 2}
1711     *
1712     * @throws UnsupportedOperationException
1713     *         If the native platform does not guarantee stable aligned slices
1714     *         for the given unit size when managing the memory regions
1715     *         of buffers of the same kind as this buffer (direct or
1716     *         non-direct).  For example, if garbage collection would result
1717     *         in the moving of a memory region covered by a non-direct buffer
1718     *         from one location to another and both locations have different
1719     *         alignment characteristics.
1720     *
1721     * @see #alignmentOffset(int, int)
1722     * @see #slice()
1723     * @since 9
1724     */
1725    public final ByteBuffer alignedSlice(int unitSize) {
1726        int pos = position();
1727        int lim = limit();
1728
1729        int pos_mod = alignmentOffset(pos, unitSize);
1730        int lim_mod = alignmentOffset(lim, unitSize);
1731
1732        // Round up the position to align with unit size
1733        int aligned_pos = (pos_mod > 0)
1734            ? pos + (unitSize - pos_mod)
1735            : pos;
1736
1737        // Round down the limit to align with unit size
1738        int aligned_lim = lim - lim_mod;
1739
1740        if (aligned_pos > lim || aligned_lim < pos) {
1741            aligned_pos = aligned_lim = pos;
1742        }
1743
1744        return slice(aligned_pos, aligned_lim);
1745    }
1746
1747    abstract ByteBuffer slice(int pos, int lim);
1748
1749    // Unchecked accessors, for use by ByteBufferAs-X-Buffer classes
1750    //
1751    abstract byte _get(int i);                          // package-private
1752    abstract void _put(int i, byte b);                  // package-private
1753
1754    // #BIN
1755    //
1756    // Binary-data access methods  for short, char, int, long, float,
1757    // and double will be inserted here
1758
1759#end[byte]
1760
1761#if[streamableType]
1762
1763#if[char]
1764    @Override
1765#end[char]
1766    public $Streamtype$Stream $type$s() {
1767        return StreamSupport.$streamtype$Stream(() -> new $Type$BufferSpliterator(this),
1768            Buffer.SPLITERATOR_CHARACTERISTICS, false);
1769    }
1770
1771#end[streamableType]
1772
1773}
1774