package php.runtime.memory;
import php.runtime.Memory;
public class StringBuilderMemory extends StringMemory {
StringBuilder builder = null;
StringMemory cache = null;
public StringBuilderMemory(){
super("");
}
public StringBuilderMemory(String value) {
super(value);
}
public StringBuilderMemory(char ch) {
super(ch);
}
@Override
public Memory toImmutable() {
if (cache != null)
return cache;
return cache = new StringMemory(toString());
}
@Override
public String toString() {
if (builder != null){
value = builder.toString();
builder = null;
}
return value;
}
@Override
public Memory toNumeric(){
return toImmutable().toNumeric();
}
private void resolveBuilder(){
cache = null;
if (this.builder == null){
this.builder = new StringBuilder(this.value);
this.value = null;
}
}
public void append(Memory memory){
resolveBuilder();
switch (memory.type){
case BOOL:
if (memory instanceof FalseMemory)
break;
else
builder.append(memory.toString());
break;
case NULL: break;
case INT: builder.append(((LongMemory)memory).value); break;
case DOUBLE: builder.append(((DoubleMemory)memory).value); break;
case STRING: builder.append(memory.toString()); break;
case REFERENCE: append(memory.toImmutable()); break;
default:
builder.append(memory.toString());
}
}
public void append(String value){
if (value == null) {
return;
}
resolveBuilder();
this.builder.append(value);
}
public void append(char value) {
append(StringMemory.valueOf(value));
}
public void append(long value){
resolveBuilder();
builder.append(value);
}
public void append(double value){
resolveBuilder();
builder.append(value);
}
public void append(boolean value){
if (value){
resolveBuilder();
builder.append(boolToString(value));
}
}
public int length(){
if (builder == null)
return value.length();
else
return builder.length();
}
}