package com.snowcattle.game.common.util;
import java.util.BitSet;
/**
* 基于数组实现的对象属性值对象
*
*
*/
public class PropertyArray {
private final Object[] values;
private final BitSet bitSet;
public PropertyArray(int size) {
values = new Object[size];
bitSet = new BitSet(size);
}
/**
* 从指定的数值对象src拷贝数据到本实例
*
* @param src
* 数据的来源
*/
public void copyFrom(PropertyArray src) {
System.arraycopy(src.values, 0, values, 0, values.length);
this.bitSet.set(0, values.length, true);
}
public void setInt(int index, int val) {
this.set(index, Integer.valueOf(val));
}
public int getInt(int index) {
Integer _val = (Integer) this.values[index];
if (_val == null) {
return 0;
}
return _val.intValue();
}
public void setLong(int index, long val) {
this.set(index, Long.valueOf(val));
}
public long getLong(int index) {
Long _val = (Long) this.values[index];
if (_val == null) {
return 0;
}
return _val.longValue();
}
public void setShort(int index, short val) {
this.set(index, Short.valueOf(val));
}
public short getShort(int index) {
Short _val = (Short) this.values[index];
if (_val == null) {
return 0;
}
return _val.shortValue();
}
public void setByte(int index, byte val) {
this.set(index, Byte.valueOf(val));
}
public byte getByte(int index) {
Byte _val = (Byte) this.values[index];
if (_val == null) {
return 0;
}
return _val.byteValue();
}
public void setString(int index, String val) {
this.set(index, val);
}
public String getString(int index) {
return (String) this.values[index];
}
public void setObject(int index, Object val) {
this.set(index, val);
}
public Object getObject(int index) {
return this.values[index];
}
public boolean isChanged() {
return !this.bitSet.isEmpty();
}
public void resetChanged() {
this.bitSet.clear();
}
public void change(){
for(int i=0; i< this.values.length; i++){
if(this.values[i] != null){
this.bitSet.set(i);
}
}
}
public void set(int index, Object val) {
Object _old = this.values[index];
boolean _changed = false;
if (_old != null) {
if (!_old.equals(val)) {
_changed = true;
}
} else if (val != null) {
_changed = true;
}
if (_changed) {
this.values[index] = val;
this.bitSet.set(index);
}
}
/**
* 取得index对应的int值
*
* @param index
* @return
* @throws ArrayIndexOutOfBoundsException
* 如果index<0 或者 index>=size时会抛出此异常
*/
public Object get(int index) {
return values[index];
}
public int size() {
return values.length;
}
/**
* 取得被修改过的的属性索引及其对应的值
*
* @return
*/
public Object[] getChanged() {
int[] _indexes = new int[bitSet.cardinality()];
Object[] _values = new Object[bitSet.cardinality()];
Object[] _changed = new Object[2];
_changed[0] = _indexes;
_changed[1] = _values;
for (int i = bitSet.nextSetBit(0), j = 0; i >= 0; i = bitSet.nextSetBit(i + 1), j++) {
_indexes[j] = i;
_values[j] = this.values[i];
}
return _changed;
}
@Override
public String toString() {
return StringUtils.obj2String(this, null);
}
}