1#pragma once
2#ifndef HACD_CIRCULAR_LIST_INL
3#define HACD_CIRCULAR_LIST_INL
4namespace VHACD
5{
6 template < typename T >
7 inline bool CircularList<T>::Delete(CircularListElement<T> * element)
8 {
9 if (!element)
10 {
11 return false;
12 }
13 if (m_size > 1)
14 {
15 CircularListElement<T> * next = element->GetNext();
16 CircularListElement<T> * prev = element->GetPrev();
17 delete element;
18 m_size--;
19 if (element == m_head)
20 {
21 m_head = next;
22 }
23 next->GetPrev() = prev;
24 prev->GetNext() = next;
25 return true;
26 }
27 else if (m_size == 1)
28 {
29 delete m_head;
30 m_size--;
31 m_head = 0;
32 return true;
33 }
34 else
35 {
36 return false;
37 }
38 }
39
40 template < typename T >
41 inline bool CircularList<T>::Delete()
42 {
43 if (m_size > 1)
44 {
45 CircularListElement<T> * next = m_head->GetNext();
46 CircularListElement<T> * prev = m_head->GetPrev();
47 delete m_head;
48 m_size--;
49 m_head = next;
50 next->GetPrev() = prev;
51 prev->GetNext() = next;
52 return true;
53 }
54 else if (m_size == 1)
55 {
56 delete m_head;
57 m_size--;
58 m_head = 0;
59 return true;
60 }
61 else
62 {
63 return false;
64 }
65 }
66 template < typename T >
67 inline CircularListElement<T> * CircularList<T>::Add(const T * data)
68 {
69 if (m_size == 0)
70 {
71 if (data)
72 {
73 m_head = new CircularListElement<T>(*data);
74 }
75 else
76 {
77 m_head = new CircularListElement<T>();
78 }
79 m_head->GetNext() = m_head->GetPrev() = m_head;
80 }
81 else
82 {
83 CircularListElement<T> * next = m_head->GetNext();
84 CircularListElement<T> * element = m_head;
85 if (data)
86 {
87 m_head = new CircularListElement<T>(*data);
88 }
89 else
90 {
91 m_head = new CircularListElement<T>();
92 }
93 m_head->GetNext() = next;
94 m_head->GetPrev() = element;
95 element->GetNext() = m_head;
96 next->GetPrev() = m_head;
97 }
98 m_size++;
99 return m_head;
100 }
101 template < typename T >
102 inline CircularListElement<T> * CircularList<T>::Add(const T & data)
103 {
104 const T * pData = &data;
105 return Add(pData);
106 }
107 template < typename T >
108 inline bool CircularList<T>::Next()
109 {
110 if (m_size == 0)
111 {
112 return false;
113 }
114 m_head = m_head->GetNext();
115 return true;
116 }
117 template < typename T >
118 inline bool CircularList<T>::Prev()
119 {
120 if (m_size == 0)
121 {
122 return false;
123 }
124 m_head = m_head->GetPrev();
125 return true;
126 }
127 template < typename T >
128 inline CircularList<T>::CircularList(const CircularList& rhs)
129 {
130 if (rhs.m_size > 0)
131 {
132 CircularListElement<T> * current = rhs.m_head;
133 do
134 {
135 current = current->GetNext();
136 Add(current->GetData());
137 }
138 while ( current != rhs.m_head );
139 }
140 }
141 template < typename T >
142 inline const CircularList<T>& CircularList<T>::operator=(const CircularList& rhs)
143 {
144 if (&rhs != this)
145 {
146 Clear();
147 if (rhs.m_size > 0)
148 {
149 CircularListElement<T> * current = rhs.m_head;
150 do
151 {
152 current = current->GetNext();
153 Add(current->GetData());
154 }
155 while ( current != rhs.m_head );
156 }
157 }
158 return (*this);
159 }
160}
161#endif