package php.runtime.memory.helper;
import php.runtime.Memory;
import php.runtime.env.TraceInfo;
import php.runtime.memory.StringMemory;
import java.nio.CharBuffer;
public class CharArrayMemory extends StringMemory {
protected CharBuffer buffer;
public CharArrayMemory(String value) {
super("");
buffer = CharBuffer.allocate(value.length());
buffer.put(value);
}
public CharArrayMemory(char ch) {
super("");
buffer = CharBuffer.allocate(1);
buffer.put(ch);
}
@Override
public Memory toImmutable() {
return new StringMemory(buffer.toString());
}
@Override
public String toString() {
return new String(buffer.array());
}
@Override
public Memory valueOfIndex(TraceInfo trace, Memory index) {
int _index = -1;
switch (index.type){
case STRING:
Memory tmp = StringMemory.toLong(index.toString());
if (tmp != null)
_index = tmp.toInteger();
break;
case REFERENCE: return valueOfIndex(index.toValue());
default:
_index = index.toInteger();
}
if (_index < buffer.length() && _index >= 0)
return getChar(buffer.charAt(_index));
else
return CONST_EMPTY_STRING;
}
@Override
public Memory valueOfIndex(TraceInfo trace, long index) {
int _index = (int)index;
if (_index >= 0 && _index < buffer.length())
return getChar(buffer.charAt(_index));
else
return CONST_EMPTY_STRING;
}
@Override
public Memory valueOfIndex(TraceInfo trace, double index) {
int _index = (int)index;
if (_index >= 0 && _index < buffer.length())
return getChar(buffer.charAt(_index));
else
return CONST_EMPTY_STRING;
}
@Override
public Memory valueOfIndex(TraceInfo trace, boolean index) {
int _index = index ? 1 : 0;
if (_index >= 0 && _index < buffer.length())
return getChar(buffer.charAt(_index));
else
return CONST_EMPTY_STRING;
}
@Override
public Memory valueOfIndex(TraceInfo trace, String index) {
int _index = -1;
Memory tmp = StringMemory.toLong(index);
if (tmp != null)
_index = tmp.toInteger();
if (_index >= 0 && _index < buffer.length())
return getChar(buffer.charAt(_index));
else
return CONST_EMPTY_STRING;
}
public int length() {
return buffer.length();
}
public void put(int index, String s) {
int len = s.length();
int sLen = buffer.limit();
if (index < 0)
return;
char ch = len == 0 ? '\0' : s.charAt(0);
if (index < sLen)
buffer.put(index, ch);
else {
int cnt = index - sLen;
CharBuffer tmp = CharBuffer.allocate(sLen + cnt + 1);
tmp.put(buffer.array());
buffer = tmp;
for(int i = 0; i < cnt; i++) {
buffer.append('\32');
}
buffer.append(ch);
}
}
public char get(int index) {
return buffer.get(index);
}
}