Exemple #1
0
    private void redo(List <Sync <T> > syncs)
    {
        List <Change <T> > changes = new List <Change <T> >();

        {
            for (int syncCount = 0; syncCount < syncs.Count; syncCount++)
            {
                Sync <T> sync = syncs[syncCount];
                switch (sync.getType())
                {
                case Sync <T> .Type.Set:
                {
                    SyncSet <T> syncSet = (SyncSet <T>)sync;
                    // Make change
                    ChangeSet <T> changeSet = new ChangeSet <T>();
                    {
                        changeSet.index = syncSet.index;
                        changeSet.values.AddRange(syncSet.news);
                    }
                    changes.Add(changeSet);
                }
                break;

                case Sync <T> .Type.Add:
                {
                    SyncAdd <T> syncAdd = (SyncAdd <T>)sync;
                    // Make change
                    ChangeAdd <T> changeAdd = new ChangeAdd <T>();
                    {
                        changeAdd.index = syncAdd.index;
                        changeAdd.values.AddRange(syncAdd.values);
                    }
                    changes.Add(changeAdd);
                }
                break;

                case Sync <T> .Type.Remove:
                {
                    SyncRemove <T> syncRemove = (SyncRemove <T>)sync;
                    // Make change
                    ChangeRemove <T> changeRemove = new ChangeRemove <T>();
                    {
                        changeRemove.index  = syncRemove.index;
                        changeRemove.number = syncRemove.values.Count;
                    }
                    changes.Add(changeRemove);
                }
                break;

                default:
                    Logger.LogError("unknown type: " + sync.getType() + "; " + this);
                    break;
                }
            }
        }
        if (changes.Count > 0)
        {
            this.processChange(changes);
        }
    }
    public static void replaceCallBack <T>(ValueChangeCallBack callBack, List <Sync <T> > syncs)
    {
        for (int syncCount = 0; syncCount < syncs.Count; syncCount++)
        {
            Sync <T> sync = syncs[syncCount];
            switch (sync.getType())
            {
            case Sync <T> .Type.Set:
            {
                SyncSet <T> syncSet = (SyncSet <T>)sync;
                if (syncSet.olds.Count == syncSet.news.Count)
                {
                    for (int i = 0; i < syncSet.olds.Count; i++)
                    {
                        // od value
                        RemoveCallBack(callBack, syncSet.olds[i]);
                        // add new value
                        AddCallBack(callBack, syncSet.news[i]);
                    }
                }
                else
                {
                    Logger.LogError("count error: " + syncSet.olds.Count + "; " + syncSet.news.Count);
                }
            }
            break;

            case Sync <T> .Type.Add:
            {
                SyncAdd <T> syncAdd = (SyncAdd <T>)sync;
                for (int i = 0; i < syncAdd.values.Count; i++)
                {
                    T value = syncAdd.values[i];
                    AddCallBack(callBack, value);
                }
            }
            break;

            case Sync <T> .Type.Remove:
            {
                SyncRemove <T> syncRemove = (SyncRemove <T>)sync;
                for (int i = 0; i < syncRemove.values.Count; i++)
                {
                    T value = syncRemove.values[i];
                    RemoveCallBack(callBack, value);
                }
            }
            break;

            default:
                Logger.LogError("unknown type: " + sync.getType());
                break;
            }
        }
    }
    public static void getAddAndRemoveValues <T>(List <Sync <T> > syncs, List <T> addValues, List <T> removeValues)
    {
        for (int syncCount = 0; syncCount < syncs.Count; syncCount++)
        {
            Sync <T> sync = syncs[syncCount];
            switch (sync.getType())
            {
            case Sync <T> .Type.Set:
            {
                SyncSet <T> syncSet = (SyncSet <T>)sync;
                if (syncSet.olds.Count == syncSet.news.Count)
                {
                    for (int i = 0; i < syncSet.olds.Count; i++)
                    {
                        // od value
                        removeValues.Add(syncSet.olds[i]);
                        // add new value
                        addValues.Add(syncSet.news[i]);
                    }
                }
                else
                {
                    Logger.LogError("count error: " + syncSet.olds.Count + "; " + syncSet.news.Count);
                }
            }
            break;

            case Sync <T> .Type.Add:
            {
                SyncAdd <T> syncAdd = (SyncAdd <T>)sync;
                for (int i = 0; i < syncAdd.values.Count; i++)
                {
                    T value = syncAdd.values[i];
                    addValues.Add(value);
                }
            }
            break;

            case Sync <T> .Type.Remove:
            {
                SyncRemove <T> syncRemove = (SyncRemove <T>)sync;
                for (int i = 0; i < syncRemove.values.Count; i++)
                {
                    T value = syncRemove.values[i];
                    removeValues.Add(value);
                }
            }
            break;

            default:
                Logger.LogError("unknown type: " + sync.getType());
                break;
            }
        }
    }
Exemple #4
0
    public void processChange(List <Change <T> > changes)
    {
        if (changes.Count > 0)
        {
            // Make list change
            List <Sync <T> > syncs = new List <Sync <T> >();
            {
                for (int syncCount = 0; syncCount < changes.Count; syncCount++)
                {
                    Change <T> change = changes[syncCount];
                    switch (change.getType())
                    {
                    case Change <T> .Type.Set:
                    {
                        ChangeSet <T> changeSet = (ChangeSet <T>)change;
                        // keep old SyncSet
                        SyncSet <T> oldSyncSet = null;
                        if (changeSet.index >= 0 && changeSet.index + changeSet.values.Count <= this.vs.Count)
                        {
                            for (int i = 0; i < changeSet.values.Count; i++)
                            {
                                int setIndex = changeSet.index + i;
                                T   oldValue = this.vs[setIndex];
                                // check is different
                                bool isDifferent = true;
                                {
                                    if (object.Equals(oldValue, changeSet.values[i]))
                                    {
                                        isDifferent = false;
                                    }
                                    else
                                    {
                                        if (((Data)(object)changeSet.values[i]).uid == ((Data)(object)oldValue).uid)
                                        {
                                            isDifferent = false;
                                        }
                                    }
                                }
                                // Make change
                                if (isDifferent)
                                {
                                    // Change
                                    {
                                        // Set parent
                                        {
                                            ((Data)(object)oldValue).p            = null;
                                            ((Data)(object)changeSet.values[i]).p = this;
                                        }
                                        // add
                                        this.vs[setIndex] = changeSet.values[i];
                                    }
                                    // Make Sync
                                    {
                                        // get changeSet
                                        SyncSet <T> syncSet = null;
                                        {
                                            // check old
                                            if (oldSyncSet != null)
                                            {
                                                if (oldSyncSet.index + oldSyncSet.olds.Count == setIndex)
                                                {
                                                    syncSet = oldSyncSet;
                                                }
                                            }
                                            // make new
                                            if (syncSet == null)
                                            {
                                                syncSet = new SyncSet <T>();
                                                {
                                                    syncSet.index = setIndex;
                                                }
                                                syncs.Add(syncSet);
                                                // set new old
                                                oldSyncSet = syncSet;
                                            }
                                        }
                                        // add value
                                        {
                                            syncSet.olds.Add(oldValue);
                                            syncSet.news.Add(changeSet.values[i]);
                                        }
                                    }
                                }
                                else
                                {
                                    // Debug.LogError("why the same: " + oldValue + "; " + changeSet.values[i]);
                                }
                            }
                        }
                        else
                        {
                            Logger.LogError("index error: " + changeSet.index + "; " + this.vs.Count + "; " + this);
                        }
                    }
                    break;

                    case Change <T> .Type.Add:
                    {
                        ChangeAdd <T> changeAdd = (ChangeAdd <T>)change;
                        // Add
                        if (changeAdd.index >= 0 && changeAdd.index <= this.vs.Count)
                        {
                            // Change
                            {
                                // set parent
                                {
                                    foreach (T value in changeAdd.values)
                                    {
                                        if (value != null)
                                        {
                                            ((Data)(object)value).p = this;
                                        }
                                        else
                                        {
                                            Logger.LogError("why value null: " + this);
                                        }
                                    }
                                }
                                this.vs.InsertRange(changeAdd.index, changeAdd.values);
                            }
                            // Make Sync
                            {
                                SyncAdd <T> syncAdd = new SyncAdd <T>();
                                {
                                    syncAdd.index = changeAdd.index;
                                    syncAdd.values.AddRange(changeAdd.values);
                                }
                                syncs.Add(syncAdd);
                            }
                        }
                        else
                        {
                            Logger.LogError("index error: " + changeAdd.index + "; " + this.vs.Count + "; " + this);
                        }
                    }
                    break;

                    case Change <T> .Type.Remove:
                    {
                        ChangeRemove <T> changeRemove = (ChangeRemove <T>)change;
                        // Check index
                        if (changeRemove.number > 0 && changeRemove.index >= 0 && changeRemove.index + changeRemove.number <= this.vs.Count)
                        {
                            // Make sync: phai make sync truoc moi lay duoc oldValues
                            SyncRemove <T> syncRemove = new SyncRemove <T>();
                            {
                                syncRemove.index = changeRemove.index;
                                for (int i = 0; i < changeRemove.number; i++)
                                {
                                    syncRemove.values.Add(this.vs[changeRemove.index + i]);
                                }
                            }
                            syncs.Add(syncRemove);
                            // Change
                            {
                                // set parent
                                {
                                    foreach (T value in syncRemove.values)
                                    {
                                        if (value != null)
                                        {
                                            ((Data)(object)value).p = null;
                                        }
                                        else
                                        {
                                            Logger.LogError("why value null: " + this);
                                        }
                                    }
                                }
                                // Remove
                                this.vs.RemoveRange(changeRemove.index, changeRemove.number);
                            }
                        }
                        else
                        {
                            Logger.LogError("index error: " + this);
                        }
                    }
                    break;

                    default:
                        Logger.LogError("unknown change type: " + change.getType() + "; " + this);
                        break;
                    }
                }
            }
            // CallBack
            if (syncs.Count > 0)
            {
                foreach (ValueChangeCallBack callBack in p.callBacks.ToArray())
                {
                    callBack.onUpdateSync(this, syncs);
                }
            }
            else
            {
                // Debug.LogError("why don't have syncCount: " + this);
            }
        }
        else
        {
            Logger.LogError("why don't have changes: " + this);
        }
    }