Пример #1
0
        //関数の追加
        public void Add(Function function)
        {
            if (_compress &&                                                          //分岐毎のまとめを行うか
                (function is SingleInputFunction || function is MultiOutputFunction)) //入力が一つの関数のみまとめられる
            {
                //入力名称で辞書に登録が有るかチェック
                if (this.FunctionBlockDictionary.ContainsKey(function.InputNames[0]))
                {
                    //ブロックが既に辞書登録されていればブロックに連結
                    this.FunctionBlockDictionary[function.InputNames[0]].Add(function);

                    //出力名称を上書き
                    this.FunctionBlockDictionary[function.InputNames[0]].OutputNames = function.OutputNames.ToArray();

                    //分割済み関数なら分割元の出力名を更新する
                    if (SplitedFunctionDictionary.ContainsKey(function.InputNames[0]))
                    {
                        FunctionStack spliteFunction = SplitedFunctionDictionary[function.InputNames[0]];

                        for (int i = 0; i < spliteFunction.OutputNames.Length; i++)
                        {
                            if (spliteFunction.OutputNames[i] == function.InputNames[0])
                            {
                                spliteFunction.OutputNames[i] = function.OutputNames[0];

                                if (!SplitedFunctionDictionary.ContainsKey(function.OutputNames[0]))
                                {
                                    SplitedFunctionDictionary.Add(function.OutputNames[0], spliteFunction);
                                }
                            }
                        }
                    }

                    if (!(function is MultiOutputFunction) &&                               //出力が分岐する場合は登録せずリンクを切る
                        !this.FunctionBlockDictionary.ContainsKey(function.OutputNames[0])) //既に登録されている場合は登録しない
                    {
                        //リンクを辞書へ追加
                        this.FunctionBlockDictionary.Add(function.OutputNames[0], this.FunctionBlockDictionary[function.InputNames[0]]);
                    }
                    else if (function is SplitFunction) //SplitFunctionの場合
                    {
                        var splitFunctions = ((SplitFunction)function).SplitedFunctions;

                        for (int i = 0; i < splitFunctions.Length; i++)
                        {
                            //内部のFunctionStackをリンクの辞書へ追加
                            FunctionBlockDictionary.Add(function.OutputNames[i], splitFunctions[i]);

                            //SplitFunctionのリストへ追加
                            SplitedFunctionDictionary.Add(function.OutputNames[i], this.FunctionBlockDictionary[function.InputNames[0]]);
                        }
                    }

                    return;
                }
            }

            //以下無圧縮、もしくはMultiInput,DualInput用の処理

            //ブロックが辞書に登録されているか
            if (this.FunctionBlockDictionary.ContainsKey(function.OutputNames[0]))
            {
                //ブロックが既に辞書登録されていればブロックに連結
                this.FunctionBlockDictionary[function.OutputNames[0]].Add(function);
            }
            else
            {
                //登録がなければブロックを新規に作る
                FunctionStack functionRecord = new FunctionStack(function, function.Name, function.InputNames, function.OutputNames);

                //実行順に登録
                this.FunctionBlocks.Add(functionRecord);

                //リンクを辞書へ追加
                this.FunctionBlockDictionary.Add(function.Name, functionRecord);
            }
        }