package org.etk.orm.core;
import java.util.ArrayList;
import java.util.List;
import org.etk.orm.plugins.common.collection.wrapped.WrappedArrayList;
import org.etk.orm.plugins.vt2.ValueDefinition;
public abstract class ListType {
public abstract <E> List<E> create(ValueDefinition<?, E> elementType, int size);
public abstract <E> Object unwrap(ValueDefinition<?, E> elementType, List<E> list);
public abstract <E> List<E> wrap(ValueDefinition<?, E> elementType, Object array);
public static final ListType ARRAY = new ListType() {
@Override
public <E> List<E> create(ValueDefinition<?, E> elementType, int size) {
return WrappedArrayList.create(
elementType.getObjectType(),
elementType.getRealType(),
size);
}
@Override
public <E> List<E> wrap(ValueDefinition<?, E> elementType, Object array) {
return WrappedArrayList.wrap(elementType.getObjectType(), array);
}
@Override
public <E> Object unwrap(ValueDefinition<?, E> elementType, List<E> list) {
return ((WrappedArrayList)list).getArray();
}
};
public static final ListType LIST = new ListType() {
@Override
public <E> List<E> create(ValueDefinition<?, E> elementType, int size) {
ArrayList<E> list = new ArrayList<E>(size);
for (int i = 0;i < size;i++) {
list.add(null);
}
return list;
}
@Override
public <E> List<E> wrap(ValueDefinition<?, E> elementType, Object array) {
return (List<E>)array;
}
@Override
public <E> Object unwrap(ValueDefinition<?, E> elementType, List<E> list) {
return list;
}
};
}