Esempio n. 1
0
        /// <summary>
        /// Prepares the data for the undo.
        /// </summary>
        /// <returns>The prepared undo action data.</returns>
        public DataPrepared PrepareData()
        {
            var data  = Data;
            var count = data.Values1.Length;
            var diff  = new MemberComparison[count];

            for (int i = 0; i < count; i++)
            {
                diff[i] = new MemberComparison(Members[i], data.Values1[i].Value, data.Values2[i].Value);
            }
            return(new DataPrepared
            {
                Diff = diff,
                TargetInstance = data.Instance.Value ?? TargetInstance,
            });
        }
Esempio n. 2
0
        /// <summary>
        /// This function removes overrides from an array of
        /// MemberInfo[] while retaining original order of
        /// the members in the array.
        /// </summary>
        private Object TrimMembers(Object memberArray, Type type)
        {
            MemberInfo[] members     = (MemberInfo[])(memberArray);
            BitArray     visibleMask = new BitArray(members.Length, false);
            int          count       = 0;
            int          best;

            // Technically speaking, this algorithm
            // should not touch a type twice in the
            // inner loop. Need to fix that up
            // Real Soon Now (tm).
            for (int i = 0; i < members.Length; i++)
            {
                best = i;
                for (int j = 0; j < members.Length; j++)
                {
                    if (i == j || members[j].Name != members[best].Name)
                    {
                        continue;
                    }
                    MemberComparison cmp = CompareMembers(members[j],
                                                          members[best]);
                    if (cmp == MemberComparison.None)
                    {
                        break;
                    }
                    if ((cmp & MemberComparison.Candidate) != 0)
                    {
                        if ((cmp & MemberComparison.Override) != 0)
                        {
                            best = j;
                        }
                    }
                }

                /* speed up, use get/set instead of indexer
                 * if(visibleMask[best] == false)
                 * {
                 *      visibleMask[best] = true;
                 *      count++;
                 * }
                 */
                if (visibleMask.Get(best) == false)
                {
                    visibleMask.Set(best, true);
                    count++;
                }
            }
            MemberInfo [] newMembers = (MemberInfo[])Array.CreateInstance(type, count);
            for (int i = 0, j = 0; i < visibleMask.Count; i++)
            {
                /* speed up, use get/set instead of indexer
                 * if(visibleMask[i] == true)
                 * {
                 *      newMembers[j++] = members[i];
                 * }
                 */
                if (visibleMask.Get(i) == true)
                {
                    newMembers[j++] = members[i];
                }
            }
            return(newMembers);
        }