📄 aaconnection.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 + -