📄 vlink.cpp
字号:
#include "VLink.h"
#include "VConnection.h"
VLink::VLink(Agent *agent, Node *node)
{
if(!agent || !node) {
cout << "error: null pointer" << endl;
exit(-1);
}
mAgent = agent;
mNode = node;
}
void VLink::reset()
{
mAvailableBandwidthIn = mBandwidthIn;
mAvailableBandwidthOut = mBandwidthOut;
mActiveConnectionIn.clear();
mActiveConnectionOut.clear();
mInactiveConnectionIn.clear();
mInactiveConnectionOut.clear();
}
void VLink::addConnection(bool flag, VConnection *pc)
{
if(flag)
mInactiveConnectionIn.insert(pc);
else
mInactiveConnectionOut.insert(pc);
}
void VLink::removeConnection(bool flag, VConnection *pc)
{
if(flag)
mInactiveConnectionIn.erase(pc);
else
mInactiveConnectionOut.erase(pc);
}
void VLink::activateConnection(bool flag, VConnection *pc)
{
if(flag) {
mInactiveConnectionIn.erase(pc);
mActiveConnectionIn.insert(pc);
mAvailableBandwidthIn -= pc->getBandwidth();
if(mAvailableBandwidthIn < 0) {
cout << "error: negative available bandwidth" << endl;
exit(-1);
}
}
else {
mInactiveConnectionOut.erase(pc);
mActiveConnectionOut.insert(pc);
mAvailableBandwidthOut -= pc->getBandwidth();
if(mAvailableBandwidthOut < 0) {
cout << "error: negative available bandwidth" << endl;
exit(-1);
}
}
}
void VLink::inactivateConnection(bool flag, VConnection *pc)
{
if(flag) {
mActiveConnectionIn.erase(pc);
mInactiveConnectionIn.insert(pc);
mAvailableBandwidthIn += pc->getBandwidth();
if(mAvailableBandwidthIn > mBandwidthIn) {
cout << "error: greater available bandwidth" << endl;
exit(-1);
}
}
else {
mActiveConnectionOut.erase(pc);
mInactiveConnectionOut.insert(pc);
mAvailableBandwidthOut += pc->getBandwidth();
if(mAvailableBandwidthOut > mBandwidthOut) {
cout << "error: greater available bandwidth" << endl;
exit(-1);
}
}
}
void VLink::adjustUp(bool flag, VConnection *pc, unsigned long value)
{
if(flag) {
if(mActiveConnectionIn.find(pc) == mActiveConnectionIn.end())
exit(-1);
mAvailableBandwidthIn -= value;
if(mAvailableBandwidthIn < 0) {
cout << "error: negative bandwidth" << endl;
exit(-1);
}
}
else {
if(mActiveConnectionOut.find(pc) == mActiveConnectionOut.end())
exit(-1);
mAvailableBandwidthOut -= value;
if(mAvailableBandwidthOut < 0) {
cout << "error: negative bandwidth" << endl;
exit(-1);
}
}
}
void VLink::adjustDown(bool flag, VConnection *pc, unsigned long value)
{
if(flag) {
if(mActiveConnectionIn.find(pc) == mActiveConnectionIn.end())
exit(-1);
mAvailableBandwidthIn += value;
if(mAvailableBandwidthIn > mBandwidthIn) {
cout << "error: greater available bandwidth" << endl;
exit(-1);
}
}
else {
if(mActiveConnectionOut.find(pc) == mActiveConnectionOut.end())
exit(-1);
mAvailableBandwidthOut += value;
if(mAvailableBandwidthOut > mBandwidthOut) {
cout << "error: greater available bandwidth" << endl;
exit(-1);
}
}
}
void VLink::reallocate()
{
if(!mActiveConnectionIn.empty()) {
unsigned long average = mBandwidthIn / mActiveConnectionIn.size();
set<VConnection *> leftConnection = mActiveConnectionIn;
while(mAvailableBandwidthIn > 0 && !leftConnection.empty())
{
unsigned long min = UINT_MAX;
VConnection *pc = NULL;
set<VConnection *>::iterator it;
for(it = leftConnection.begin(); it != leftConnection.end(); it++)
{
unsigned long temp = (**it).getBandwidth();
if(min > temp) {
min = temp;
pc = *it;
}
}
if(!pc) {
cout << "error: impossible" << endl;
exit(-1);
}
if(min < average)
pc->adjustBandwidth(average - min);
else
pc->adjustBandwidth(mAvailableBandwidthIn);
if(mAvailableBandwidthIn < 0) {
cout << "error: the available bandwidth is less than 0" << endl;
exit(-1);
}
leftConnection.erase(pc);
}
}
else if(!mActiveConnectionOut.empty()){
unsigned long average = mBandwidthOut / mActiveConnectionOut.size();
set<VConnection *> leftConnection = mActiveConnectionOut;
while(mAvailableBandwidthOut > 0 && !leftConnection.empty())
{
unsigned long min = UINT_MAX;
VConnection *pc = NULL;
set<VConnection *>::iterator it;
for(it = leftConnection.begin(); it != leftConnection.end(); it++)
{
unsigned long temp = (**it).getBandwidth();
if(min > temp) {
min = temp;
pc = *it;
}
}
if(!pc) {
cout << "error: impossible" << endl;
exit(-1);
}
if(min < average)
pc->adjustBandwidth(average - min);
else
pc->adjustBandwidth(mAvailableBandwidthOut);
if(mAvailableBandwidthOut < 0) {
cout << "error: the available bandwidth is less than 0" << endl;
exit(-1);
}
leftConnection.erase(pc);
}
}
}
VConnection *VLink::getMaxConnection(bool flag)
{
unsigned long max = 0;
VConnection *pc = NULL;
set<VConnection *>::iterator it;
if(flag) {
for(it = mActiveConnectionIn.begin(); it != mActiveConnectionIn.end(); it++)
if(max < (*it)->getBandwidth()) {
max = (*it)->getBandwidth();
pc = *it;
}
}
else
for(it = mActiveConnectionOut.begin(); it != mActiveConnectionOut.end(); it++)
if(max < (*it)->getBandwidth()) {
max = (*it)->getBandwidth();
pc = *it;
}
return pc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -