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