magarena/src/magic/model/MagicCopyMap.java

55 lines
1.7 KiB
Java
Raw Permalink Normal View History

2013-04-12 19:32:25 -07:00
package magic.model;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.HashMap;
@SuppressWarnings("serial")
2013-04-12 19:32:25 -07:00
public class MagicCopyMap extends HashMap<MagicCopyable,MagicCopyable> {
@SuppressWarnings("unchecked")
public <E extends MagicCopyable> E copy(final E source) {
2013-06-23 18:33:35 -07:00
if (source == null) {
2013-04-12 19:32:25 -07:00
return source;
2013-06-23 18:33:35 -07:00
}
2013-04-12 19:32:25 -07:00
E target=(E)get(source);
2013-06-23 18:33:35 -07:00
if (target==null) {
2013-04-12 19:32:25 -07:00
target=(E)source.copy(this);
put(source,target);
}
return target;
}
2013-06-23 18:33:35 -07:00
2013-04-12 19:32:25 -07:00
private Object copyObject(final Object source) {
if (source != null && source instanceof MagicCopyable) {
return copy((MagicCopyable)source);
} else {
assert source == null ||
source instanceof Enum ||
source instanceof Number ||
source instanceof String :
source.getClass().getName() + " not copied";
2013-04-12 19:32:25 -07:00
return source;
}
}
2013-06-23 18:33:35 -07:00
2013-04-12 19:32:25 -07:00
@SuppressWarnings("unchecked")
public <E> E[] copyObjects(final E[] sources,final Class<E> clazz) {
if (sources==null||sources.length==0) {
return sources;
}
final E[] targets=(E[])Array.newInstance(clazz,sources.length);
for (int index=0;index<targets.length;index++) {
targets[index]=(E)copyObject(sources[index]);
}
return targets;
}
2013-06-23 18:33:35 -07:00
2013-04-12 19:32:25 -07:00
@SuppressWarnings("unchecked")
public <E> void copyCollection(final Collection<E> sourceCollection,final Collection<E> targetCollection) {
for (final E object : sourceCollection) {
targetCollection.add((E)copyObject(object));
}
}
}