00001 #ifndef __FIXARRAY_H__
00002 #define __FIXARRAY_H__
00003
00015
00016
00034 template <class type, unsigned int maxElements>
00035 class fixArray
00036 {
00037 public:
00038
00040
00043 type errElement;
00044
00045 type element[maxElements];
00046
00047 BM_STATUS bms[maxElements];
00048
00049 public:
00050
00052
00069 fixArray()
00070 {
00071 for (unsigned int idx = 0; idx < maxElements; idx++)
00072 {
00073 bms[idx].status = 0;
00074 bms[idx].undef = 1;
00075 }
00076 };
00077
00079
00081 virtual ~fixArray()
00082 {
00083 for (unsigned int idx = 0; idx < maxElements; idx++)
00084 {
00085 bms[idx].undef = 1;
00086 }
00087 };
00088
00090
00092 unsigned int size()
00093 {
00094 return maxElements;
00095 };
00096
00098
00105 unsigned int count()
00106 {
00107 unsigned int count = 0;
00108 for (unsigned int idx = 0; idx < maxElements, idx++)
00109 {
00110 if ( ! bms[idx].undef )
00111 {
00112 ++count;
00113 }
00114 }
00115 return count;
00116 };
00117
00119
00134 type& getAt( const unsigned int index, BM_STATUS* elementStatus=(BM_STATUS*)0 )
00135 {
00136 if (index >= maxElements)
00137 {
00138 if(elementStatus != (BM_STATUS*)0 )
00139 {
00140 elementStatus->undef = 1;
00141 }
00142 return errElement;
00143 }
00144 if(elementStatus != (BM_STATUS*)0 )
00145 {
00146 elementStatus->status = bms[index].status;
00147 }
00148 return element[index];
00149 };
00150
00152
00169 int setAt( const unsigned int index, const type& elem, BM_STATUS elementStatus=0 )
00170 {
00171 if (index >= maxElements)
00172 {
00173 return -1;
00174 }
00175 bms[index].status = elementStatus.status;
00176 element[index] = elem;
00177 return 0;
00178 };
00179
00181
00191 type& operator [] ( const unsigned int index )
00192 {
00193 return getAt( index );
00194 };
00195
00197
00211 int find( type& elem, BM_STATUS* elementStatus=(BM_STATUS*)0 )
00212 {
00213 if (maxElements < 1)
00214 {
00215 if ( elementStatus != (BM_STATUS*)0 )
00216 {
00217 elementStatus->undef = 1;
00218 }
00219 return -1;
00220 }
00221 int index = Find( element, maxElements, elem );
00222 if ( elementStatus != (BM_STATUS*)0 )
00223 {
00224 if ((0 <= index) && (index < maxElements))
00225 {
00226 elementStatus->status = bms[index].status;
00227 }
00228 else
00229 {
00230 elementStatus->undef = 1;
00231 }
00232 }
00233 return index;
00234 };
00235
00237
00246 bool isEmpty( unsigned int* index=(unsigned int*)0 )
00247 {
00248 if (maxElements < 1)
00249 {
00250 if ( index != (unsigned int*)0 )
00251 {
00252 index = (unsigned int*)-1;
00253 }
00254 return true;
00255 }
00256 for (unsigned int idx = 0; idx < maxElements, idx++)
00257 {
00258 if ( ! bms[idx].undef )
00259 {
00260 if ( index != (unsigned int*)0 )
00261 {
00262 *index = idx;
00263 }
00264 return true;
00265 }
00266 }
00267 return false;
00268 };
00269
00271
00283 type& first( unsigned int& iterateIndex, BM_STATUS* elementStatus=(BM_STATUS*)0 )
00284 {
00285 if (maxElements < 1)
00286 {
00287 iterateIndex = (unsigned int)-1;
00288 if ( elementStatus != (BM_STATUS*)0 )
00289 {
00290 elementStatus->undef = 1;
00291 }
00292 return errElement;
00293 }
00294 iterateIndex = 0;
00295 if ( elementStatus != (BM_STATUS*)0 )
00296 {
00297 elementStatus->status = bms[iterateIndex].status;
00298 }
00299 return element[iterateIndex];
00300 };
00301
00303
00322 type& next( unsigned int& iterateIndex, BM_STATUS* elementStatus=(BM_STATUS*)0 )
00323 {
00324 if (maxElements < 1)
00325 {
00326 iterateIndex = (unsigned int)-1;
00327 if ( elementStatus != (BM_STATUS*)0 )
00328 {
00329 elementStatus->undef = 1;
00330 }
00331 return errElement;
00332 }
00333 int nextIdx = (iterateIndex + 1) % maxElements;
00334 if (nextIdx <= iterateIndex)
00335 {
00336 iterateIndex = nextIdx + maxElements;
00337 }
00338 if ( elementStatus != (BM_STATUS*)0 )
00339 {
00340 elementStatus->status = bms[nextIdx].status;
00341 }
00342 return element[nextIdx];
00343 };
00344
00346
00364 type& prev( unsigned int& iterateIndex, BM_STATUS* elementStatus=(BM_STATUS*)0 )
00365 {
00366 if (maxElements < 1)
00367 {
00368 iterateIndex = (unsigned int)-1;
00369 if ( elementStatus != (BM_STATUS*)0 )
00370 {
00371 elementStatus->undef = 1;
00372 }
00373 return errElement;
00374 }
00375 int prevIdx = (iterateIndex + maxElements - 1) % maxElements;
00376 if (prevIdx >= iterateIndex)
00377 {
00378 iterateIndex = prevIdx + maxElements;
00379 }
00380 if ( elementStatus != (BM_STATUS*)0 )
00381 {
00382 elementStatus->status = bms[prevIdx].status;
00383 }
00384 return element[prevIdx];
00385 };
00386
00388
00400 type& last( unsigned int& iterateIndex, BM_STATUS* elementStatus=(BM_STATUS*)0 )
00401 {
00402 if (maxElements < 1)
00403 {
00404 iterateIndex = (unsigned int)-1;
00405 if ( elementStatus != (BM_STATUS*)0 )
00406 {
00407 elementStatus->undef = 1;
00408 }
00409 return errElement;
00410 }
00411 iterateIndex = maxElements-1;
00412 if ( elementStatus != (BM_STATUS*)0 )
00413 {
00414 elementStatus->status = bms[iterateIndex].status;
00415 }
00416 return element[iterateIndex];
00417 };
00418
00420
00433 int isSubset( const fixArray& superSet )
00434 {
00435 if (maxElements < 1)
00436 {
00437 return INT_MAX;
00438 }
00439 for ( unsigned int idx=0; idx < maxElements; idx++ )
00440 {
00441 if ( ! bms[idx].undef )
00442 {
00443 if ( superSet.find( element[idx] ) == false )
00444 {
00445 return idx+1;
00446 }
00447 }
00448 }
00449 return 0;
00450 };
00451
00453
00472 int isEqual( const fixArray& set )
00473 {
00474 if (maxElements < 1)
00475 {
00476 return INT_MAX;
00477 }
00478 int notFoundIndex = isSubset( set );
00479 if ( notFoundIndex != 0 )
00480 {
00481 return notFoundIndex;
00482 }
00483 notFoundIndex = set.isSubset( *this );
00484 if (notFoundIndex == INT_MAX)
00485 {
00486 return INT_MIN;
00487 }
00488 notFoundIndex *= -1;
00489 return notFoundIndex;
00490 };
00491
00493
00500 int assignSortAscendant()
00501 {
00502 if (maxElements < 1)
00503 {
00504 return -1;
00505 }
00506 type tmp;
00507 unsigned long idx = 0;
00508 int ready = 1;
00509 do
00510 {
00511 ready = 1;
00512 for (idx=0; idx < (maxElements-1); idx++)
00513 {
00514 if ( bms[idx].undef )
00515 {
00516 if ( ! bms[idx+1].undef )
00517 {
00518 tmp = element[idx];
00519 element[idx] = element[idx+1];
00520 element[idx+1] = tmp;
00521 ready = 0;
00522 }
00523
00524 }
00525 else if ( bms[idx+1].undef )
00526 {
00527
00528 }
00529 else if ( Compare( element[idx], element[idx+1] ) == 1 )
00530 {
00531
00532
00533 tmp = element[idx];
00534 element[idx] = element[idx+1];
00535 element[idx+1] = tmp;
00536 ready = 0;
00537 }
00538 }
00539 }while (ready == 0);
00540 return 0;
00541 };
00542
00544
00553 fixArray& assignOverlap( const fixArray& set2 )
00554 {
00555 for ( unsigned int idx=0; idx < maxElements; idx++)
00556 {
00557 if ( ! bms[idx].undef )
00558 {
00559 set2Idx = set2.find( element[idx] );
00560 if ( set2Idx < 0 )
00561 {
00562 bms[idx].undef = 1;
00563 }
00564 }
00565 }
00566 return *this;
00567 };
00568
00570
00584 int overlap( fixArray& result, const fixArray& set2 ) const
00585 {
00586 int resCnt = 0;
00587 int set2Idx = -1;
00588 for ( unsigned int idx=0; idx < maxElements; idx++)
00589 {
00590 if ( ! bms[idx].undef )
00591 {
00592 set2Idx = set2.find( element[idx] );
00593 if ( set2Idx >= 0 )
00594 {
00595 if ( result.setAt( resCnt, element[idx] ) < 0 )
00596 {
00597 return -1;
00598 }
00599 ++resCnt;
00600 }
00601 }
00602 }
00603 for ( idx = resCnt ; idx < result.size(); idx++ )
00604 {
00605 result.bms[idx].undef = 1;
00606 }
00607 return resCnt;
00608 };
00609
00611
00622 int assignConcatenate( const fixArray& set2 )
00623 {
00624 int resCnt = 0;
00625 unsigned int idx=0;
00626 unsigned int set2Idx = 0;
00627 for ( idx=0; (idx < maxElements) && (set2Idx < set2.size()); idx++)
00628 {
00629 if ( bms[idx].undef )
00630 {
00631 if ( ! set2.bms[set2Idx].undef )
00632 {
00633 setAt( idx, set2.element[set2Idx] );
00634 ++resCnt;
00635 }
00636 ++set2Idx;
00637 }
00638 }
00639 for ( ; set2Idx < set2.size(); set2Idx++ )
00640 {
00641 if ( ! set2.bms[set2Idx].undef )
00642 {
00643
00644 return -1;
00645 }
00646 }
00647 return resCnt;
00648 };
00649
00651
00666 int concatenate( fixArray& result, const fixArray& set2 ) const
00667 {
00668 int resCnt = 0;
00669 unsigned int idx=0;
00670 for ( idx=0; idx < maxElements; idx++)
00671 {
00672 if ( ! bms[idx].undef )
00673 {
00674 if ( result.setAt( resCnt, element[idx] ) < 0 )
00675 {
00676 return -1;
00677 }
00678 ++resCnt;
00679 }
00680 }
00681 for ( idx=0; idx < set2.size(); idx++)
00682 {
00683 if ( ! set2.bms[idx].undef )
00684 {
00685 if ( result.setAt( resCnt, set2.element[idx] ) < 0 )
00686 {
00687 return -1;
00688 }
00689 ++resCnt;
00690 }
00691 }
00692 return resCnt;
00693 };
00694
00695
00697
00710 int notInSet( fixArray& result, const fixArray& set2 ) const
00711 {
00712 int resCnt = 0;
00713 unsigned int idx=0;
00714 for ( idx=0; idx < maxElements; idx++)
00715 {
00716 if ( ! bms[idx].undef )
00717 {
00718 if ( set2.find( element[idx] ) < 0 )
00719 {
00720 if ( result.setAt( resCnt, element[idx] ) < 0 )
00721 {
00722 return -1;
00723 }
00724 ++resCnt;
00725 }
00726 }
00727 }
00728 for ( idx = resCnt ; idx < result.size(); idx++ )
00729 {
00730 result.bms[idx].undef = 1;
00731 }
00732 return resCnt;
00733 };
00734
00735 };
00736
00737 #endif //__FIXARRAY_H__