diff java/src/java/lang/StringBuffer.d @ 21:9b96950f2c3c

the 'java' tree compiles on both D1-Tango and D2-Phobos
author Frank Benoit <benoit@tionex.de>
date Thu, 19 Mar 2009 20:38:55 +0100
parents dbfb303e8fb0
children f713da8bc051
line wrap: on
line diff
--- a/java/src/java/lang/StringBuffer.d	Wed Mar 18 12:10:17 2009 +0100
+++ b/java/src/java/lang/StringBuffer.d	Thu Mar 19 20:38:55 2009 +0100
@@ -2,131 +2,228 @@
 
 import java.lang.util;
 
-static import tango.text.Text;
-static import tango.text.convert.Utf;
+version(Tango){
+    static import tango.text.Text;
+    static import tango.text.convert.Utf;
+} else { // Phobos
+    static import std.uni;
+    static import std.utf;
+}
 
 class StringBuffer : CharSequence {
-    alias tango.text.Text.Text!(char) TBuf;
-    TBuf buf;
+    version(Tango){
+        alias tango.text.Text.Text!(char) TBuf;
+        TBuf buf;
+    } else { // Phobos
+        const int STDINCR = 128;
+        char[] buf;
+        int used;
+    }
 
     public this(){
-        buf = new TBuf();
+        version(Tango){
+            buf = new TBuf();
+        } else { // Phobos
+        }
     }
 
     public this( int cap ){
-        buf = new TBuf( cap );
+        version(Tango){
+            buf = new TBuf(cap);
+        } else { // Phobos
+            buf.length = cap;
+        }
     }
 
     public this( String content ){
-        buf = new TBuf( content );
+        version(Tango){
+            buf = new TBuf( content );
+        } else { // Phobos
+            buf.length = content.length + STDINCR;
+            buf[ 0 .. content.length ] = content;
+            used = content.length;
+        }
     }
 
     char charAt(int index){
-        return buf.slice()[ index ];
+        version(Tango){
+            return buf.slice()[ index ];
+        } else { // Phobos
+            return buf[ index ];
+        }
     }
 
     int length(){
-        return buf.length();
+        version(Tango){
+            return buf.length();
+        } else { // Phobos
+            return used;
+        }
     }
 
     CharSequence subSequence(int start, int end){
-        return new StringBuffer( buf.slice()[ start .. end ] );
+        version(Tango){
+            return new StringBuffer( buf.slice()[ start .. end ] );
+        } else { // Phobos
+            return new StringBuffer( cast(String)buf[ start .. end ] );
+        }
     }
 
     String toString(){
-        return buf.slice();
+        version(Tango){
+            return buf.slice();
+        } else { // Phobos
+            return cast(String)buf[ 0 .. used ];
+        }
     }
 
     StringBuffer append( String s ){
-        buf.append( s );
+        version(Tango){
+            buf.append( s );
+        } else { // Phobos
+            if( buf.length < used + s.length ){
+                buf.length = used + s.length + STDINCR;
+            }
+            buf[ used .. used + s.length ] = s;
+            used += s.length;
+        }
         return this;
     }
 
     StringBuffer append( String s, int offset, int len ){
-        buf.append( s[ offset .. offset+len ] );
-        return this;
+        return append( s[ offset .. offset+len ] );
     }
 
     StringBuffer append( StringBuffer other ){
-        buf.append( other.slice() );
-        return this;
+        return append( other.slice() );
     }
 
     StringBuffer append( Object obj ){
-        buf.append( obj.toString() );
-        return this;
+        return append( obj.toString() );
     }
 
     StringBuffer append( char c ){
-        buf.append( c );
-        return this;
+        char[1] src;
+        src[0] = c;
+        return append( cast(String)src );
     }
 
     StringBuffer append( wchar c ){
         wchar[1] src;
         src[0] = c;
-        char[2] trg;
-        auto s = tango.text.convert.Utf.toString( src, trg );
-        buf.append( s );
-        return this;
+        version(Tango){
+            char[2] trg;
+            auto arr = tango.text.convert.Utf.toString( src, trg );
+        } else { // Phobos
+            auto arr = std.utf.toUTF8( src );
+        }
+        return append( arr );
     }
 
     StringBuffer append( int i ){
-        buf.append( String_valueOf(i) );
-        return this;
+        return append( String_valueOf(i) );
     }
 
     StringBuffer append( long i ){
-        buf.append( String_valueOf(i) );
-        return this;
+        return append( String_valueOf(i) );
     }
 
     StringBuffer append( dchar c ){
         dchar[1] src;
         src[0] = c;
-        char[4] trg;
-        auto s = tango.text.convert.Utf.toString( src, trg );
-        buf.append( s );
-        return this;
+        version(Tango){
+            char[4] trg;
+            auto arr = tango.text.convert.Utf.toString( src, trg );
+        } else { // Phobos
+            auto arr = std.utf.toUTF8( src );
+        }
+        return append( arr );
     }
 
 
     StringBuffer insert(int offset, String str){
-        buf.select(offset, 0);
-        buf.replace(str);
-        buf.select();
-        return this;
+        return replace( offset, offset, str );
     }
 
     StringBuffer insert(int offset, StringBuffer other){
-        insert( offset, other.slice());
-        return this;
+        return insert( offset, other.slice());
     }
 
     StringBuffer replace(int start, int end, String str) {
-        buf.select(start, end-start);
-        buf.replace(str);
-        buf.select();
+        version(Tango){
+            buf.select(start, end-start);
+            buf.replace(str);
+            buf.select();
+        } else { // Phobos
+            int incr = end - start - str.length;
+            if( incr > 0 ){
+                if( buf.length < used + incr ){
+                    char[] newbuf = new char[ 2*(used + incr) + STDINCR ];
+                    newbuf[ 0 .. start ] = buf[ 0 .. start ];
+                    newbuf[ start .. start + str.length ] = str;
+                    newbuf[ start + str.length .. used + str.length ] = buf[ end .. used ];
+                    buf = newbuf;
+                }
+                else{
+                    char* s = buf.ptr + start;
+                    char* t = buf.ptr + start + str.length;
+                    char* e = buf.ptr + start + str.length;
+                    while( s !is e ){
+                        *t = *s;
+                        s++; t++;
+                    }
+                    buf[ start .. start + str.length ] = str;
+                }
+            }
+            else if( incr == 0 ){
+                buf[ start .. end ] = str;
+            }
+            else{
+                buf[ start .. end ] = str;
+                char* s = buf.ptr + end;
+                char* t = buf.ptr + start + str.length;
+                char* e = buf.ptr + start + str.length;
+                while( s !is e ){
+                    *t = *s;
+                    s--; t--;
+                }
+            }
+            used += incr;
+        }
         return this;
     }
 
     void setLength( int newLength ){
-        buf.truncate( newLength );
+        version(Tango){
+            buf.truncate( newLength );
+        } else { // Phobos
+            if( buf.length < newLength ){
+                buf.length = 2*newLength + STDINCR;
+            }
+            used = newLength;
+        }
     }
 
     String substring( int start, int end ){
-        return buf.slice()[ start .. end ].dup;
+        version(Tango){
+            return buf.slice()[ start .. end ].dup;
+        } else { // Phobos
+            return buf[ start .. end ].idup;
+        }
     }
 
     void delete_( int start, int end ){
-        buf.select( start, end - start );
-        buf.remove();
+        replace( start, end, "" );
     }
     String slice(){
-        return buf.slice();
+        version(Tango){
+            return buf.slice();
+        } else { // Phobos
+            return cast(String)buf[ 0 .. used ];
+        }
     }
     void truncate( int start ){
-        buf.truncate( start );
+        setLength( start );
     }
 }