1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
#include "muscle.h"
#include "edgelist.h"
EdgeList::EdgeList()
{
m_uNode1 = 0;
m_uNode2 = 0;
m_uCount = 0;
m_uCacheSize = 0;
}
EdgeList::~EdgeList()
{
Clear();
}
void EdgeList::Clear()
{
delete[] m_uNode1;
delete[] m_uNode2;
m_uNode1 = 0;
m_uNode2 = 0;
m_uCount = 0;
m_uCacheSize = 0;
}
void EdgeList::Add(unsigned uNode1, unsigned uNode2)
{
if (m_uCount <= m_uCacheSize)
Expand();
m_uNode1[m_uCount] = uNode1;
m_uNode2[m_uCount] = uNode2;
++m_uCount;
}
unsigned EdgeList::GetCount() const
{
return m_uCount;
}
void EdgeList::GetEdge(unsigned uIndex, unsigned *ptruNode1, unsigned *ptruNode2) const
{
if (uIndex > m_uCount)
Quit("EdgeList::GetEdge(%u) count=%u", uIndex, m_uCount);
*ptruNode1 = m_uNode1[uIndex];
*ptruNode2 = m_uNode2[uIndex];
}
void EdgeList::Copy(const EdgeList &rhs)
{
Clear();
const unsigned uCount = rhs.GetCount();
for (unsigned n = 0; n < uCount; ++n)
{
unsigned uNode1;
unsigned uNode2;
rhs.GetEdge(n, &uNode1, &uNode2);
Add(uNode1, uNode2);
}
}
void EdgeList::Expand()
{
unsigned uNewCacheSize = m_uCacheSize + 512;
unsigned *NewNode1 = new unsigned[uNewCacheSize];
unsigned *NewNode2 = new unsigned[uNewCacheSize];
if (m_uCount > 0)
{
memcpy(NewNode1, m_uNode1, m_uCount*sizeof(unsigned));
memcpy(NewNode2, m_uNode2, m_uCount*sizeof(unsigned));
}
delete[] m_uNode1;
delete[] m_uNode2;
m_uNode1 = NewNode1;
m_uNode2 = NewNode2;
m_uCacheSize = uNewCacheSize;
}
void EdgeList::LogMe() const
{
for (unsigned n = 0; n < m_uCount; ++n)
{
if (n > 0)
Log(" ");
Log("%u->%u", m_uNode1[n], m_uNode2[n]);
}
Log("\n");
}
|