From b5094fdf056da210c6f4f9514f338050dacf659e Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Tue, 12 Jul 2016 15:51:09 +0200
Subject: [PATCH] added ExtensionMethods for PortProvider-Classes

---
 .../VectoCore/Utils/ProviderExtensions.cs     | 71 +++++++++++++++++++
 VectoCore/VectoCore/VectoCore.csproj          |  1 +
 2 files changed, 72 insertions(+)
 create mode 100644 VectoCore/VectoCore/Utils/ProviderExtensions.cs

diff --git a/VectoCore/VectoCore/Utils/ProviderExtensions.cs b/VectoCore/VectoCore/Utils/ProviderExtensions.cs
new file mode 100644
index 0000000000..6fe13a2cb5
--- /dev/null
+++ b/VectoCore/VectoCore/Utils/ProviderExtensions.cs
@@ -0,0 +1,71 @@
+using System;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Models.SimulationComponent;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+
+namespace TUGraz.VectoCore.Utils
+{
+	public static class ProviderExtensions
+	{
+		public static IDriver AddComponent(this IDrivingCycleInProvider prev, IDriver next)
+		{
+			prev.InPort().Connect(next.OutPort());
+			return next;
+		}
+
+		public static IVehicle AddComponent(this IDriverDemandInProvider prev, IVehicle next)
+		{
+			prev.InPort().Connect(next.OutPort());
+			return next;
+		}
+
+		public static IWheels AddComponent(this IFvInProvider prev, IWheels next)
+		{
+			prev.InPort().Connect(next.OutPort());
+			return next;
+		}
+
+		public static IPowerTrainComponent AddComponent(this ITnInProvider prev, IPowerTrainComponent next)
+		{
+			prev.InPort().Connect(next.OutPort());
+			return next;
+		}
+
+		public static IPowerTrainComponent AddComponent(this IPowerTrainComponent prev, IPowerTrainComponent next)
+		{
+			prev.InPort().Connect(next.OutPort());
+			return next;
+		}
+
+		public static CombustionEngine AddComponent(this IPowerTrainComponent prev, CombustionEngine next)
+		{
+			prev.InPort().Connect(next.OutPort());
+
+			var clutch = prev as IClutch;
+			if (clutch != null)
+				next.IdleController.RequestPort = clutch.IdleControlPort;
+			return next;
+		}
+
+		public static IPowerTrainComponent AddRetarderAndGearbox(this IPowerTrainComponent prev, RetarderData data,
+			IGearbox gearbox,
+			IVehicleContainer container)
+		{
+			switch (data.Type) {
+				case RetarderType.Primary:
+					return prev.AddComponent(new Retarder(container, data.LossMap, data.Ratio)).AddComponent(gearbox);
+				case RetarderType.Secondary:
+					return prev.AddComponent(gearbox).AddComponent(new Retarder(container, data.LossMap, data.Ratio));
+				case RetarderType.None:
+					return prev.AddComponent(new DummyRetarder(container)).AddComponent(gearbox);
+				case RetarderType.LossesIncludedInTransmission:
+					return prev.AddComponent(new DummyRetarder(container)).AddComponent(gearbox);
+				default:
+					throw new ArgumentOutOfRangeException();
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 914257afd0..c395834226 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -131,6 +131,7 @@
     <Compile Include="Models\Connector\Ports\Impl\Response.cs" />
     <Compile Include="Models\Connector\Ports\IFvPort.cs" />
     <Compile Include="Models\Connector\Ports\ITnPort.cs" />
+    <Compile Include="Utils\ProviderExtensions.cs" />
     <Compile Include="Models\Declaration\AirDrag.cs" />
     <Compile Include="Models\Declaration\Fan.cs" />
     <Compile Include="Models\Declaration\HVAC.cs" />
-- 
GitLab