//関数の追加 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); } }