jdk/src/share/classes/java/nio/StringCharBuffer.java
changeset 2 90ce3da70b43
child 69 c7cd7bde95f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/nio/StringCharBuffer.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2000-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package java.nio;
+
+
+// ## If the sequence is a string, use reflection to share its array
+
+class StringCharBuffer                                  // package-private
+    extends CharBuffer
+{
+    CharSequence str;
+
+    StringCharBuffer(CharSequence s, int start, int end) { // package-private
+        super(-1, start, end, s.length());
+        int n = s.length();
+        if ((start < 0) || (start > n) || (end < start) || (end > n))
+            throw new IndexOutOfBoundsException();
+        str = s;
+    }
+
+    public CharBuffer slice() {
+        return new StringCharBuffer(str,
+                                    -1,
+                                    0,
+                                    this.remaining(),
+                                    this.remaining(),
+                                    this.position());
+    }
+
+    private StringCharBuffer(CharSequence s,
+                             int mark,
+                             int pos,
+                             int limit,
+                             int cap,
+                             int offset) {
+        super(mark, pos, limit, cap, null, offset);
+        str = s;
+    }
+
+    private StringCharBuffer(CharSequence s, int mark,
+                             int pos, int limit, int cap)
+    {
+        super(mark, pos, limit, cap);
+        str = s;
+    }
+
+    public CharBuffer duplicate() {
+        return new StringCharBuffer(str, markValue(),
+                                    position(), limit(), capacity());
+    }
+
+    public CharBuffer asReadOnlyBuffer() {
+        return duplicate();
+    }
+
+    public final char get() {
+        return str.charAt(nextGetIndex());
+    }
+
+    public final char get(int index) {
+        return str.charAt(checkIndex(index));
+    }
+
+    // ## Override bulk get methods for better performance
+
+    public final CharBuffer put(char c) {
+        throw new ReadOnlyBufferException();
+    }
+
+    public final CharBuffer put(int index, char c) {
+        throw new ReadOnlyBufferException();
+    }
+
+    public final CharBuffer compact() {
+        throw new ReadOnlyBufferException();
+    }
+
+    public final boolean isReadOnly() {
+        return true;
+    }
+
+    final String toString(int start, int end) {
+        return str.toString().substring(start, end);
+    }
+
+    public final CharSequence subSequence(int start, int end) {
+        try {
+            int pos = position();
+            return new StringCharBuffer(str,
+                                        pos + checkIndex(start, pos),
+                                        pos + checkIndex(end, pos));
+        } catch (IllegalArgumentException x) {
+            throw new IndexOutOfBoundsException();
+        }
+    }
+
+    public boolean isDirect() {
+        return false;
+    }
+
+    public ByteOrder order() {
+        return ByteOrder.nativeOrder();
+    }
+
+}