#ifndef TWISTED_PAIR_H_
#define TWISTED_PAIR_H_

#include <string>
#include "networks/wiredbas/WiredBasPlatformInstance.h"
#include "networks/wiredbas/WiredBasImplementation.h"
#include "quantities/WiringPath.h"
#include "quantities/RealLatency.h"
#include "quantities/Name.h"
#include "quantities/Ports.h"
#include "libraries/wiredbas/common/Link.h"
#include "models/wiredbas/link/TwistedPairDelay.h"
#include "models/wiredbas/link/TwistedPairCost.h"

namespace cosi {

namespace library {

namespace wiredbas {

class TwistedPair : public cosi::library::wiredbas::Link {

	cosi::models::wiredbas::TwistedPairDelay* mDelayModel;

	cosi::models::wiredbas::TwistedPairCost* mCostModel;

public:

	TwistedPair(cosi::models::wiredbas::TwistedPairDelay* pDelayModel,cosi::models::wiredbas::TwistedPairCost* pCostModel);

	virtual ~TwistedPair();

	void SetDelayModel(cosi::models::wiredbas::TwistedPairDelay* pDelay);

	void SetCostModel(cosi::models::wiredbas::TwistedPairCost* pCost);

	RealDelay GetDelay(WiringPath pPath);

	double GetDelayValue(WiringPath pPath);

	double GetCost(WiringPath pPath);

	cosi::commstruct::wiredbas::PlatformInstance* GetPlatformInstance(
			int U, std::string pPortU , int V , std::string pPortV);

	cosi::commstruct::wiredbas::Implementation
			* GetImplementationInstance(int U, std::string pPortU, int V, std::string pPortV, WiringPath pPath);

	static std::string ComponentName;
	static std::string ComponentType;

};

}
}
}

#endif /*TWISTEDPAIR_H_*/
