My Project
ICollection.h
1 #pragma once
2 #include <map>
3 #include <vector>
4 #ifndef SAFE_RELEASE
5 #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
6 #endif
7 namespace ParaEngine
8 {
9  using namespace std;
10  template<class T>
12  {
13  public:
14  virtual T* GetAt(int index)=0;
15  virtual const T* GetAt(int index)const =0;
16  virtual int CopyInsert(T* obj, int index)=0;
17  virtual int Insert(T* obj, int index)=0;
18  virtual void Clear()=0;
19  virtual int Remove(int index)=0;
20  virtual int Remove()=0;
21  virtual void CopyAdd(const T *obj)=0;
22  virtual void Add(T *obj)=0;
23  virtual int CopySetAt(const T *obj, int index)=0;
24  virtual int SetAt(T* obj, int index)=0;
25  virtual int IndexOf(const T *obj)const=0;
26  virtual int Size()const=0;
27  virtual int Resize(int newsize)=0;
28  };
34  template<class T>
35  class Collection_Vector :public ICollection<T>
36  {
37  public:
38  typedef vector<T *> ConnectionVector_type;
40  {
41  Clear();
42  }
43  T* GetAt(int index)
44  {
45  if ((DWORD)index>=m_items.size()) {
46  return NULL;
47  }
48  return m_items[index];
49  }
50  const T* GetAt(int index)const
51  {
52  if ((DWORD)index>=m_items.size()) {
53  return NULL;
54  }
55  return m_items[index];
56  }
57  int CopyInsert(T* obj, int index)
58  {
59  if ((DWORD)index<=m_items.size()) {
60  if (obj==NULL) {
61  m_items.insert(m_items.begin()+index,obj);
62  }else
63  m_items.insert(m_items.begin()+index,(T*)obj->Clone());
64  return index;
65  }else
66  return -1;
67  }
68  int Insert(T* obj, int index)
69  {
70  if ((DWORD)index<=m_items.size()) {
71  if (obj) obj->addref();
72  m_items.insert(m_items.begin()+index,obj);
73  return index;
74  }else
75  return -1;
76 
77  }
78  void Clear()
79  {
80  typename ConnectionVector_type::iterator iter,iterend=m_items.end();
81  for (iter=m_items.begin();iter!=iterend;iter++) {
82  SAFE_RELEASE(*iter);
83  }
84  m_items.clear();
85  }
86  int Remove(int index)
87  {
88  if ((DWORD)index<m_items.size()) {
89  SAFE_RELEASE(m_items[index]);
90  m_items.erase(m_items.begin()+index);
91  return (int)m_items.size();
92  }
93  return -1;
94  }
95  int Remove()
96  {
97  if (m_items.size()>0){
98  SAFE_RELEASE(m_items.back());
99  m_items.pop_back();
100  return (int)m_items.size();
101  }
102  return -1;
103  }
104  void CopyAdd(const T* obj)
105  {
106  if (obj) {
107  m_items.push_back((T*)obj->Clone());
108  }else{
109  T* pnull=NULL;
110  m_items.push_back(pnull);
111  }
112  }
113  void Add(T *obj)
114  {
115  if(obj) obj->addref();
116  m_items.push_back(obj);
117  }
118  //copy an object to a place in the array
119  int CopySetAt(const T *obj, int index)
120  {
121  if ((DWORD)index<m_items.size()) {
122  SAFE_RELEASE(m_items[index]);
123  if (obj) {
124  m_items[index]=(T*)obj->Clone();
125  }else{
126  T* pnull=NULL;
127  m_items[index]=pnull;
128  }
129  return index;
130  }else
131  return -1;
132 
133  }
134  //only add a reference of an object to a place inthe array
135  //This will increase the reference count
136  int SetAt(T* obj, int index)
137  {
138  if ((DWORD)index<m_items.size()) {
139  SAFE_RELEASE(m_items[index]);
140  if (obj) obj->addref();
141  m_items[index]=obj;
142  return index;
143  }else
144  return -1;
145 
146  }
147  int IndexOf(const T *obj)const
148  {
149  typename ConnectionVector_type::const_iterator iter, iterend = m_items.end();
150  int a=0;
151  for (a=0,iter=m_items.begin();iter!=iterend;iter++,a++) {
152  if ((*iter)->Equals(obj)) {
153  return a;
154  };
155  }
156  return -1;
157  }
158  int Size()const{return (int)m_items.size();}
159  int Resize(int newsize)
160  {
161  if (newsize<0) {
162  return -1;
163  }
164  int oldsize=(int)m_items.size();
165  if (newsize<oldsize) {
166  for (int a=newsize;a<oldsize;a++) {
167  SAFE_RELEASE(m_items[a]);
168  }
169 
170  }
171  m_items.resize(newsize);
172  if (newsize>oldsize) {
173  for (int a=oldsize;a<newsize;a++) {
174  m_items[a]=NULL;
175  }
176  }
177  return newsize;
178  }
179  protected:
180  ConnectionVector_type m_items;
181  };
182 
188  template<class T>
189  class Collection_Map:public ICollection<T>
190  {
191  public:
192  typedef map<int, T *> CollectionMap_type;
193  Collection_Map():m_nSize(0){}
194  ~Collection_Map()
195  {
196  Clear();
197  }
198  T* GetAt(int index)
199  {
200  typename CollectionMap_type::iterator iter;
201  if ((iter=m_items.find(index))==m_items.end()) {
202  return NULL;
203  }
204  return iter->second;
205  }
206  const T* GetAt(int index)const
207  {
208  typename CollectionMap_type::const_iterator iter;
209  if ((iter=m_items.find(index))==m_items.end()) {
210  return NULL;
211  }
212  return iter->second;
213  }
214  int CopyInsert(T* obj, int index)
215  {
216  if (index>m_nSize){
217  return -1;
218  }
219  typename CollectionMap_type::iterator iter1, iter2;
220  T* pobj=NULL;
221  if (obj!=NULL) {
222  pobj=(T*)obj->Clone();
223  }
224  T* temp;
225  //delete the item if it is NULL
226  for (int a=index;a<=m_nSize;a++){
227  if ((iter1=m_items.find(a))!=m_items.end()){
228  temp=iter1->second;
229  }else
230  temp=NULL;
231  if (pobj==NULL){
232  m_items.erase(a);
233  }else{
234  m_items[a]=pobj;
235  }
236  pobj=temp;
237  }
238  m_nSize++;
239  return index;
240  }
241  int Insert(T* obj, int index)
242  {
243  if (index>m_nSize){
244  return -1;
245  }
246  if (obj) obj->addref();
247  typename CollectionMap_type::iterator iter;
248  T* pobj=obj;
249  T* temp;
250  //delete the item if it is NULL
251  for (int a=index;a<=m_nSize;a++){
252  if ((iter=m_items.find(a))!=m_items.end()){
253  temp=iter->second;
254  }else
255  temp=NULL;
256  if (pobj==NULL){
257  m_items.erase(a);
258  }else{
259  m_items[a]=pobj;
260  }
261  pobj=temp;
262  }
263  m_nSize++;
264  return index;
265  }
266  void Clear()
267  {
268  typename CollectionMap_type::iterator iter, iterend = m_items.end();
269  for (iter=m_items.begin();iter!=iterend;iter++) {
270  SAFE_RELEASE(iter->second);
271  }
272  m_items.clear();
273  }
274  int Remove(int index)
275  {
276  if (m_items.find(index)!=m_items.end()) {
277  SAFE_RELEASE(m_items[index]);
278  m_items.erase(index);
279  typename CollectionMap_type::iterator iter;
280  //delete the item if it is NULL
281  for (int a=index;a<m_nSize;a++){
282  if ((iter=m_items.find(a+1))!=m_items.end()){
283  m_items[a]=m_items[a+1];
284  }else
285  m_items.erase(a);
286  }
287  m_nSize--;
288  return m_nSize;
289  }
290  return -1;
291  }
292  int Remove()
293  {
294  if (m_items.find(m_nSize-1)!=m_items.end()){
295  SAFE_RELEASE(m_items[--m_nSize]);
296  m_items.erase(m_nSize);
297  return m_nSize;
298  }
299  return -1;
300  }
301  void CopyAdd(const T* obj)
302  {
303  if (obj) {
304  m_items[m_nSize]=((T*)obj->Clone());
305  }
306  m_nSize++;
307  }
308  void Add(T *obj)
309  {
310  if(obj){
311  obj->addref();
312  m_items[m_nSize]=obj;
313 
314  }
315  m_nSize++;
316  }
317  //copy an object to a place in the array
318  int CopySetAt(const T *obj, int index)
319  {
320  typename CollectionMap_type::iterator iter;
321  if ((DWORD)index<(DWORD)m_nSize) {
322  if ((iter=m_items.find(index))!=m_items.end()){
323  SAFE_RELEASE(iter->second);
324  }
325  if (obj) {
326  m_items[index]=(T*)obj->Clone();
327  }
328  return index;
329  }else
330  return -1;
331 
332  }
333  //only add a reference of an object to a place inthe array
334  //This will increase the reference count
335  int SetAt(T* obj, int index)
336  {
337  if ((DWORD)index<(DWORD)m_nSize) {
338  if (m_items.find(index)!=m_items.end()){
339  SAFE_RELEASE(m_items[index]);
340  }
341  if (obj){
342  obj->addref();
343  m_items[index]=obj;
344  }
345  return index;
346  }else
347  return -1;
348 
349  }
350  int IndexOf(const T *obj)const
351  {
352  typename CollectionMap_type::const_iterator iter, iterend = m_items.end();
353  int a=0;
354  for (a=0,iter=m_items.begin();iter!=iterend;iter++,a++) {
355  if ((iter->second)->Equals(obj)) {
356  return a;
357  };
358  }
359  return -1;
360  }
361  int Size()const{return m_nSize;}
362  int Resize(int newsize)
363  {
364  if (newsize<0) {
365  return -1;
366  }
367  if (newsize<m_nSize) {
368  typename CollectionMap_type::iterator iter;
369  for (int a=newsize;a<m_nSize;a++) {
370  if ((iter=m_items.find(a))!=m_items.end()){
371  SAFE_RELEASE(iter->second);
372  }
373  }
374 
375  }
376  m_nSize=newsize;
377  return newsize;
378  }
379  protected:
380  CollectionMap_type m_items;
381  int m_nSize;
382  };
383 
384 }
Definition: GLType.h:217
Definition: ICollection.h:11
different physics engine has different winding order.
Definition: EventBinding.h:32
Default behavior of the collection adds only reference.
Definition: ICollection.h:189
Default behavior of the collection adds only reference.
Definition: ICollection.h:35