Mercurial Hosting > luan
comparison src/luan/LuanCloner.java @ 1335:e0cf0d108a77
major cleanup
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Thu, 14 Feb 2019 03:10:45 -0700 |
| parents | d69d3c51c44e |
| children | e1a13e707bf3 |
comparison
equal
deleted
inserted
replaced
| 1334:c88b486a9511 | 1335:e0cf0d108a77 |
|---|---|
| 1 package luan; | 1 package luan; |
| 2 | 2 |
| 3 import java.util.Map; | 3 import java.util.Map; |
| 4 import java.util.HashMap; | 4 import java.util.Collection; |
| 5 import java.util.IdentityHashMap; | 5 import java.util.IdentityHashMap; |
| 6 | 6 |
| 7 | 7 |
| 8 public final class LuanCloner { | 8 public final class LuanCloner { |
| 9 public enum Type { COMPLETE, INCREMENTAL } | 9 public enum Type { COMPLETE, INCREMENTAL } |
| 10 | 10 |
| 11 public final Type type; | 11 public final Type type; |
| 12 private final Map cloned = new IdentityHashMap(); | 12 private final Map cloned = new IdentityHashMap(); |
| 13 private Luan luan = null; | |
| 13 | 14 |
| 14 public LuanCloner(Type type) { | 15 public LuanCloner(Type type) { |
| 15 this.type = type; | 16 this.type = type; |
| 16 } | 17 } |
| 17 | 18 |
| 18 public LuanCloneable clone(LuanCloneable obj) { | 19 public LuanCloneable clone(LuanCloneable obj) { |
| 19 if( obj==null ) | 20 if( obj==null ) |
| 20 return null; | 21 return null; |
| 21 LuanCloneable rtn = (LuanCloneable)cloned.get(obj); | 22 LuanCloneable rtn = (LuanCloneable)cloned.get(obj); |
| 22 if( rtn == null ) { | 23 if( rtn == null ) { |
| 24 if( obj instanceof Luan ) { | |
| 25 if( luan != null ) | |
| 26 throw new RuntimeException("2 luans in "+type+" "+this+" - "+luan+" "+obj); | |
| 27 luan = (Luan)obj; | |
| 28 } | |
| 23 rtn = obj.shallowClone(); | 29 rtn = obj.shallowClone(); |
| 24 cloned.put(obj,rtn); | 30 cloned.put(obj,rtn); |
| 25 obj.deepenClone(rtn,this); | 31 obj.deepenClone(rtn,this); |
| 26 } | 32 } |
| 27 return rtn; | 33 return rtn; |
| 40 } | 46 } |
| 41 return rtn; | 47 return rtn; |
| 42 } | 48 } |
| 43 | 49 |
| 44 public Map clone(Map obj) { | 50 public Map clone(Map obj) { |
| 45 if( !obj.getClass().equals(HashMap.class) ) | |
| 46 throw new RuntimeException("can only clone HashMap"); | |
| 47 Map rtn = (Map)cloned.get(obj); | 51 Map rtn = (Map)cloned.get(obj); |
| 48 if( rtn == null ) { | 52 if( rtn == null ) { |
| 49 rtn = new HashMap(); | 53 try { |
| 54 rtn = obj.getClass().newInstance(); | |
| 55 } catch(InstantiationException e) { | |
| 56 throw new RuntimeException(e); | |
| 57 } catch(IllegalAccessException e) { | |
| 58 throw new RuntimeException(e); | |
| 59 } | |
| 50 for( Object stupid : obj.entrySet() ) { | 60 for( Object stupid : obj.entrySet() ) { |
| 51 Map.Entry entry = (Map.Entry)stupid; | 61 Map.Entry entry = (Map.Entry)stupid; |
| 52 rtn.put( get(entry.getKey()), get(entry.getValue()) ); | 62 rtn.put( get(entry.getKey()), get(entry.getValue()) ); |
| 63 } | |
| 64 } | |
| 65 return rtn; | |
| 66 } | |
| 67 | |
| 68 public Collection clone(Collection obj) { | |
| 69 Collection rtn = (Collection)cloned.get(obj); | |
| 70 if( rtn == null ) { | |
| 71 try { | |
| 72 rtn = obj.getClass().newInstance(); | |
| 73 } catch(InstantiationException e) { | |
| 74 throw new RuntimeException(e); | |
| 75 } catch(IllegalAccessException e) { | |
| 76 throw new RuntimeException(e); | |
| 77 } | |
| 78 for( Object entry : (Collection)obj ) { | |
| 79 rtn.add( get(entry) ); | |
| 53 } | 80 } |
| 54 } | 81 } |
| 55 return rtn; | 82 return rtn; |
| 56 } | 83 } |
| 57 | 84 |
| 60 return clone((LuanCloneable)obj); | 87 return clone((LuanCloneable)obj); |
| 61 if( obj instanceof Object[] ) | 88 if( obj instanceof Object[] ) |
| 62 return clone((Object[])obj); | 89 return clone((Object[])obj); |
| 63 if( obj instanceof Map ) | 90 if( obj instanceof Map ) |
| 64 return clone((Map)obj); | 91 return clone((Map)obj); |
| 92 if( obj instanceof Collection ) | |
| 93 return clone((Collection)obj); | |
| 65 return obj; | 94 return obj; |
| 66 } | 95 } |
| 67 } | 96 } |
