⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aaconnection.cpp

📁 模拟P2P各种网络环境的,适合新手们的学习,不错的源码.
💻 CPP
字号:
#include "AAConnection.h"
#include "Agent.h"
#include "Connection.h"
#include "Node.h"

ostream &operator<<(ostream &os, const AAConnection &connection)
{
	os << '(' << connection.mSource->getNode()->getID() << ", " << connection.mDestination->getNode()->getID() << "): " << (connection.mActive ? "active" : "inactive") \
		<< '\t' << (connection.mLock ? "lock" : "unlock") << '\t' << connection.mBandwidth << '\t' \
		<< (connection.mLock ? connection.mBandwidthLock : 0) << endl;
	os << *connection.mConnection;
	return os;
}

AAConnection::AAConnection(Agent *agent1, Agent *agent2): mActive(false), mLock(true), mBandwidth(0), mBandwidthAtoB(0), mBandwidthBtoA(0), mBandwidthLock(0)
{
	if(!agent1 || !agent2)
	{
		cout << "error: null agent pointer passed to AAConnection::AAconnection()" << endl;
		exit(-1);
	}
	int id1 = agent1->getNode()->getID();
	int id2 = agent2->getNode()->getID();

	mSource = agent1;
	mDestination = agent2;

	if(!(mConnection = Connection::find(id1, id2)))
		mConnection = new Connection(id1, id2);
	mConnection->record(this);
};

AAConnection::~AAConnection()
{
	if(mActive)
		inactivate();
	mConnection->remove(this);
	if(mConnection->isEmpty())
		delete mConnection;
}

bool AAConnection::isActive() const
{
	return mActive;
}

unsigned long AAConnection::getBandwidth() const
{
	return mBandwidth;
}

unsigned long AAConnection::getBandwidthFrom(const Agent *agent) const
{
	if(agent == mSource)
		return mBandwidthAtoB;
	else if(agent == mDestination)
		return mBandwidthBtoA;
	else
	{
		cout << "error: invalid agent pointer passed to AAConnection::getBandwidthFrom()" << endl;
		exit(-1);
	}
}

void AAConnection::setBandwidthFrom(const Agent *agent, unsigned long bandwidth)
{
	if(agent == mSource)
		mBandwidthAtoB = bandwidth;
	else if(agent == mDestination)
		mBandwidthBtoA = bandwidth;
	else
	{
		cout << "error: invalid agent pointer passed to AAConnection::setBandwidth()" << endl;
		exit(-1);
	}
}

long long AAConnection::adjustBandwidth(long long value, bool flag)
{
	if(!mActive)
	{
		cout << "error: the logical connection is inacive but you call AAConnection::adjustBandwidth()" << endl;
		exit(-1);
	}
	if(flag)
	{
		if(value < 0)
		{
			cout << "error: nagative value in AAConnection::adjustBandwidth()" << endl;
			exit(-1);
		}
		if(value > mBandwidthLock)
		{
			cout << "error: incorrect value" << endl;
			exit(-1);
		}
		unsigned long temp = mBandwidth;
		mBandwidth = value;
		return value - temp;
	}
	else
		if(value < 0)
		{
			if(mBandwidthLock + value < 0)
				value = (long long)0 - mBandwidthLock;
			unsigned long reserve = mBandwidthLock;
			mBandwidthLock += value;
			mConnection->adjust((long long)mBandwidthLock - reserve);
		}
		else if(value > 0)
		{
			if(mBandwidthLock + value > UINT_MAX)
				value = (long long)UINT_MAX - mBandwidthLock;
			unsigned long reserve = mBandwidthLock;
			mBandwidthLock += value;
			mConnection->adjust(mBandwidthLock - reserve);
		}
	return 0;
}

bool AAConnection::isLock() const
{
	return mLock;
}

unsigned long AAConnection::getLockValue() const
{
	return mBandwidthLock;
}

void AAConnection::activate(unsigned long value)
{
	if(mActive)
		return;
	
	mBandwidthLock = value;
	mActive = true;
	mConnection->adjust(mBandwidthLock);
}

void AAConnection::inactivate()
{
	if(!mActive)
		return;
	
	long long temp = 0 - (long long)mBandwidthLock;
	
	mActive = false;
	mBandwidth = 0;
	mBandwidthAtoB = 0;
	mBandwidthBtoA = 0;
	mBandwidthLock = 0;
	
	mConnection->adjust(temp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -