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