Mercurial > projects > dwt2
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 ); } }