public Object getValue(DustDataEntity key, Object defVal, object hint) { Object ret = defVal; DustDataReference er = null; if (content.TryGetValue(key, out ret)) { er = ret as DustDataReference; ret = (null == er) ? ret : er.getAt(hint); } if ((null == ret) && (DustValType.LinkDefMap == key.optValType)) { Object refPT; if (content.TryGetValue(DustSystem.getEntity(MetaLinks.LinkDefItemTypePrimary), out refPT)) { DustDataEntity ePT = ((DustDataReference)refPT).eTarget; var eNew = new DustDataEntity(); eNew.setValue(DustSystem.getEntity(DataLinks.EntityPrimaryType), ePT, null); ret = eNew; } } return(ret ?? defVal); }
public DustDataReference[] getMembers() { DustDataReference[] ret = null; if (null == coll) { ret = new DustDataReference[1]; ret[0] = this; } else { switch (eLinkDef.optValType) { case DustValType.LinkDefSet: var st = coll as HashSet <DustDataReference>; ret = new DustDataReference[st.Count]; st.CopyTo(ret); break; case DustValType.LinkDefArray: var lst = coll as List <DustDataReference>; ret = lst.ToArray(); break; case DustValType.LinkDefMap: var mv = (coll as Dictionary <DustDataEntity, DustDataReference>).Values; ret = new DustDataReference[mv.Count]; mv.CopyTo(ret, 0); break; } } return(ret); }
public Object setValue(DustDataEntity key, Object val, Object hint) { Object newVal = null; Object oldVal; if (!content.TryGetValue(key, out oldVal)) { oldVal = null; } switch (key.optValType) { case DustValType.AttDefBool: case DustValType.AttDefIdentifier: case DustValType.AttDefDouble: case DustValType.AttDefLong: case DustValType.AttDefRaw: newVal = val; break; case DustValType.LinkDefSingle: newVal = new DustDataReference(key, this, (DustDataEntity)val, hint); break; case DustValType.LinkDefSet: case DustValType.LinkDefArray: case DustValType.LinkDefMap: newVal = (null == oldVal) ? new DustDataReference(key, this, (DustDataEntity)val, hint) : ((DustDataReference)oldVal).addItem((DustDataEntity)val, hint); break; } content[key] = newVal; var oldRef = oldVal as DustDataReference; return((null == oldRef) ? oldVal : oldRef.eTarget); }
public DustDataReference addItem(DustDataEntity target, Object hint) { DustDataReference refAdd = null; switch (eLinkDef.optValType) { case DustValType.LinkDefSet: var hs = coll as HashSet <DustDataReference>; if (null == hs) { if (this.eTarget == target) { return(this); } coll = hs = new HashSet <DustDataReference>(); hs.Add(this); } else { foreach (var rr in hs) { if (rr.eTarget == target) { return(rr); } } } refAdd = new DustDataReference(eLinkDef, eSrc, target, hint); refAdd.coll = coll; hs.Add(refAdd); break; case DustValType.LinkDefArray: var lst = coll as List <DustDataReference>; if (null == lst) { coll = lst = new List <DustDataReference>(); lst.Add(this); this.id = 0; } refAdd = new DustDataReference(eLinkDef, eSrc, target, hint); refAdd.coll = coll; if (hint is int) { int idx = (int)hint; if ((-1 != idx) && (idx < lst.Count)) { lst[idx] = refAdd; refAdd.id = idx; return(refAdd); } } refAdd.id = lst.Count; lst.Add(refAdd); break; case DustValType.LinkDefMap: var map = coll as Dictionary <DustDataEntity, DustDataReference>; var key = hint as DustDataEntity; if (key == null) { throw new System.ArgumentException("Invalid parameter", "hint"); } refAdd = new DustDataReference(eLinkDef, eSrc, target, hint); refAdd.id = key; if (key != this.id) { if (null == map) { coll = map = new Dictionary <DustDataEntity, DustDataReference>(); map[(DustDataEntity)this.id] = this; } refAdd.coll = coll; map[key] = refAdd; } break; } return(refAdd); }