123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274 |
- /***************************************************************************
- * E-Com Technology Ltd.
- *
- * ECOMPACS DICOM Network Transport Libraries * Version 0.1 Beta
- ***************************************************************************/
- //#pragma once
- //#ifndef __ARRAY__
- //#define __ARRAY__
- #pragma warning (disable : 4800)
- // avoid bool (LastAccess);
- template < class DATATYPE > class ArrayIterator;
- template < class DATATYPE > class ArrayReverseIterator;
- template < class DATATYPE > class ArrayStepIterator;
- template < class DATATYPE > class Array;
- template < class DATATYPE > class ArrayOfPtr;
- template < class DATATYPE > class FixArray;
- template < class DATATYPE > class ExclusiveArray;
- template < class DATATYPE > class ExclusiveArrayOfPtr;
- /*********************************************************************
- *
- * Class Array
- *
- *********************************************************************/
- template < class DATATYPE > class ArrayItem
- {
- public:
- DATATYPE Data;
- ArrayItem < DATATYPE > *prev, *next;
-
- ArrayItem (ArrayItem < DATATYPE > *p, ArrayItem < DATATYPE > *n)
- {
- prev = p;
- next = n;
- };
- ArrayItem ()
- {
- prev = NULL;
- next = NULL;
- };
- };
- template < class DATATYPE > class Array
- {
- public:
- typedef DATATYPE _datatype;
- protected:
- ArrayItem < DATATYPE > *first;
- ArrayItem < DATATYPE > *last;
- BOOL ClearType;
- int ArraySize;
- public:
- Array (const Array & theArray);
- inline Array ()
- {
- ArraySize = 0;
- first = NULL;
- last = NULL;
- ClearType = 1;
- }
- ~Array () { Reset ();};
- inline void Add (const DATATYPE & Value)
- {
- InsertLast (Value);
- }
- inline void InsertFirst (const DATATYPE & Value)
- {
- ArrayItem < DATATYPE > * dl = first;
- first = new ArrayItem < DATATYPE > ;
- // chain on new element at head of chain
- first -> Data = Value;
- first -> next = dl;
- if (dl) // array is not empty
- dl -> prev = first;
- else // array is empty
- last = first;
- ++ ArraySize;
- }
- inline void InsertFirst (DATATYPE & Value)
- {
- ArrayItem < DATATYPE > * dl = first;
- first = new ArrayItem < DATATYPE > ;
- // chain on new element at head of chain
- first -> Data = Value;
- first -> next = dl;
- if (dl) // array is not empty
- dl -> prev = first;
- else // array is empty
- last = first;
- ++ ArraySize;
- }
- inline void InsertLast (const DATATYPE & Value)
- {
- ArrayItem < DATATYPE > * dl = last;
- last = new ArrayItem < DATATYPE > ;
- // chain on new element at tail of chain
- last -> Data = Value;
- last -> prev = dl;
- if (dl)
- dl -> next = last;
- else
- first = last;
- ++ ArraySize;
- }
- inline void InsertLast (DATATYPE & Value)
- {
- ArrayItem < DATATYPE > * dl = last;
- last = new ArrayItem < DATATYPE > ;
-
- // chain on new element at tail of chain
- last -> Data = Value;
- last -> prev = dl;
- if (dl)
- dl -> next = last;
- else
- first = last;
- ++ ArraySize;
- }
- void AddBefore (const DATATYPE &, int Index);
- void AddAfter (const DATATYPE &, int Index);
- BOOL RemoveAt (int);
- inline void Remove (const DATATYPE & dt)
- {
- for (Array <DATATYPE>::Iterator Iter (*this); Iter; Iter++)
- {
- const DATATYPE & mydt = Iter ();
- if (dt == mydt)
- {
- RemoveAt (Iter);
- return;
- }
- }
- }
- inline BOOL RemoveFirst (void)
- {
- if (! first) return FALSE;
- ArrayItem < DATATYPE > *dl = first;
- first = dl -> next;
- if (first)
- first -> prev = NULL;
- else
- last = NULL;
- delete dl;
- -- ArraySize;
- return TRUE;
- }
- inline BOOL RemoveLast (void)
- {
- if (! last) return FALSE;
- ArrayItem < DATATYPE > *dl = last;
- last = dl -> prev;
- if (last)
- last -> next = NULL;
- else
- first = NULL;
- delete dl;
- -- ArraySize;
- return TRUE;
- }
- inline void RemoveAll (void)
- {
- if (! ArraySize) return;
- if (! ClearType) return;
- while (first)
- {
- ArrayItem < DATATYPE > * pt = first;
- first = first -> next;
- delete pt;
- }
- first = last = NULL;
- ArraySize = 0;
- }
- inline const Array <DATATYPE> & operator += (const DATATYPE & Value)
- {
- InsertLast (Value);
- return (*this);
- }
- inline DATATYPE & GetAt (int Index) const
- {
- ArrayItem < DATATYPE > * dl = PtrOfItemAt (Index);
- if (dl == NULL)
- return ((DATATYPE &) *dl);
- return (dl -> Data);
- }
- inline DATATYPE & GetFirst (void) const { return first -> Data; }
- inline DATATYPE & GetLast (void) const { return last -> Data; }
- inline DATATYPE & GetNextFirst (void) const { return first -> next -> Data; }
- inline DATATYPE & GetPrevLast (void) const { return last -> prev -> Data; }
- BOOL TransferTo (Array <DATATYPE> & array);
- int TransferTo (Array <DATATYPE> & array, DATATYPE & dt);
- int TransferTo (Array <DATATYPE> & array, int fromIndex, int NbOfTransfer);
- int Append (const Array <DATATYPE> & from);
- int CopyTo (FixArray <DATATYPE> & array) const;
- int CopyTo (Array <DATATYPE> & array) const;
- int CopyTo (DATATYPE * pArray, int NbOfElem) const;
- void SetCapacity (int nNewSize);
- inline void Reset (void)
- {
- RemoveAll ();
- }
- inline int GetSize (void) const
- {
- return (ArraySize);
- }
- inline int GetCapacity (void) const
- {
- return ArraySize;
- }
- inline BOOL IsEmpty (void) const
- {
- return (! GetSize ());
- }
- inline DATATYPE & operator[] (int Index) const
- {
- return (GetAt (Index));
- }
- inline void operator = (const Array < DATATYPE > & array)
- {
- RemoveAll ();
- array.CopyTo (*this);
- }
- inline bool IsExist (const DATATYPE & Value) const
- {
- return IndexOf (Value) != -1;
- }
- // find component starting at left, -1 if not found
- inline int IndexOf (const DATATYPE & Value) const
- {
- ArrayIterator < DATATYPE> ArrayIter (*this);
- while (ArrayIter)
- {
- if (ArrayIter () == Value)
- return ArrayIter.GetLastIndex ();
- }
- return -1;
- }
- // find component starting at right
- inline int LastIndexOf (const DATATYPE & Value) const
- {
- ArrayReverseIterator < DATATYPE> ArrayIter (*this);
- while (ArrayIter)
- {
- if (ArrayIter () == Value)
- return ArrayIter.GetLastIndex ();
- }
- return -1;
- }
- DATATYPE * Find (const DATATYPE & Key) const
- {
- for (Iterator Iter (*this); Iter; Iter++)
- {
- DATATYPE & value = Iter ();
- if (value == Key)
- return &value;
- }
- return NULL;
- }
- template <class ODT> DATATYPE * Find (const ODT & Key) const
- {
- for (Iterator Iter (*this); Iter; Iter++)
- {
- DATATYPE & value = Iter ();
- if (value == Key)
- return &value;
- }
- return NULL;
- }
- template <class Compare> DATATYPE * Find (const DATATYPE & Key, Compare cf) const
- {
- for (Iterator Iter (*this); Iter; Iter++)
- {
- DATATYPE & value = Iter ();
- if (cf (value, Key))
- return &value;
- }
- return NULL;
- }
- template <class ODT, class Compare> DATATYPE * Find (const ODT & Key, Compare cf) const
- {
- for (Iterator Iter (*this); Iter; Iter++)
- {
- DATATYPE & value = Iter ();
- if (cf (value, Key))
- return &value;
- }
- return NULL;
- }
- inline BOOL Replace (int nPos, const DATATYPE & Value)
- {
- if (nPos < 0)
- return FALSE;
- if (nPos >= ArraySize)
- return FALSE;
- AddAfter (Value, nPos);
- MoveItemToFirst (nPos);
- RemoveFirst ();
- return TRUE;
- }
- // Reverse
- void Reverse (void)
- {
- if (ArraySize <= 1)
- return;
- ArrayItem < DATATYPE > * pNext = first;
- ArrayItem < DATATYPE > * pPrev = last;
- for (int Index=0; Index<ArraySize/2; Index++)
- {
- ArrayItem < DATATYPE > * dln = pNext->next;
- ArrayItem < DATATYPE > * dlp = pPrev->prev;
- Swap (pNext, pPrev);
- pNext = dln;
- pPrev = dlp;
- }
- }
- // Exchange the position of nFirst and nLast
- inline BOOL Swap (int nFirst, int nLast)
- {
- if (nFirst < 0)
- nFirst = 0;
- if (nFirst >= ArraySize)
- nFirst = ArraySize -1;
- if (nLast < 0)
- nLast = 0;
- if (nLast >= ArraySize)
- nLast = ArraySize -1;
- if (nFirst == nLast)
- return TRUE;
- ArrayItem < DATATYPE > * dlFirst;
- ArrayItem < DATATYPE > * dlLast ;
- if (nFirst < nLast)
- {
- dlFirst = PtrOfItemAt (nFirst); // 2
- dlLast = PtrOfItemAt (nLast); // 5
- }
- else
- {
- dlFirst = PtrOfItemAt (nLast); // 2
- dlLast = PtrOfItemAt (nFirst); // 5
- }
- return Swap (dlFirst, dlLast);
- }
- // 把B放到A之前
- inline BOOL MoveBBeforeA (int nB, int nA)
- {
- if (nA < 0)
- nA = 0;
- if (nA >= ArraySize)
- nA = ArraySize -1;
- if (nB < 0)
- nB = 0;
- if (nB >= ArraySize)
- nB = ArraySize -1;
- if (nB == nA) // 把1移到1之前是无效的
- return TRUE;
- if (nA == nB + 1) // 把1移到2之前是无效的, 1本来就在2之前
- return TRUE;
- if (nB == nA + 1) // 相邻的情况,其实是交换
- return Swap (nA, nB);
- ArrayItem < DATATYPE > * dlB;
- ArrayItem < DATATYPE > * dlA;
- dlA = PtrOfItemAt (nA); // 2
- dlB = PtrOfItemAt (nB); // 5
- return MoveBBeforeA (dlB, dlA);
- }
- // 把B放到A之后
- inline BOOL MoveBAfterA (int nB, int nA)
- {
- if (nA < ArraySize-1)
- return MoveBBeforeA (nB, nA+1);
- return MoveItemToLast (nB);
- }
- // 把指定的项移动到队首
- inline BOOL MoveItemToFirst (int nItem)
- {
- return MoveBBeforeA (nItem, 0);
- }
- // 把指定的项移动到队尾
- inline BOOL MoveItemToLast (int nItem)
- {
- if (ArraySize == 0) // 空队列不移动
- return true;
- if (ArraySize == 1) // 单项队列也不移动
- return true;
- // 队列至少是2项
- if (nItem < 0)
- nItem = 0;
- if (nItem >= ArraySize-1) // 最后一项本来就在队尾了
- // nItem = ArraySize-1;
- return true;
- ArrayItem < DATATYPE > * pItem = PtrOfItemAt (nItem);
- if (pItem == NULL)
- return false;
- if (pItem == first) // so (nItem == 0)
- first = pItem->next;
- else
- pItem->prev->next = pItem->next;
- // 因为nItem不是最后一项,因此pItem->next不可能为NULL
- pItem->next->prev = pItem->prev;
- pItem->next = NULL;
- pItem->prev = last;
- last->next = pItem;
- last = pItem;
- return true;
- }
- // Quick sort
- inline void Sort (void)
- {
- Sort (0, ArraySize - 1);
- }
- // Quick sort, associated with ar
- template <class ODT> void Sort (Array <ODT> & ar)
- {
- return Sort (0, ArraySize - 1, ar);
- }
- template <class ODT> void Sort (FixArray <ODT> & ar)
- {
- return Sort (0, ArraySize - 1, ar);
- }
- // Quick sort, using the given compare function
- template <class Compare> void Sort (Compare cf)
- {
- return Sort (0, ArraySize - 1, cf);
- }
- template <class ODT, class Compare> void Sort (Array <ODT> & ar, Compare cf)
- {
- return Sort (0, ArraySize - 1, ar, cf);
- }
- template <class ODT, class Compare> void Sort (FixArray <ODT> & ar, Compare cf)
- {
- return Sort (0, ArraySize - 1, ar, cf);
- }
- // 带参数的比较
- template <class Compare, typename arg> void Sort (Compare cf, arg a)
- {
- return Sort (0, ArraySize - 1, cf, a);
- }
- template <class ODT, class Compare, typename arg> void Sort (Array <ODT> & ar, Compare cf, arg a)
- {
- return Sort (0, ArraySize - 1, ar, cf, a);
- }
- template <class ODT, class Compare, typename arg> void Sort (FixArray <ODT> & ar, Compare cf, arg a)
- {
- return Sort (0, ArraySize - 1, ar, cf, a);
- }
- protected:
- void Sort (int low, int high);
- template <class ODT> void Sort (int low, int high, Array <ODT> & ar);
- template <class ODT> void Sort (int low, int high, FixArray <ODT> & ar);
- template <class Compare> void Sort (int low, int high, Compare cf);
- template <class ODT, class Compare> void Sort (int low, int high, Array <ODT> & ar, Compare cf);
- template <class ODT, class Compare> void Sort (int low, int high, FixArray <ODT> & ar, Compare cf);
- template <class Compare, typename arg> void Sort (int low, int high, Compare cf, arg a);
- template <class ODT, class Compare, typename arg> void Sort (int low, int high, Array <ODT> & ar, Compare cf, arg a);
- template <class ODT, class Compare, typename arg> void Sort (int low, int high, FixArray <ODT> & ar, Compare cf, arg a);
- public:
- inline void HeapSort ()
- {
- HeapSort (ArraySize - 1);
- }
- protected:
- void HeapSort (int n);
- void HeapAdjust (int s, int m);
- protected:
- friend class ArrayIterator < DATATYPE > ;
- friend class ArrayReverseIterator < DATATYPE > ;
- friend class ArrayStepIterator < DATATYPE > ;
- public:
- bool IsSorted () const;
- template <class Compare> bool IsSorted (Compare cf) const;
- public:
- DATATYPE & FindMin (void) const;
- DATATYPE & FindMax (void) const;
- template <class Compare> DATATYPE & FindMin (Compare cf) const;
- template <class Compare> DATATYPE & FindMax (Compare cf) const;
- public:
- int IndexOfMin (void) const;
- int IndexOfMax (void) const;
- template <class Compare> int IndexOfMin (Compare cf) const;
- template <class Compare> int IndexOfMax (Compare cf) const;
- public:
- inline ArrayItem < DATATYPE > * PtrOfItemAt (int nItem) const
- {
- ArrayItem < DATATYPE > * dl;
- if (nItem >= ArraySize)
- {
- return NULL;
- }
- // scan the chain to get the element (from head or from tail)
- if (nItem < ArraySize / 2)
- { // scan from the head of chain
- dl = first;
- ++nItem;
- while (--nItem > 0) dl = dl -> next;
- }
- else
- { // scan from the tail of chain
- dl = last;
- nItem = (ArraySize - nItem);
- while (--nItem > 0) dl = dl -> prev;
- }
- return dl;
- }
- inline ArrayItem < DATATYPE > * PtrOfItem (const DATATYPE & dt) const
- {
- for (Array <DATATYPE>::Iterator Iter (*this); Iter; Iter++)
- {
- const DATATYPE & mydt = Iter ();
- if (dt == mydt)
- {
- ArrayItem < DATATYPE > * dl = Iter.m_Next;
- return dl;
- }
- }
- return NULL;
- }
- protected:
- inline BOOL Swap (ArrayItem < DATATYPE > * dlFirst, ArrayItem < DATATYPE > * dlLast)
- {
- if ( (dlFirst == NULL) || (dlLast == NULL) )
- return FALSE;
- ArrayItem < DATATYPE > * PF = dlFirst->prev; // 1
- ArrayItem < DATATYPE > * FN = dlFirst->next; // 3
- ArrayItem < DATATYPE > * PL = dlLast->prev; // 4
- ArrayItem < DATATYPE > * LN = dlLast->next; // 6
- bool bNeighbor = (dlFirst->next == dlLast);
- dlFirst->next = LN;
- if (LN)
- LN->prev = dlFirst;
- else
- last = dlFirst;
- if (bNeighbor)
- {
- dlLast->next = dlFirst;
- dlFirst->prev = dlLast;
- }
- else
- {
- dlLast->next = FN;
- if (FN)
- FN->prev = dlLast;
- if (PL)
- PL->next = dlFirst;
- dlFirst->prev = PL;
- }
- if (PF)
- PF->next = dlLast;
- else
- first = dlLast;
- dlLast->prev = PF;
- return TRUE;
- }
- // 把B移动到A之前
- inline BOOL MoveBBeforeA (ArrayItem < DATATYPE > * B, ArrayItem < DATATYPE > * A)
- {
- if ( (A == NULL) || (B == NULL) )
- return FALSE;
- ArrayItem < DATATYPE > * AP = A->prev; // 2
- ArrayItem < DATATYPE > * AN = A->next; // 4
- ArrayItem < DATATYPE > * BP = B->prev; // 6
- ArrayItem < DATATYPE > * BN = B->next; // 8
- bool bNeighbor = (AN == B);
- A->prev = B;
- if (AP)
- {
- B->next = AP->next;
- AP->next= B;
- }
- else
- {
- B->next = first;
- first = B;
- }
- B->prev = AP;
- if (bNeighbor)
- {
- }
- else
- {
- if (AN)
- AN->prev= A;
- }
- if (BP)
- BP->next = BN;
- else
- first = BN;
- if (BN)
- BN->prev = BP;
- else
- last = BP;
- return TRUE;
- }
- public:
- /*********************************************************************
- * Iterator Class
- *********************************************************************/
- class Iterator
- {
- protected:
- const Array < DATATYPE > * m_Array;
- int m_ArraySize;
- int m_Index;
- ArrayItem < DATATYPE > * m_Next;
- mutable DATATYPE * m_Item;
- public:
- Iterator (const Array < DATATYPE > * theArray)
- {
- Attach (theArray);
- }
- Iterator (const Array < DATATYPE > & theArray)
- {
- Attach (& theArray);
- }
- Iterator (const Iterator & Iter)
- {
- Assign (Iter);
- }
- inline Iterator & Assign (const Iterator & Iter)
- {
- m_Array = Iter.m_Array;
- m_ArraySize = Iter.m_ArraySize;
- m_Index = Iter.m_Index;
- m_Next = Iter.m_Next;
- m_Item = Iter.m_Item;
- return (*this);
- }
- inline Iterator & operator = (const Iterator & Iter)
- {
- return Assign (Iter);
- }
- inline void Attach (const Array < DATATYPE > * theArray)
- {
- if (theArray)
- m_Array = theArray;
- else
- m_Array = NULL;
- Restart ();
- }
- inline void Restart ()
- {
- m_Index = 0;
- if (m_Array)
- {
- m_ArraySize = m_Array -> GetSize ();
- m_Next = m_Array->first;
- }
- else
- {
- m_ArraySize = 0;
- m_Next = NULL;
- }
- m_Item = NULL;
- }
- inline void GoToFirst (void)
- {
- Restart ();
- }
- inline void GoToLast (void)
- {
- if (m_Array)
- {
- m_ArraySize = m_Array -> GetSize ();
- m_Next = m_Array->last;
- }
- else
- {
- m_ArraySize = 0;
- m_Next = NULL;
- }
- m_Index = m_ArraySize - 1;
- m_Item = NULL;
- }
- inline operator bool () const
- {
- return bool (m_Next);
- }
- inline DATATYPE & operator () (void)
- {
- return Current ();
- }
- inline DATATYPE & operator * (void)
- {
- return Current ();
- }
- inline DATATYPE & Current (void)
- {
- if (m_Next)
- {
- m_Item = &(m_Next -> Data);
- return *m_Item;
- }
- // _fatal ("Warning! will return null");
- m_Item = NULL;
- return ((DATATYPE &) *m_Item);
- }
- inline const DATATYPE & Current (void) const
- {
- if (m_Next)
- {
- m_Item = &(m_Next -> Data);
- return *m_Item;
- }
- // _fatal ("Warning! will return null");
- m_Item = NULL;
- return ((const DATATYPE &) *m_Item);
- }
- inline int Index (void) const
- {
- return m_Index;
- }
- virtual inline void Next (void)
- {
- if (m_Next)
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- inline int Remainder () const
- {
- return m_ArraySize - m_Index;
- }
- inline void operator ++ () // ++Iter; prevfix
- {
- Next ();
- }
- inline void operator ++ (int) // Iter ++, postfix
- {
- Next ();
- }
- virtual inline void Prev (void)
- {
- if (m_Next)
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- inline void operator -- () // --Iter; prevfix
- {
- Prev ();
- }
- inline void operator -- (int) // Iter++, postfix
- {
- Prev ();
- }
- virtual inline void Step (int NumberOfStep)
- {
- if (NumberOfStep > 0)
- {
- for (int nStep=0; nStep<NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- else
- {
- for (int nStep=0; nStep<-NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- }
- inline Iterator & operator += (int NumberOfStep)
- {
- Step (NumberOfStep);
- return (*this);
- }
- inline Iterator & operator -= (int NumberOfStep)
- {
- Step (-NumberOfStep);
- return (*this);
- }
- inline bool Find (const DATATYPE & Value)
- {
- while (*this)
- {
- if (Current () == Value)
- return true;
- Next ();
- }
- return false;
- }
- inline bool ReverseFind (const DATATYPE & Value)
- {
- while (*this)
- {
- if (Current () == Value)
- return true;
- Prev ();
- }
- return false;
- }
- inline bool operator < (const Iterator & Iter) const
- {
- return m_Index < Iter.m_Index;
- }
- inline bool operator > (const Iterator & Iter) const
- {
- return m_Index > Iter.m_Index;
- }
- inline bool operator <= (const Iterator & Iter) const
- {
- return m_Index <= Iter.m_Index;
- }
- inline bool operator >= (const Iterator & Iter) const
- {
- return m_Index >= Iter.m_Index;
- }
- inline bool operator == (const Iterator & Iter) const
- {
- return m_Index == Iter.m_Index;
- }
- inline bool operator < (int i) const
- {
- return m_Index < i;
- }
- inline bool operator > (int i) const
- {
- return m_Index > i;
- }
- inline bool operator <= (int i) const
- {
- return m_Index <= i;
- }
- inline bool operator >= (int i) const
- {
- return m_Index >= i;
- }
- inline bool operator == (int i) const
- {
- return m_Index == i;
- }
- inline int GetArraySize (void) const
- {
- return (m_ArraySize);
- }
- inline const Array <DATATYPE> * __GetArray () const
- {
- return m_Array;
- }
- inline const ArrayItem < DATATYPE > * __GetCurrent () const
- {
- return m_Next;
- }
- inline ArrayItem < DATATYPE > * __GetCurrent ()
- {
- return m_Next;
- }
- inline void __SetArraySize (int size)
- {
- m_ArraySize = size;
- }
- };
- /*********************************************************************
- * RangeIterator Class
- *********************************************************************/
- class RangeIterator : public Iterator
- {
- private:
- int m_MinIndex;
- int m_MaxIndex;
- public:
- RangeIterator (const Array < DATATYPE > * theArray) : Iterator (theArray)
- {
- m_MinIndex = 0;
- m_MaxIndex = m_ArraySize-1;
- }
- RangeIterator (const Array < DATATYPE > & theArray) : Iterator (theArray)
- {
- m_MinIndex = 0;
- m_MaxIndex = m_ArraySize-1;
- }
- RangeIterator (const Iterator & Iter) : Iterator (Iter)
- {
- m_MinIndex = 0;
- m_MaxIndex = m_ArraySize-1;
- }
- inline void SetRange (int minIndex, int maxIndex)
- {
- m_MinIndex = minIndex;
- m_MaxIndex = maxIndex;
- if (m_MinIndex < 0)
- m_MinIndex = 0;
- if (m_MinIndex >= m_ArraySize)
- m_MinIndex = m_ArraySize-1;
- if (m_MaxIndex < 0)
- m_MaxIndex = 0;
- if (m_MaxIndex >= m_ArraySize)
- m_MaxIndex = m_ArraySize-1;
- if (m_MinIndex > m_MaxIndex)
- m_MinIndex = m_MaxIndex;
- Restart ();
- }
- inline void Restart ()
- {
- m_Index = 0;
- if (m_Array)
- {
- m_ArraySize = m_Array -> GetSize ();
- m_Next = m_Array->first;
- }
- else
- {
- m_ArraySize = 0;
- m_Next = NULL;
- }
- m_Item = NULL;
- if (m_MinIndex)
- (*this) += m_MinIndex;
- }
- void GotoIndex (int Index)
- {
- m_Index = 0;
- if (m_Array)
- {
- m_ArraySize = m_Array -> GetSize ();
- m_Next = m_Array->first;
- }
- else
- {
- m_ArraySize = 0;
- m_Next = NULL;
- }
- m_Item = NULL;
- if (Index < m_MinIndex)
- Index = m_MinIndex;
- if (Index > m_MaxIndex)
- Index = m_MaxIndex;
- (*this) += Index;
- }
- inline void Next (void)
- {
- if (m_Next)
- {
- if (m_Index >= m_MaxIndex)
- {
- m_Next = NULL;
- }
- else
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- }
- virtual inline void Prev (void)
- {
- if (m_Next)
- {
- if (m_Index < m_MinIndex)
- {
- m_Next = NULL;
- }
- else
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- }
- inline RangeIterator & operator += (int NumberOfStep)
- {
- if (NumberOfStep > 0)
- {
- for (int nStep=0; nStep<NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- else
- {
- for (int nStep=0; nStep<-NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- return (*this);
- }
- inline RangeIterator & operator -= (int NumberOfStep)
- {
- return this->operator += (-NumberOfStep);
- }
- };
- /*********************************************************************
- * ReverseIterator Class
- *********************************************************************/
- class ReverseIterator
- {
- protected:
- const Array < DATATYPE > * m_Array;
- int m_ArraySize;
- int m_Index;
- ArrayItem < DATATYPE > * m_Next;
- mutable DATATYPE * m_Item;
- public:
- ReverseIterator (const Array < DATATYPE > * theArray)
- {
- Attach (theArray);
- }
- ReverseIterator (const Array < DATATYPE > & theArray)
- {
- Attach (&theArray);
- }
- ReverseIterator (const ReverseIterator & Iter)
- {
- Assign (Iter);
- }
- inline ReverseIterator & Assign (const ReverseIterator & Iter)
- {
- m_Array = Iter.m_Array;
- m_ArraySize = Iter.m_ArraySize;
- m_Index = Iter.m_Index;
- m_Next = Iter.m_Next;
- m_Item = Iter.m_Item;
- return (*this);
- }
- inline ReverseIterator & operator = (const ReverseIterator & Iter)
- {
- return Assign (Iter);
- }
- inline void Attach (const Array < DATATYPE > * theArray)
- {
- if (theArray)
- m_Array = theArray;
- else
- m_Array = NULL;
- Restart ();
- }
- inline void Restart ()
- {
- if (m_Array)
- {
- m_ArraySize = m_Array -> GetSize ();
- m_Next = m_Array->last;
- }
- else
- {
- m_ArraySize = 0;
- m_Next = NULL;
- }
- m_Index = m_ArraySize - 1;
- m_Item = NULL;
- }
- inline operator bool () const
- {
- return bool (m_Next);
- }
- inline DATATYPE & operator () (void)
- {
- return Current ();
- }
- inline const DATATYPE & operator () (void) const
- {
- return Current ();
- }
- inline DATATYPE & operator * (void)
- {
- return Current ();
- }
- inline DATATYPE & Current (void)
- {
- if (m_Next)
- {
- m_Item = &(m_Next -> Data);
- return *m_Item;
- }
- // _fatal ("Warning! will return null");
- m_Item = NULL;
- return ((DATATYPE &) *m_Item);
- }
- inline const DATATYPE & Current (void) const
- {
- if (m_Next)
- {
- m_Item = &(m_Next -> Data);
- return *m_Item;
- }
- // _fatal ("Warning! will return null");
- m_Item = NULL;
- return ((const DATATYPE &) *m_Item);
- }
- inline int Index (void) const
- {
- return m_Index;
- }
- inline int Remainder () const
- {
- return m_Index;
- }
- inline DATATYPE & operator ++ () // ++Iter; prevfix
- {
- if (m_Next)
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- return Current ();
- }
- inline DATATYPE & operator ++ (int) // Iter ++, postfix
- {
- DATATYPE & dt = Current ();
- if (m_Next)
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- return dt;
- }
- inline DATATYPE & operator -- () // --Iter; prevfix
- {
- if (m_Next)
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- return Current ();
- }
- inline DATATYPE & operator -- (int) // Iter++, postfix
- {
- DATATYPE & dt = Current ();
- if (m_Next)
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- return dt;
- }
- inline ReverseIterator & operator += (int NumberOfStep)
- {
- if (NumberOfStep > 0)
- {
- for (int nStep=0; nStep<NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- else
- {
- for (int nStep=0; nStep<-NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- return (*this);
- }
- inline ReverseIterator & operator -= (int NumberOfStep)
- {
- return this->operator += (-NumberOfStep);
- }
- inline bool operator < (const ReverseIterator & Iter) const
- {
- return m_Index < Iter.m_Index;
- }
- inline bool operator > (const ReverseIterator & Iter) const
- {
- return m_Index > Iter.m_Index;
- }
- inline bool operator <= (const ReverseIterator & Iter) const
- {
- return m_Index <= Iter.m_Index;
- }
- inline bool operator >= (const ReverseIterator & Iter) const
- {
- return m_Index >= Iter.m_Index;
- }
- inline bool operator == (const ReverseIterator & Iter) const
- {
- return m_Index == Iter.m_Index;
- }
- inline bool operator < (int i) const
- {
- return m_Index < i;
- }
- inline bool operator > (int i) const
- {
- return m_Index > i;
- }
- inline bool operator <= (int i) const
- {
- return m_Index <= i;
- }
- inline bool operator >= (int i) const
- {
- return m_Index >= i;
- }
- inline bool operator == (int i) const
- {
- return m_Index == i;
- }
- inline int GetArraySize (void) const
- {
- return (m_ArraySize);
- }
- inline const Array <DATATYPE> * __GetArray () const
- {
- return m_Array;
- }
- inline const ArrayItem < DATATYPE > * __GetCurrent () const
- {
- return m_Next;
- }
- inline ArrayItem < DATATYPE > * __GetCurrent ()
- {
- return m_Next;
- }
- inline void __SetArraySize (int size)
- {
- m_ArraySize = size;
- }
- };
- /*********************************************************************
- * RangeReverseIterator Class
- *********************************************************************/
- class RangeReverseIterator : public ReverseIterator
- {
- private:
- int m_MinIndex;
- int m_MaxIndex;
- public:
- RangeReverseIterator (const Array < DATATYPE > * theArray) : ReverseIterator (theArray)
- {
- m_MinIndex = 0;
- m_MaxIndex = m_ArraySize-1;
- }
- RangeReverseIterator (const Array < DATATYPE > & theArray) : ReverseIterator (theArray)
- {
- m_MinIndex = 0;
- m_MaxIndex = m_ArraySize-1;
- }
- RangeReverseIterator (const ReverseIterator & Iter) : ReverseIterator (Iter)
- {
- m_MinIndex = 0;
- m_MaxIndex = m_ArraySize-1;
- }
- inline void SetRange (int minIndex, int maxIndex)
- {
- m_MinIndex = minIndex;
- m_MaxIndex = maxIndex;
- if (m_MinIndex < 0)
- m_MinIndex = 0;
- if (m_MinIndex >= m_ArraySize)
- m_MinIndex = m_ArraySize-1;
- if (m_MaxIndex < 0)
- m_MaxIndex = 0;
- if (m_MaxIndex >= m_ArraySize)
- m_MaxIndex = m_ArraySize-1;
- if (m_MinIndex > m_MaxIndex)
- m_MinIndex = m_MaxIndex;
- Restart ();
- }
- inline void Restart ()
- {
- if (m_Array)
- {
- m_ArraySize = m_Array -> GetSize ();
- m_Next = m_Array->last;
- }
- else
- {
- m_ArraySize = 0;
- m_Next = NULL;
- }
- m_Index = m_ArraySize - 1;
- m_Item = NULL;
- if (m_MaxIndex)
- (*this) += m_ArraySize - m_MaxIndex - 1;
- }
- void GotoIndex (int Index)
- {
- if (m_Array)
- {
- m_ArraySize = m_Array -> GetSize ();
- m_Next = m_Array->last;
- }
- else
- {
- m_ArraySize = 0;
- m_Next = NULL;
- }
- m_Index = m_ArraySize - 1;
- m_Item = NULL;
- if (Index < m_MinIndex)
- Index = m_MinIndex;
- if (Index > m_MaxIndex)
- Index = m_MaxIndex;
- (*this) += m_ArraySize - Index - 1;
- }
- inline DATATYPE & operator ++ () // ++Iter; prevfix
- {
- if (m_Next)
- {
- if (m_Index <= m_MinIndex)
- {
- m_Next = NULL;
- }
- else
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- return Current ();
- }
- inline DATATYPE & operator ++ (int) // Iter ++, postfix
- {
- DATATYPE & dt = Current ();
- if (m_Next)
- {
- if (m_Index <= m_MinIndex)
- {
- m_Next = NULL;
- }
- else
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- return dt;
- }
- inline DATATYPE & operator -- () // --Iter; prevfix
- {
- if (m_Next)
- {
- if (m_Index >= m_MaxIndex)
- {
- m_Next = NULL;
- }
- else
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- return Current ();
- }
- inline DATATYPE & operator -- (int) // Iter++, postfix
- {
- DATATYPE & dt = Current ();
- if (m_Next)
- {
- if (m_Index >= m_MaxIndex)
- {
- m_Next = NULL;
- }
- else
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- return dt;
- }
- inline RangeReverseIterator & operator += (int NumberOfStep)
- {
- if (NumberOfStep > 0)
- {
- for (int nStep=0; nStep<NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> prev;
- m_Index --;
- }
- }
- else
- {
- for (int nStep=0; nStep<-NumberOfStep && m_Next; nStep++)
- {
- m_Next = m_Next -> next;
- m_Index ++;
- }
- }
- return (*this);
- }
- inline RangeReverseIterator & operator -= (int NumberOfStep)
- {
- return this->operator += (-NumberOfStep);
- }
- };
- public:
- void AddBefore (const DATATYPE &, Iterator & Iter);
- BOOL RemoveAt (Iterator & Iter);
- void AddBefore (const DATATYPE &, ReverseIterator & Iter);
- BOOL RemoveAt (ReverseIterator & Iter);
- public:
- // 不带参数
- template <class pfnForEach>
- int ForEach (pfnForEach pf)
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- DATATYPE & dt = Iter ();
- if (! pf (dt))
- break;
- }
- return NbOfCalled;
- }
- template <class pfnForEach>
- int ForEach (pfnForEach pf) const
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- const DATATYPE & dt = Iter ();
- if (! pf (dt))
- break;
- }
- return NbOfCalled;
- }
- // 带 1 个参数
- template <class pfnForEach, typename arg>
- int ForEach (pfnForEach pf, arg e)
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- DATATYPE & dt = Iter ();
- if (! pf (dt, e))
- break;
- }
- return NbOfCalled;
- }
- template <class pfnForEach, typename arg>
- int ForEach (pfnForEach pf, arg e) const
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- const DATATYPE & dt = Iter ();
- if (! pf (dt, e))
- break;
- }
- return NbOfCalled;
- }
- // 带 2 个参数
- template <class pfnForEach, typename T1, typename T2>
- int ForEach (pfnForEach pf, T1 t1, T2 t2)
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- DATATYPE & dt = Iter ();
- if (! pf (dt, t1, t2))
- break;
- }
- return NbOfCalled;
- }
- template <class pfnForEach, typename T1, typename T2>
- int ForEach (pfnForEach pf, T1 t1, T2 t2) const
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- const DATATYPE & dt = Iter ();
- if (! pf (dt, t1, t2))
- break;
- }
- return NbOfCalled;
- }
- // 带 3 个参数
- template <class pfnForEach, typename T1, typename T2, typename T3>
- int ForEach (pfnForEach pf, T1 t1, T2 t2, T3 t3)
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- DATATYPE & dt = Iter ();
- if (! pf (dt, t1, t2, t3))
- break;
- }
- return NbOfCalled;
- }
- template <class pfnForEach, typename T1, typename T2, typename T3>
- int ForEach (pfnForEach pf, T1 t1, T2 t2, T3 t3) const
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- const DATATYPE & dt = Iter ();
- if (! pf (dt, t1, t2, t3))
- break;
- }
- return NbOfCalled;
- }
- // 带 4 个参数
- template <class pfnForEach, typename T1, typename T2, typename T3, typename T4>
- int ForEach (pfnForEach pf, T1 t1, T2 t2, T3 t3, T4 t4)
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- DATATYPE & dt = Iter ();
- if (! pf (dt, t1, t2, t3, t4))
- break;
- }
- return NbOfCalled;
- }
- template <class pfnForEach, typename T1, typename T2, typename T3, typename T4>
- int ForEach (pfnForEach pf, T1 t1, T2 t2, T3 t3, T4 t4) const
- {
- int NbOfCalled = 0;
- for (Iterator Iter (*this); Iter; Iter++, NbOfCalled ++)
- {
- const DATATYPE & dt = Iter ();
- if (! pf (dt, t1, t2, t3, t4))
- break;
- }
- return NbOfCalled;
- }
- protected:
- template <class IterType> void AddBefore (const DATATYPE &, IterType & Iter);
- template <class IterType> BOOL RemoveAt (IterType & Iter);
- };
- /*********************************************************************
- * ArrayOfPtr Unit Class
- *
- * usage: ArrayOfPtr < ClassType > VarName;
- *
- *********************************************************************/
- template < class DATATYPE > class ArrayOfPtr : public Array < DATATYPE >
- {
- public:
- inline BOOL RemoveFirst (void)
- {
- ArrayItem < DATATYPE > * dl = first;
- if (dl)
- delete dl->Data;
- return Array <DATATYPE>::RemoveFirst ();
- }
- inline BOOL RemoveLast (void)
- {
- ArrayItem < DATATYPE > * dl = last;
- if (dl)
- delete dl->Data;
- return Array <DATATYPE>::RemoveLast ();
- }
- inline BOOL RemoveAt (int Index)
- {
- ArrayItem <DATATYPE> * dl = PtrOfItemAt (Index);
- if (dl)
- delete dl->Data;
- return Array <DATATYPE>::RemoveAt (Index);
- }
- inline void RemoveAll (void)
- {
- ArrayItem <DATATYPE> * dl = first;
- while (dl)
- {
- delete dl-> Data;
- dl = dl->next;
- }
- Array <DATATYPE>::RemoveAll ();
- }
- inline void Reset (void)
- {
- RemoveAll ();
- }
- ~ArrayOfPtr () { Reset (); }
- static inline int compare (const DATATYPE & t1, const DATATYPE & t2)
- {
- return (*t1>*t2 ? 1 : (*t1 == *t2 ? 0 : -1));
- }
- static inline bool IsEqual (const DATATYPE & t1, const DATATYPE & t2)
- {
- return (*t1 == *t2);
- }
- DATATYPE * Find (const DATATYPE & Key) const
- {
- return Array <DATATYPE>::Find (Key, IsEqual);
- }
- template <class ODT> DATATYPE * Find (const ODT & Key) const
- {
- for (Iterator Iter (*this); Iter; Iter++)
- {
- DATATYPE & value = Iter ();
- if (*value == Key)
- return &value;
- }
- return NULL;
- }
- template <class Compare> DATATYPE * Find (const DATATYPE & Key, Compare cf) const
- {
- for (Iterator Iter (*this); Iter; Iter++)
- {
- DATATYPE & value = Iter ();
- if (cf (*value, *Key))
- return &value;
- }
- return NULL;
- }
- template <class ODT, class Compare> DATATYPE * Find (const ODT & Key, Compare cf) const
- {
- for (Iterator Iter (*this); Iter; Iter++)
- {
- DATATYPE & value = Iter ();
- if (cf (*value, Key))
- return &value;
- }
- return NULL;
- }
- void Sort (void)
- {
- return Array <DATATYPE>::Sort (compare);
- }
- template <class ODT> void Sort (Array <ODT> & ar)
- {
- return Array <DATATYPE>::Sort (ar, compare);
- }
- template <class ODT> void Sort (FixArray <ODT> & ar)
- {
- return Array <DATATYPE>::Sort (ar, compare);
- }
- inline void Remove (const DATATYPE & dt)
- {
- for (Array <DATATYPE>::Iterator Iter (*this); Iter; Iter++)
- {
- const DATATYPE & mydt = Iter ();
- if (dt == mydt)
- {
- RemoveAt (Iter);
- return;
- }
- }
- }
- inline BOOL RemoveAt (Iterator & Iter)
- {
- return RemoveAt <Iterator> (Iter);
- }
- inline BOOL RemoveAt (ReverseIterator & Iter)
- {
- return RemoveAt <ReverseIterator> (Iter);
- }
- protected:
- template <class IterType> BOOL RemoveAt (IterType & Iter);
- };
- /*********************************************************************
- * ArrayIterator Unit Class
- *
- *
- *********************************************************************/
- template < class DATATYPE > class ArrayIterator
- {
- private:
- int ArraySize;
- int Index;
- DATATYPE * LastItem;
- ArrayItem < DATATYPE > * LastAccess;
- public:
- ArrayIterator (const Array < DATATYPE > * theArray)
- {
- if (theArray)
- {
- ArraySize = theArray -> GetSize ();
- LastAccess = (ArrayItem < DATATYPE > *) theArray -> first;
- }
- else
- {
- ArraySize = 0;
- LastAccess = NULL;
- }
- Index = 0;
- LastItem = NULL;
- }
- ArrayIterator (const Array < DATATYPE > & theArray)
- {
- ArraySize = theArray.GetSize ();
- LastAccess = (ArrayItem < DATATYPE > *) theArray.first;
- Index = 0;
- LastItem = NULL;
- }
- operator bool () const
- {
- return bool (LastAccess);
- }
- DATATYPE & operator () (void)
- {
- if (LastAccess)
- {
- LastItem = &(LastAccess -> Data);
- LastAccess = LastAccess -> next;
- Index ++;
- return *LastItem;
- }
- // _fatal ("Warning! will return null");
- LastItem = NULL;
- return ((DATATYPE &) *LastItem);
- }
- int GetLastIndex (void)
- {
- return (Index-1);
- }
- DATATYPE & GetLastItem (void)
- {
- return ((DATATYPE &)(*LastItem));
- }
- int GetArraySize (void) const
- {
- return (ArraySize);
- }
- };
- template < class DATATYPE > class ArrayReverseIterator
- {
- private:
- int ArraySize;
- int Index;
- DATATYPE * LastItem;
- ArrayItem < DATATYPE > * LastAccess;
- public:
- ArrayReverseIterator (const Array < DATATYPE > * theArray)
- {
- if (theArray)
- {
- ArraySize = theArray -> GetSize ();
- LastAccess = (ArrayItem < DATATYPE > *) theArray -> last;
- Index = ArraySize-1;
- }
- else
- {
- ArraySize = 0;
- LastAccess = NULL;
- Index = 0;
- }
- LastItem = NULL;
- }
- ArrayReverseIterator (const Array < DATATYPE > & theArray)
- {
- ArraySize = theArray.GetSize ();
- LastAccess = (ArrayItem < DATATYPE > *) theArray.last;
- Index = ArraySize-1;
- LastItem = NULL;
- }
- operator bool () const
- {
- return bool (LastAccess);
- }
- DATATYPE & operator () (void)
- {
- if (LastAccess)
- {
- LastItem = &(LastAccess -> Data);
- LastAccess = LastAccess -> prev;
- Index --;
- return *LastItem;
- }
- _fatal ("Warning! will return null");
- LastItem = NULL;
- return ((DATATYPE &) *LastItem);
- }
- int GetLastIndex (void)
- {
- return (Index+1);
- }
- DATATYPE & GetLastItem (void)
- {
- return ((DATATYPE &)(*LastItem));
- }
- int GetArraySize (void) const
- {
- return (ArraySize);
- }
- };
- /*********************************************************************
- * ArrayIterator Unit Class
- *
- *
- *********************************************************************/
- template < class DATATYPE > class ArrayStepIterator
- {
- private:
- int ArraySize;
- int Index;
- DATATYPE * LastItem;
- ArrayItem < DATATYPE > * LastAccess;
- public:
- ArrayStepIterator (const Array < DATATYPE > * theArray)
- {
- if (theArray)
- {
- ArraySize = theArray -> GetSize ();
- LastAccess = (ArrayItem < DATATYPE > *) theArray -> first;
- }
- else
- {
- ArraySize = 0;
- LastAccess = NULL;
- }
- Index = 0;
- LastItem = NULL;
- }
- ArrayStepIterator (const Array < DATATYPE > & theArray)
- {
- ArraySize = theArray.GetSize ();
- LastAccess = (ArrayItem < DATATYPE > *) theArray.first;
- Index = 0;
- LastItem = NULL;
- }
- operator bool () const
- {
- return bool (LastAccess);
- }
- DATATYPE & operator () (void)
- {
- if (LastAccess)
- {
- LastItem = &(LastAccess -> Data);
- return *LastItem;
- }
- // _fatal ("Warning! will return null");
- LastItem = NULL;
- return ((DATATYPE &) *LastItem);
- }
- int GetLastIndex (void)
- {
- return Index;
- }
- ArrayStepIterator & operator ++ () // Iter ++; postfix
- {
- if (LastAccess)
- {
- LastAccess = LastAccess -> next;
- Index ++;
- }
- return (*this);
- }
- ArrayStepIterator & operator ++ (int) // ++ Iter, prevfix
- {
- if (LastAccess)
- {
- LastAccess = LastAccess -> next;
- Index ++;
- }
- return (*this);
- }
- ArrayStepIterator & operator -- () // Iter --; postfix
- {
- if (LastAccess)
- {
- LastAccess = LastAccess -> prev;
- Index --;
- }
- return (*this);
- }
- ArrayStepIterator & operator -- (int) // -- Iter, prevfix
- {
- if (LastAccess)
- {
- LastAccess = LastAccess -> prev;
- Index --;
- }
- return (*this);
- }
- ArrayStepIterator & operator += (int NumberOfStep)
- {
- if (NumberOfStep > 0)
- {
- for (int nStep=0; nStep<NumberOfStep && LastAccess; nStep++)
- {
- LastAccess = LastAccess -> next;
- Index ++;
- }
- }
- else
- {
- for (int nStep=0; nStep<-NumberOfStep && LastAccess; nStep++)
- {
- LastAccess = LastAccess -> prev;
- Index --;
- }
- }
- return (*this);
- }
- ArrayStepIterator & operator -= (int NumberOfStep)
- {
- return this->operator += (-NumberOfStep);
- }
- DATATYPE & GetLastItem (void)
- {
- return ((DATATYPE &)(*LastItem));
- }
- int GetArraySize (void) const
- {
- return (ArraySize);
- }
- };
- //#endif
|