view src/luan/LuanCloner.java @ 781:fbbdd369a13a

rename DeepCloner to LuanCloner
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 29 Aug 2016 22:49:32 -0600
parents src/luan/DeepCloner.java@1a68fc55a80c
children 655280eab1e2
line wrap: on
line source

package luan;

import java.util.Map;
import java.util.HashMap;
import java.util.IdentityHashMap;


public final class LuanCloner {
	private final Map cloned = new IdentityHashMap();

	public LuanCloneable deepClone(LuanCloneable obj) {
		if( obj==null )
			return null;
		LuanCloneable rtn = (LuanCloneable)cloned.get(obj);
		if( rtn == null ) {
			rtn = obj.shallowClone();
			cloned.put(obj,rtn);
			obj.deepenClone(rtn,this);
		}
		return rtn;
	}

	public Object[] deepClone(Object[] obj) {
		if( obj.length == 0 )
			return obj;
		Object[] rtn = (Object[])cloned.get(obj);
		if( rtn == null ) {
			rtn = obj.clone();
			cloned.put(obj,rtn);
			for( int i=0; i<rtn.length; i++ ) {
				rtn[i] = get(rtn[i]);
			}
		}
		return rtn;
	}

	public Map deepClone(Map obj) {
		if( !obj.getClass().equals(HashMap.class) )
			throw new RuntimeException("can only clone HashMap");
		Map rtn = (Map)cloned.get(obj);
		if( rtn == null ) {
			rtn = new HashMap();
			for( Object stupid : obj.entrySet() ) {
				Map.Entry entry = (Map.Entry)stupid;
				rtn.put( get(entry.getKey()), get(entry.getValue()) );
			}
		}
		return rtn;
	}

	public Object get(Object obj) {
		if( obj instanceof LuanCloneable )
			return deepClone((LuanCloneable)obj);
		if( obj instanceof Object[] )
			return deepClone((Object[])obj);
		if( obj instanceof Map )
			return deepClone((Map)obj);
		return obj;
	}
}