コード例 #1
0
ファイル: PressureNode.cs プロジェクト: superbe/Pipeline
 /// <summary>
 /// Прямой проход.
 /// </summary>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public override BypassedArgument DirectBypass(BypassedArgument args)
 {
     OnDirectBypass(new BypassEventArgs(Name, Level, args));
     args = _strategy.DirectBypass(args);
     OnDirectBypassed(new BypassEventArgs(Name, Level, args));
     return args;
 }
コード例 #2
0
ファイル: FlowPathStrategy.cs プロジェクト: superbe/Pipeline
 /// <summary>
 /// Обработка прямого прохода.
 /// </summary>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public BypassedArgument DirectBypass(BypassedArgument args)
 {
     Thread.Sleep(100);
     args.Add(_component.Name, _component.Level);
     args = _component.Parent.DirectBypass(args);
     return args;
 }
コード例 #3
0
 /// <summary>
 /// Обработка обратного прохода с поднятием данных для прямого прохода.
 /// </summary>
 /// <remarks>Метод необходим для обработки дочерних узлов в прямом проходе,
 /// для соблюдения порядка вложенности.</remarks>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public BypassedArgument RiseDirectBypass(BypassedArgument args)
 {
     if (_component.Children == null || _component.Children.Count == 0)
         throw new Exception("Нет входного узла");
     foreach (Component child in _component.Children)
         args = child.RiseDirectBypass(args);
     args.Add(_component.Name, _component.Level);
     return args;
 }
コード例 #4
0
 /// <summary>
 /// Обработка прямого прохода.
 /// </summary>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public BypassedArgument DirectBypass(BypassedArgument args)
 {
     string lastName = args.TransportTrace.Last().Key;
     foreach (Component child in _component.Children)
         if (child.Name != lastName)
             args = child.RiseDirectBypass(args);
     args.Add(_component.Name, _component.Level);
     return _component.Parent.DirectBypass(args);
 }
コード例 #5
0
ファイル: FlowPath.cs プロジェクト: superbe/Pipeline
 /// <summary>
 /// Проход вперед.
 /// </summary>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public override BypassedArgument DirectBypass(BypassedArgument args)
 {
     if (Parent != null && _strategy != null)
     {
         OnDirectBypass(new BypassEventArgs(Name, Level, args));
         args = _strategy.DirectBypass(args);
         OnDirectBypassed(new BypassEventArgs(Name, Level, args));
     }
     return args;
 }
コード例 #6
0
ファイル: FlowPathStrategy.cs プロジェクト: superbe/Pipeline
 /// <summary>
 /// Обработка обратного прохода.
 /// </summary>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public BypassedArgument ReverseBypass(BypassedArgument args)
 {
     args.Add(_component.Name, _component.Level);
     Thread.Sleep(100);
     if (_component.Children == null || _component.Children.Count == 0)
         throw new Exception("Нет входного узла");
     foreach (Component child in _component.Children)
         args = child.ReverseBypass(args);
     return args;
 }
コード例 #7
0
        public void BranchBypassPipelineTest()
        {
            PressureNode root = new PressureNode("Pressure_0", new PressureNodeStrategy());
            FlowPath flowPath_1 = new FlowPath("FlowPath_1", new FlowPathStrategy());
            MassNode mass_2 = new MassNode("Mass_2", new SympleMassNodeStrategy());
            FlowPath flowPath_3 = new FlowPath("FlowPath_3", new FlowPathStrategy());
            MassNode mass_4 = new MassNode("Mass_4", new BranchMassNodeStrategy());
            FlowPath flowPath_5_0 = new FlowPath("FlowPath_5_0", new FlowPathStrategy());
            MassNode mass_6_0 = new MassNode("Mass_6_0", new SympleMassNodeStrategy());
            FlowPath flowPath_7_0 = new FlowPath("FlowPath_7_0", new FlowPathStrategy());
            MassNode mass_8_0 = new MassNode("Mass_8_0", new SympleMassNodeStrategy());
            FlowPath flowPath_9_0 = new FlowPath("FlowPath_9_0", new FlowPathStrategy());
            CloseNode close_10_0 = new CloseNode("Close_10_0", new CloseNodeStrategy());
            FlowPath flowPath_5_1 = new FlowPath("FlowPath_5_1", new FlowPathStrategy());
            MassNode mass_6_1 = new MassNode("Mass_6_1", new BranchMassNodeStrategy());
            FlowPath flowPath_7_1_0 = new FlowPath("FlowPath_7_1_0", new FlowPathStrategy());
            CloseNode close_8_1_0 = new CloseNode("Close_8_1_0", new CloseNodeStrategy());
            FlowPath flowPath_7_1_1 = new FlowPath("FlowPath_7_1_1", new FlowPathStrategy());
            CloseNode close_8_1_1 = new CloseNode("Close_8_1_1", new CloseNodeStrategy());

            root.Add(flowPath_1);
            flowPath_1.Add(mass_2);
            mass_2.Add(flowPath_3);
            flowPath_3.Add(mass_4);
            mass_4.Add(flowPath_5_0);
            flowPath_5_0.Add(mass_6_0);
            mass_6_0.Add(flowPath_7_0);
            flowPath_7_0.Add(mass_8_0);
            mass_8_0.Add(flowPath_9_0);
            flowPath_9_0.Add(close_10_0);
            mass_4.Add(flowPath_5_1);
            flowPath_5_1.Add(mass_6_1);
            mass_6_1.Add(flowPath_7_1_0);
            mass_6_1.Add(flowPath_7_1_1);
            flowPath_7_1_0.Add(close_8_1_0);
            flowPath_7_1_1.Add(close_8_1_1);

            BypassedArgument reverseResult = new BypassedArgument();
            reverseResult = root.ReverseBypass(reverseResult);

            BypassedArgument result = new BypassedArgument();
            result = close_8_1_0.DirectBypass(result);

            Assert.AreEqual("Pressure_0/FlowPath_1/Mass_2/FlowPath_3/Mass_4/FlowPath_5_0/Mass_6_0/FlowPath_7_0/Mass_8_0/FlowPath_9_0/Close_10_0/FlowPath_5_1/Mass_6_1/FlowPath_7_1_0/Close_8_1_0/FlowPath_7_1_1/Close_8_1_1", reverseResult.Path);
            Assert.AreEqual("Close_8_1_0/FlowPath_7_1_0/Close_8_1_1/FlowPath_7_1_1/Mass_6_1/FlowPath_5_1/Close_10_0/FlowPath_9_0/Mass_8_0/FlowPath_7_0/Mass_6_0/FlowPath_5_0/Mass_4/FlowPath_3/Mass_2/FlowPath_1/Pressure_0", result.Path);
        }
コード例 #8
0
        public void SympleBypassPipelineTest()
        {
            PressureNode rootNode = new PressureNode("PressureRootNode", new PressureNodeStrategy());
            FlowPath firstFlowPath = new FlowPath("FirstFlowPath", new FlowPathStrategy());
            MassNode massNode = new MassNode("MassNode", new SympleMassNodeStrategy());
            FlowPath secondFlowPath = new FlowPath("SecondFlowPath", new FlowPathStrategy());
            CloseNode endNode = new CloseNode("EndNode", new CloseNodeStrategy());

            secondFlowPath.Add(endNode);
            massNode.Add(secondFlowPath);
            firstFlowPath.Add(massNode);
            rootNode.Add(firstFlowPath);

            BypassedArgument reverseResult = new BypassedArgument();
            reverseResult = rootNode.ReverseBypass(reverseResult);

            BypassedArgument result = new BypassedArgument();
            result = endNode.DirectBypass(result);

            Assert.AreEqual("PressureRootNode/FirstFlowPath/MassNode/SecondFlowPath/EndNode", reverseResult.Path);
            Assert.AreEqual("EndNode/SecondFlowPath/MassNode/FirstFlowPath/PressureRootNode", result.Path);
        }
コード例 #9
0
ファイル: BypassEventArgs.cs プロジェクト: superbe/Pipeline
 /// <summary>
 /// Конструктор.
 /// </summary>
 /// <param name="name">Наименование элемента.</param>
 /// <param name="number">Порядковое число прохода.</param>
 /// <param name="args">Аргументы прохода.</param>
 public BypassEventArgs(string name, int number, BypassedArgument args)
 {
     Name = name;
     Number = number;
     Args = args;
 }
コード例 #10
0
ファイル: Program.cs プロジェクト: superbe/Pipeline
        static void Main(string[] args)
        {
            // Наполняем структуру.
            PressureNode root = new PressureNode("Pressure_0", new PressureNodeStrategy());
            FlowPath flowPath_1 = new FlowPath("FlowPath_1", new FlowPathStrategy());
            MassNode mass_2 = new MassNode("Mass_2", new SympleMassNodeStrategy());
            FlowPath flowPath_3 = new FlowPath("FlowPath_3", new FlowPathStrategy());
            MassNode mass_4 = new MassNode("Mass_4", new BranchMassNodeStrategy());
            FlowPath flowPath_5_0 = new FlowPath("FlowPath_5_0", new FlowPathStrategy());
            MassNode mass_6_0 = new MassNode("Mass_6_0", new SympleMassNodeStrategy());
            FlowPath flowPath_7_0 = new FlowPath("FlowPath_7_0", new FlowPathStrategy());
            MassNode mass_8_0 = new MassNode("Mass_8_0", new SympleMassNodeStrategy());
            FlowPath flowPath_9_0 = new FlowPath("FlowPath_9_0", new FlowPathStrategy());
            CloseNode close_10_0 = new CloseNode("Close_10_0", new CloseNodeStrategy());
            FlowPath flowPath_5_1 = new FlowPath("FlowPath_5_1", new FlowPathStrategy());
            MassNode mass_6_1 = new MassNode("Mass_6_1", new BranchMassNodeStrategy());
            FlowPath flowPath_7_1_0 = new FlowPath("FlowPath_7_1_0", new FlowPathStrategy());
            CloseNode close_8_1_0 = new CloseNode("Close_8_1_0", new CloseNodeStrategy());
            FlowPath flowPath_7_1_1 = new FlowPath("FlowPath_7_1_1", new FlowPathStrategy());
            CloseNode close_8_1_1 = new CloseNode("Close_8_1_1", new CloseNodeStrategy());

            root.Add(flowPath_1);
            flowPath_1.Add(mass_2);
            mass_2.Add(flowPath_3);
            flowPath_3.Add(mass_4);
            mass_4.Add(flowPath_5_1);
            mass_4.Add(flowPath_5_0);
            flowPath_5_0.Add(mass_6_0);
            mass_6_0.Add(flowPath_7_0);
            flowPath_7_0.Add(mass_8_0);
            mass_8_0.Add(flowPath_9_0);
            flowPath_9_0.Add(close_10_0);
            flowPath_5_1.Add(mass_6_1);
            mass_6_1.Add(flowPath_7_1_1);
            mass_6_1.Add(flowPath_7_1_0);
            flowPath_7_1_0.Add(close_8_1_0);
            flowPath_7_1_1.Add(close_8_1_1);

            BypassedArgument reverseResult = new BypassedArgument();
            BypassedArgument result = new BypassedArgument();
            // Распараллеливаем прямой и обратный проходы.
            Parallel.Invoke(() =>
            {
                reverseResult = root.ReverseBypass(reverseResult);
            }, () =>
            {
                result = close_8_1_0.DirectBypass(result);
            });
            // Сохраняем результат прямого прохода.
            StringBuilder resultBuilder = new StringBuilder();
            resultBuilder.AppendLine("Название узла \tПорядковый номер в проходе \tУровень");
            int i = 0;
            foreach (KeyValuePair<string, int> item in result.TransportTrace)
                resultBuilder.AppendLine(string.Format("{0} \t{1} \t{2}", item.Key, i++, item.Value));
            File.WriteAllText("DirectBypass.txt", resultBuilder.ToString());

            // Сохраняем результат обратного прохода.
            StringBuilder reverseResultBuilder = new StringBuilder();
            reverseResultBuilder.AppendLine("Название узла \tПорядковый номер в проходе \tУровень");
            int j = 0;
            foreach (KeyValuePair<string, int> item in reverseResult.TransportTrace)
                reverseResultBuilder.AppendLine(string.Format("{0} \t{1} \t{2}", item.Key, j++, item.Value));
            File.WriteAllText("ReverseBypass.txt", reverseResultBuilder.ToString());
        }
コード例 #11
0
ファイル: Component.cs プロジェクト: superbe/Pipeline
 /// <summary>
 /// Проход вперед.
 /// </summary>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public abstract BypassedArgument DirectBypass(BypassedArgument args);
コード例 #12
0
ファイル: Component.cs プロジェクト: superbe/Pipeline
 /// <summary>
 /// Обратный проход.
 /// </summary>
 /// <param name="args">Аргумент прохода по трубопроводу.</param>
 /// <returns>Аргумент прохода по трубопроводу.</returns>
 public abstract BypassedArgument ReverseBypass(BypassedArgument args);