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