File: edgelist.cpp

package info (click to toggle)
muscle 3.60-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 1,384 kB
  • ctags: 2,079
  • sloc: cpp: 26,452; xml: 185; makefile: 101
file content (88 lines) | stat: -rw-r--r-- 1,719 bytes parent folder | download | duplicates (14)
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");
	}