Example #1
0
        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);
        }
Example #3
0
        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);
        }