libmoldeo (Moldeo 1.0 Core)  1.0
libmoldeo is the group of objects and functions that executes the basic operations of Moldeo 1.0 Platform.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
moArray.h
Go to the documentation of this file.
1 /*******************************************************************************
2 
3  moArray.h
4 
5  ****************************************************************************
6  * *
7  * This source is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This code is distributed in the hope that it will be useful, but *
13  * WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
15  * General Public License for more details. *
16  * *
17  * A copy of the GNU General Public License is available on the World *
18  * Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
19  * obtain it by writing to the Free Software Foundation, *
20  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21  * *
22  ****************************************************************************
23 
24  Copyright(C) 2006 Fabricio Costa
25 
26  Authors:
27  Fabricio Costa
28 
29 *******************************************************************************/
30 
31 // *****************************************************************************
32 // * Purpose: implements methods of "template" class declared in *
33 // * DECLARE_OBJARRAY macro and which couldn't be implemented inline *
34 // * (because they need the full definition of type T in scope) *
35 // * *
36 // * Usage: 1) #include dynarray.h *
37 // * 2) WX_DECLARE_OBJARRAY *
38 // * 3) #include arrimpl.cpp *
39 // * 4) WX_DEFINE_OBJARRAY *
40 // *****************************************************************************
41 
42 #ifndef __MO_ARRAY_H__
43 
44 #include "moArrayH.h"
45 #include <stdarg.h>
46 
47 // macro implements remaining (not inline) methods of template list
48 // (it's private to this file)
49 #undef _moDefineDynamicArray
50 #define _moDefineDynamicArray(T, name) \
51 \
52 name::name() {\
53  array = NULL;\
54  n = 0;\
55 }\
56 \
57 name::name(int N) {\
58  \
59  if (N>0) {\
60  array = new T [N];\
61  n = N;\
62  } else {\
63  n=0;\
64  array = NULL;\
65  }\
66  \
67 }\
68 \
69 name::name(const name& src) {\
70  \
71  Copy( src);\
72  \
73 }\
74 \
75 name& name::operator=(const name& src) {\
76 \
77  \
78  Copy( src);\
79  return (*this);\
80 }\
81 \
82 name::~name() {\
83  if ( array != NULL ) {\
84  delete[] array;\
85  array = NULL;\
86  n = 0;\
87  }\
88 }\
89 \
90 \
91 MOboolean name::Init( int N, T initvalue ) {\
92  m_NULL = initvalue;\
93 \
94  if (n>0) Empty();\
95 \
96  if (N>0) {\
97  array = new T [N];\
98  n = N;\
99  for( MOuint i=0; i<n; i++) array[i] = initvalue;\
100  } else {\
101  n=0;\
102  array = NULL;\
103  }\
104  return (array!=NULL);\
105 }\
106 \
107 MOboolean name::Finish() {\
108  Empty();\
109  return true;\
110 }\
111 \
112 void name::Empty() {\
113 \
114  n = 0;\
115  if (array!=NULL) {\
116  delete[] array;\
117  array = NULL;\
118  }\
119 \
120 }\
121 \
122 void name::Set(int x, const T &value) {\
123 \
124  if ( 0<=x && x<(MOint)n && array!=NULL) array[x]=value;\
125 \
126 }\
127 \
128 void name::Insert(int x, const T &value) {\
129 \
130  if ( 0<=x && x<(MOint)n && array!=NULL) {\
131 \
132  MOuint i,j;\
133  T* arrayaux;\
134 \
135  arrayaux = new T [n+1];\
136 \
137  for( i=0,j=0 ; i < (n+1) ; i++,j++ ) { \
138  ((int)i==x) ? arrayaux[j--] = value : arrayaux[i] = array[j];\
139  }\
140  arrayaux[n] = value;\
141  n++;\
142 \
143  if (array!=NULL) delete[] array;\
144  array = arrayaux;\
145  }\
146 \
147 }\
148 \
149 const T& name::Get(int x) const {\
150 \
151  if ( 0<=x && x<(MOint)n && array!=NULL) {\
152 \
153  return array[x];\
154 \
155  } else return m_NULL;\
156 }\
157 \
158 T& name::GetRef(int x) {\
159 \
160  if ( 0<=x && x<(MOint)n && array!=NULL) {\
161 \
162  return array[x];\
163 \
164  } else return m_NULL;\
165 }\
166 \
167 T& name::Item(int x) {\
168 \
169  if ( 0<=x && x<(MOint)n && array!=NULL) {\
170 \
171  return array[x];\
172 \
173  } else return m_NULL;\
174 }\
175 \
176 T& name::operator [] (int x) {\
177  if ( 0<=x && x<(MOint)n && array!=NULL) {\
178 \
179  return array[x];\
180 \
181  } else return m_NULL;\
182 }\
183 \
184 MOuint name::Count() const {\
185  return n;\
186 }\
187 \
188 void name::Add( const T& value ) {\
189 \
190  MOuint i;\
191  T* arrayaux;\
192 \
193  arrayaux = new T [n+1];\
194 \
195  if (array!=NULL)\
196  for( i=0 ; i < n ; i++ ) { \
197  arrayaux[i] = array[i];\
198  }\
199  arrayaux[n] = value;\
200  n++;\
201 \
202  if (array!=NULL) delete[] array;\
203  array = arrayaux;\
204 }\
205 \
206 void name::Remove(int x) {\
207 \
208  MOuint i,j;\
209  T* arrayaux;\
210 \
211  if ( (MOint)0<=x && x<(MOint)n && array!=NULL) {\
212  \
213  if ( n > 1 ) {\
214  arrayaux = new T [n-1];\
215  for( i=0, j=0; j < (n-1); i++, j++) {\
216  if ( x == (MOint)i ) {\
217  i++;\
218  }\
219  arrayaux[j] = array[i];\
220  }\
221  n--;\
222  } else {\
223  arrayaux = NULL;\
224  n = 0;\
225  }\
226 \
227  delete[] array;\
228  array = arrayaux;\
229  }\
230 }\
231 \
232 \
233 void name::Copy( const name &A) {\
234  Empty();\
235  for(MOuint i=0; i< A.n; i++) {\
236  Add( A.array[i] );\
237  }\
238 }\
239 \
240 void name::Copy( const name &A, int x0, int x1) {\
241  Empty();\
242  for(int i=x0; i<= x1; i++) {\
243  Add( A.array[i] );\
244  }\
245 }
246 
247 // redefine the macro so that now it will generate the class implementation
248 // old value would provoke a compile-time error if this file is not included
249 #undef moDefineDynamicArray
250 #define moDefineDynamicArray(name) _moDefineDynamicArray( _moObjArray##name, name)
251 
252 
253 
254 #endif /* __MO_ARRAY_H__ */
255