31 #define KF_VECTOR_MININDEX INT_MIN 32 #define KF_VECTOR_MAXINDEX INT_MAX 39 KF_Vector(TYPE p_noelement, TYPE * newdata,
int newmemsize,
int newindexoffset,
40 int newminimum,
int newmaximum,
int newcount);
53 void Set(
int index, TYPE mydata);
56 virtual void Delete(
int index);
58 TYPE
Get(
int index)
const;
99 data = (TYPE *) malloc( memsize *
sizeof(TYPE));
102 noelement = p_noelement;
105 for (i=0;i<memsize;i++)
113 template <
class TYPE>
115 int newindexoffset,
int newminimum,
int newmaximum,
int newcount)
117 noelement = p_noelement;
119 memsize = newmemsize;
121 indexoffset = newindexoffset;
122 minimum = newminimum;
123 maximum = newmaximum;
127 template <
class TYPE>
130 int mymemindex = index - indexoffset;
132 if (mymemindex < 0 || mymemindex >= memsize)
137 mymemindex = index - indexoffset;
138 if (mymemindex >= 0 && mymemindex < memsize)
140 if (data[mymemindex] == noelement && mydata != noelement)
142 if (data[mymemindex] != noelement && mydata == noelement)
145 data[mymemindex] = mydata;
152 if (data[mymemindex] == noelement && mydata != noelement)
154 if (data[mymemindex] != noelement && mydata == noelement)
157 data[mymemindex] = mydata;
161 if (mydata != noelement)
165 minimum = maximum = index;
187 for (i=minimum;i<=maximum;++i)
189 if (data[i-indexoffset] != noelement)
195 for (i=maximum;i>=minimum;--i)
197 if (data[i-indexoffset] != noelement)
206 assert(maximum - minimum <= memsize);
211 template <
class TYPE>
219 if (index > maximum )
225 int mymemindex = index - indexoffset;
227 assert(mymemindex < memsize);
229 if (data[mymemindex] != noelement)
231 data[mymemindex] = noelement;
243 if (index == minimum)
245 else if (index == maximum)
250 if (index == minimum)
253 int newminimum = maximum;
255 for (i=minimum+1;i<=maximum;i++)
257 if (data[i - indexoffset] != noelement)
263 minimum = newminimum;
265 else if (index == maximum)
268 int newmaximum = minimum;
270 for (i=maximum-1;i>=minimum;i--)
272 if (data[i-indexoffset] != noelement)
278 maximum = newmaximum;
282 if (maximum < minimum)
293 template <
class TYPE>
296 if (index < minimum)
return noelement;
297 if (index > maximum )
return noelement;
299 const int mymemindex = index - indexoffset;
301 assert(mymemindex < memsize);
303 return data[mymemindex];
306 template <
class TYPE>
311 return KF_VECTOR_MININDEX;
312 if (index > maximum )
313 return KF_VECTOR_MININDEX;
315 int mymemindex = index - indexoffset;
316 assert(mymemindex < memsize);
320 for (tmpindex=mymemindex+1;tmpindex<= maximum-indexoffset;tmpindex++)
322 if (data[tmpindex] != noelement)
323 return tmpindex + indexoffset;
326 return KF_VECTOR_MININDEX;
330 template <
class TYPE>
338 for (i=0;i<memsize;i++)
340 if (data[i] != noelement)
341 Delete(i+indexoffset);
347 data = (TYPE *) malloc(memsize *
sizeof(TYPE));
348 for (i=0;i<memsize;i++)
365 template <
class TYPE>
374 int mymemindex = index - indexoffset;
376 int newmin = INT_MAX;
377 int newmax = INT_MIN;
379 int newsize = maximum - index;
384 int newindexoffset = 10;
386 TYPE * newdata = (TYPE *) malloc((newsize + 2 * newindexoffset ) *
sizeof( TYPE ) );
390 for (i=0;i<newindexoffset;i++)
392 newdata[i] = noelement;
394 for (i=newindexoffset;i<newsize+newindexoffset;i++)
396 newdata[i] = data[mymemindex + 1 + i - newindexoffset] ;
397 if (newdata[i] != noelement)
399 int tmpindex = mymemindex + indexoffset + i - newindexoffset;
400 if (tmpindex < newmin)
402 if (tmpindex > newmax)
405 data[mymemindex + 1 + i - newindexoffset] = noelement;
408 for (i=newsize+newindexoffset;i<newsize+2*newindexoffset;i++)
410 newdata[i] = noelement;
417 assert(newcount == 0);
420 *pnew =
new KF_Vector<TYPE>(noelement,newdata,newsize+2*newindexoffset,
421 index + 1 - newindexoffset,newmin, newmax, newcount);
425 count = count - newcount;
433 int newmaximum = index;
434 while (newmaximum >= minimum &&
435 data[newmaximum - indexoffset] == noelement)
438 maximum = newmaximum;
452 template <
class TYPE>
455 int newmemsize = memsize;
457 int mymemindex = index - indexoffset;
464 if (newmemsize <= 10)
469 else if (newmemsize <=20)
474 else if (newmemsize <=100)
479 else if (newmemsize <= 500)
486 newmemsize = newmemsize + 560;
490 while( mymemindex < memsize - (newmemsize - (offset*2)) );
492 int indexofnew = -index + offset;
494 data = (TYPE *) realloc(data,(newmemsize *
sizeof(TYPE)) + indexofnew);
499 memmove(&(data[indexofnew]),data,memsize *
sizeof(TYPE));
502 for (cnt=0;cnt<indexofnew;++cnt)
503 data[cnt] = noelement;
505 for (cnt=indexofnew + memsize;cnt<newmemsize;cnt++)
506 data[cnt] = noelement;
508 indexoffset = indexoffset + index - offset;
509 memsize = newmemsize;
511 else if (mymemindex >= newmemsize ) {
513 if (newmemsize <= 10) {
517 else if (newmemsize <=20) {
521 else if (newmemsize <=100) {
525 else if (newmemsize <= 500) {
530 newmemsize = newmemsize + 560;
533 }
while( mymemindex >= newmemsize - (offset * 2) );
536 data = (TYPE *) realloc(data,(newmemsize *
sizeof(TYPE)) + offset);
540 memmove(&(data[offset]), data, memsize *
sizeof(TYPE));
543 for (cnt=0;cnt<offset;++cnt)
544 data[cnt] = noelement;
545 for (cnt=offset + memsize;cnt<newmemsize;cnt++)
546 data[cnt] = noelement;
548 indexoffset = indexoffset - offset;
549 memsize = newmemsize;