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