[#19232] (2.5) Correction of cmake for windows about audio (jack and openal)
[blender.git] / source / gameengine / SceneGraph / SG_DList.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29 #ifndef __SG_DLIST
30 #define __SG_DLIST
31
32 #include <stdlib.h>
33
34 #ifdef WITH_CXX_GUARDEDALLOC
35 #include "MEM_guardedalloc.h"
36 #endif
37
38 /**
39  * Double circular linked list
40  */
41 class SG_DList
42 {
43 protected :
44         SG_DList* m_flink;
45         SG_DList* m_blink;
46
47 public:
48         template<typename T> class iterator
49         {
50         private:
51                 SG_DList&       m_head;
52                 T*                      m_current;
53         public:
54                 typedef iterator<T> _myT;
55                 iterator(SG_DList& head) : m_head(head), m_current(NULL) {}
56                 ~iterator() {}
57
58                 void begin()
59                 {
60                         m_current = (T*)m_head.Peek();
61                 }
62                 void back()
63                 {
64                         m_current = (T*)m_head.Back();
65                 }
66                 bool end()
67                 {
68                         return (m_current == (T*)m_head.Self());
69                 }
70                 bool add_back(T* item)
71                 {
72                         return m_current->AddBack(item);
73                 }
74                 T* operator*()
75                 {
76                         return m_current;
77                 }
78                 _myT& operator++()
79                 {
80                         // no check of NULL! make sure you don't try to increment beyond end
81                         m_current = (T*)m_current->Peek();
82                         return *this;
83                 }
84                 _myT& operator--()
85                 {
86                         // no check of NULL! make sure you don't try to increment beyond end
87                         m_current = (T*)m_current->Back();
88                         return *this;
89                 }
90         };
91
92     SG_DList() 
93     { 
94         m_flink = m_blink = this; 
95     }
96         SG_DList(const SG_DList& other)
97         {
98         m_flink = m_blink = this; 
99         }
100     virtual ~SG_DList() 
101     {
102                 Delink();
103     }
104
105     inline bool Empty()               // Check for empty queue
106     {     
107         return ( m_flink == this ); 
108     }
109     bool AddBack( SG_DList *item )  // Add to the back
110     {
111                 if (!item->Empty())
112                         return false;
113         item->m_blink = m_blink;
114         item->m_flink = this;
115         m_blink->m_flink = item;
116         m_blink = item;
117                 return true;
118     }
119     bool AddFront( SG_DList *item )  // Add to the back
120     {
121                 if (!item->Empty())
122                         return false;
123         item->m_flink = m_flink;
124         item->m_blink = this;
125         m_flink->m_blink = item;
126         m_flink = item;
127                 return true;
128     }
129     SG_DList *Remove()           // Remove from the front
130     {
131         if (Empty()) 
132         {
133             return NULL;
134         }
135         SG_DList* item = m_flink;
136         m_flink = item->m_flink;
137         m_flink->m_blink = this;
138         item->m_flink = item->m_blink = item;
139         return item;
140     }
141     bool Delink()             // Remove from the middle
142     {
143                 if (Empty())
144                         return false;
145                 m_blink->m_flink = m_flink;
146                 m_flink->m_blink = m_blink;
147                 m_flink = m_blink = this;
148                 return true;
149     }
150     inline SG_DList *Peek()                     // Look at front without removing
151     { 
152         return m_flink; 
153     }  
154     inline SG_DList *Back()                     // Look at front without removing
155     { 
156         return m_blink; 
157     }  
158     inline SG_DList *Self() 
159     { 
160         return this; 
161     }
162         
163         
164 #ifdef WITH_CXX_GUARDEDALLOC
165 public:
166         void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_DList"); }
167         void operator delete( void *mem ) { MEM_freeN(mem); }
168 #endif
169 };
170
171 #endif //__SG_DLIST
172