00001
00032 #ifndef LL_DOUBLELINKEDLIST_H
00033 #define LL_DOUBLELINKEDLIST_H
00034
00035 #include "llerror.h"
00036 #include "llrand.h"
00037
00038
00039 template <class DATA_TYPE> class LLDoubleLinkedNode
00040 {
00041 public:
00042 DATA_TYPE *mDatap;
00043 LLDoubleLinkedNode *mNextp;
00044 LLDoubleLinkedNode *mPrevp;
00045
00046
00047 public:
00048
00049 LLDoubleLinkedNode(DATA_TYPE *data);
00050
00051
00052
00053 ~LLDoubleLinkedNode();
00054
00055
00056 void deleteData();
00057
00058
00059 void removeData();
00060 };
00061
00062
00063 const U32 LLDOUBLE_LINKED_LIST_STATE_STACK_DEPTH = 4;
00064
00065 template <class DATA_TYPE> class LLDoubleLinkedList
00066 {
00067 private:
00068 LLDoubleLinkedNode<DATA_TYPE> mHead;
00069 LLDoubleLinkedNode<DATA_TYPE> mTail;
00070 LLDoubleLinkedNode<DATA_TYPE> *mQueuep;
00071 LLDoubleLinkedNode<DATA_TYPE> *mCurrentp;
00072
00073
00074
00075 LLDoubleLinkedNode<DATA_TYPE> *mQueuepStack[LLDOUBLE_LINKED_LIST_STATE_STACK_DEPTH];
00076 LLDoubleLinkedNode<DATA_TYPE> *mCurrentpStack[LLDOUBLE_LINKED_LIST_STATE_STACK_DEPTH];
00077 U32 mStateStackDepth;
00078 U32 mCount;
00079
00080
00081
00082
00083
00084 BOOL (*mInsertBefore)(DATA_TYPE *first, DATA_TYPE *second);
00085
00086 public:
00087 LLDoubleLinkedList();
00088
00089
00090 ~LLDoubleLinkedList();
00091
00092
00093
00094 void addData(DATA_TYPE *data);
00095
00096
00097
00098 void addDataAtEnd(DATA_TYPE *data);
00099
00100 S32 getLength() const;
00101
00102
00103
00104 BOOL removeData(const DATA_TYPE *data);
00105
00106
00107
00108
00109 BOOL deleteData(DATA_TYPE *data);
00110
00111
00112 void deleteAllData();
00113
00114
00115 void removeAllNodes();
00116
00117 BOOL isEmpty();
00118
00119
00120
00121
00122 BOOL checkData(const DATA_TYPE *data);
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 void resetList();
00141
00142
00143
00144
00145 DATA_TYPE *getCurrentData();
00146
00147
00148
00149
00150 DATA_TYPE *getFirstData();
00151
00152
00153
00154
00155
00156 DATA_TYPE *getNthData(U32 n);
00157
00158
00159
00160 DATA_TYPE *getLastData();
00161
00162
00163
00164 DATA_TYPE *getNextData();
00165
00166
00167
00168 DATA_TYPE *getPreviousData();
00169
00170
00171
00172 void removeCurrentData();
00173
00174
00175
00176 void deleteCurrentData();
00177
00178
00179
00180 void moveCurrentData(LLDoubleLinkedList<DATA_TYPE> *newlist);
00181
00182
00183
00184 void insertNode(LLDoubleLinkedNode<DATA_TYPE> *node);
00185
00186
00187
00188 void insertData(DATA_TYPE *data);
00189
00190
00191
00192
00193
00194
00195 void swapCurrentWithPrevious();
00196
00197
00198
00199
00200
00201
00202 void swapCurrentWithNext();
00203
00204
00205
00206 void moveCurrentToFront();
00207
00208
00209
00210 void moveCurrentToEnd();
00211
00212
00213 void setInsertBefore(BOOL (*insert_before)(DATA_TYPE *first, DATA_TYPE *second));
00214
00215
00216
00217 BOOL addDataSorted(DATA_TYPE *datap);
00218
00219
00220
00221
00222 BOOL bubbleSort();
00223
00224
00225 BOOL lazyBubbleSort();
00226
00227
00228 BOOL pushState();
00229
00230
00231 BOOL popState();
00232
00233
00234 void clearStateStack();
00235
00236
00237
00238 void scramble();
00239
00240 private:
00241
00242
00243 void addNode(LLDoubleLinkedNode<DATA_TYPE> *node);
00244
00245
00246
00247 void addNodeAtEnd(LLDoubleLinkedNode<DATA_TYPE> *node);
00248 };
00249
00250
00251
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00264
00266
00267
00268
00269 template <class DATA_TYPE>
00270 LLDoubleLinkedNode<DATA_TYPE>::LLDoubleLinkedNode(DATA_TYPE *data) :
00271 mDatap(data), mNextp(NULL), mPrevp(NULL)
00272 {
00273 }
00274
00275
00276
00277
00278 template <class DATA_TYPE>
00279 LLDoubleLinkedNode<DATA_TYPE>::~LLDoubleLinkedNode()
00280 {
00281 if (mDatap)
00282 {
00283 llerror("Attempting to call LLDoubleLinkedNode destructor with a non-null mDatap!", 1);
00284 }
00285 }
00286
00287
00288
00289 template <class DATA_TYPE>
00290 void LLDoubleLinkedNode<DATA_TYPE>::deleteData()
00291 {
00292 delete mDatap;
00293 mDatap = NULL;
00294 }
00295
00296
00297 template <class DATA_TYPE>
00298 void LLDoubleLinkedNode<DATA_TYPE>::removeData()
00299 {
00300 mDatap = NULL;
00301 }
00302
00303
00305
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324 template <class DATA_TYPE>
00325 LLDoubleLinkedList<DATA_TYPE>::LLDoubleLinkedList()
00326 : mHead(NULL), mTail(NULL), mQueuep(NULL)
00327 {
00328 mCurrentp = mHead.mNextp;
00329 mQueuep = mHead.mNextp;
00330 mStateStackDepth = 0;
00331 mCount = 0;
00332 mInsertBefore = NULL;
00333 }
00334
00335
00336
00337 template <class DATA_TYPE>
00338 LLDoubleLinkedList<DATA_TYPE>::~LLDoubleLinkedList()
00339 {
00340 removeAllNodes();
00341 }
00342
00343
00344
00345
00346 template <class DATA_TYPE>
00347 void LLDoubleLinkedList<DATA_TYPE>::addData(DATA_TYPE *data)
00348 {
00349
00350 if (!data)
00351 {
00352 llerror("NULL pointer passed to LLDoubleLinkedList::addData()", 0);
00353 }
00354
00355
00356 LLDoubleLinkedNode<DATA_TYPE> *temp = new LLDoubleLinkedNode<DATA_TYPE> (data);
00357
00358
00359 temp->mPrevp = NULL;
00360 temp->mNextp = mHead.mNextp;
00361 mHead.mNextp = temp;
00362
00363
00364 if (temp->mNextp)
00365 {
00366 temp->mNextp->mPrevp = temp;
00367 }
00368
00369 else
00370 {
00371 mTail.mPrevp = temp;
00372 }
00373
00374 mCount++;
00375 }
00376
00377
00378
00379 template <class DATA_TYPE>
00380 void LLDoubleLinkedList<DATA_TYPE>::addDataAtEnd(DATA_TYPE *data)
00381 {
00382
00383 if (!data)
00384 {
00385 llerror("NULL pointer passed to LLDoubleLinkedList::addData()", 0);
00386 }
00387
00388
00389 LLDoubleLinkedNode<DATA_TYPE> *nodep = new LLDoubleLinkedNode<DATA_TYPE>(data);
00390
00391 addNodeAtEnd(nodep);
00392 mCount++;
00393 }
00394
00395
00396
00397
00398
00399 template <class DATA_TYPE>
00400 BOOL LLDoubleLinkedList<DATA_TYPE>::removeData(const DATA_TYPE *data)
00401 {
00402 BOOL b_found = FALSE;
00403
00404 if (!data)
00405 {
00406 llerror("NULL pointer passed to LLDoubleLinkedList::removeData()", 0);
00407 }
00408
00409 mCurrentp = mHead.mNextp;
00410
00411 while (mCurrentp)
00412 {
00413 if (mCurrentp->mDatap == data)
00414 {
00415 b_found = TRUE;
00416
00417
00418 if (mCurrentp->mNextp)
00419 {
00420 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
00421 }
00422 else
00423 {
00424 mTail.mPrevp = mCurrentp->mPrevp;
00425 }
00426
00427
00428 if (mCurrentp->mPrevp)
00429 {
00430 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
00431 }
00432 else
00433 {
00434 mHead.mNextp = mCurrentp->mNextp;
00435 }
00436
00437
00438 mCurrentp->removeData();
00439 delete mCurrentp;
00440 mCount--;
00441 break;
00442 }
00443 mCurrentp = mCurrentp->mNextp;
00444 }
00445
00446
00447 if (mCurrentp == mQueuep)
00448 {
00449 mCurrentp = mQueuep = NULL;
00450 }
00451 else
00452 {
00453 mCurrentp = mQueuep;
00454 }
00455
00456 return b_found;
00457 }
00458
00459
00460
00461
00462
00463 template <class DATA_TYPE>
00464 BOOL LLDoubleLinkedList<DATA_TYPE>::deleteData(DATA_TYPE *data)
00465 {
00466 BOOL b_found = FALSE;
00467
00468 if (!data)
00469 {
00470 llerror("NULL pointer passed to LLDoubleLinkedList::deleteData()", 0);
00471 }
00472
00473 mCurrentp = mHead.mNextp;
00474
00475 while (mCurrentp)
00476 {
00477 if (mCurrentp->mDatap == data)
00478 {
00479 b_found = TRUE;
00480
00481
00482 if (mCurrentp->mNextp)
00483 {
00484 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
00485 }
00486 else
00487 {
00488 mTail.mPrevp = mCurrentp->mPrevp;
00489 }
00490
00491
00492 if (mCurrentp->mPrevp)
00493 {
00494 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
00495 }
00496 else
00497 {
00498 mHead.mNextp = mCurrentp->mNextp;
00499 }
00500
00501
00502 mCurrentp->deleteData();
00503 delete mCurrentp;
00504 mCount--;
00505 break;
00506 }
00507 mCurrentp = mCurrentp->mNextp;
00508 }
00509
00510
00511 if (mCurrentp == mQueuep)
00512 {
00513 mCurrentp = mQueuep = NULL;
00514 }
00515 else
00516 {
00517 mCurrentp = mQueuep;
00518 }
00519
00520 return b_found;
00521 }
00522
00523
00524
00525 template <class DATA_TYPE>
00526 void LLDoubleLinkedList<DATA_TYPE>::deleteAllData()
00527 {
00528 mCurrentp = mHead.mNextp;
00529
00530 while (mCurrentp)
00531 {
00532 mQueuep = mCurrentp->mNextp;
00533 mCurrentp->deleteData();
00534 delete mCurrentp;
00535 mCurrentp = mQueuep;
00536 }
00537
00538
00539 mHead.mNextp = NULL;
00540 mTail.mPrevp = NULL;
00541 mCurrentp = mHead.mNextp;
00542 mQueuep = mHead.mNextp;
00543 mStateStackDepth = 0;
00544 mCount = 0;
00545 }
00546
00547
00548
00549 template <class DATA_TYPE>
00550 void LLDoubleLinkedList<DATA_TYPE>::removeAllNodes()
00551 {
00552 mCurrentp = mHead.mNextp;
00553
00554 while (mCurrentp)
00555 {
00556 mQueuep = mCurrentp->mNextp;
00557 mCurrentp->removeData();
00558 delete mCurrentp;
00559 mCurrentp = mQueuep;
00560 }
00561
00562
00563 mHead.mNextp = NULL;
00564 mTail.mPrevp = NULL;
00565 mCurrentp = mHead.mNextp;
00566 mQueuep = mHead.mNextp;
00567 mStateStackDepth = 0;
00568 mCount = 0;
00569 }
00570
00571 template <class DATA_TYPE>
00572 S32 LLDoubleLinkedList<DATA_TYPE>::getLength() const
00573 {
00574
00575
00576
00577
00578
00579 return mCount;
00580 }
00581
00582
00583
00584
00585 template <class DATA_TYPE>
00586 BOOL LLDoubleLinkedList<DATA_TYPE>::checkData(const DATA_TYPE *data)
00587 {
00588 mCurrentp = mHead.mNextp;
00589
00590 while (mCurrentp)
00591 {
00592 if (mCurrentp->mDatap == data)
00593 {
00594 mQueuep = mCurrentp;
00595 return TRUE;
00596 }
00597 mCurrentp = mCurrentp->mNextp;
00598 }
00599
00600 mCurrentp = mQueuep;
00601 return FALSE;
00602 }
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620 template <class DATA_TYPE>
00621 void LLDoubleLinkedList<DATA_TYPE>::resetList()
00622 {
00623 mCurrentp = mHead.mNextp;
00624 mQueuep = mHead.mNextp;
00625 mStateStackDepth = 0;
00626 }
00627
00628
00629
00630
00631 template <class DATA_TYPE>
00632 DATA_TYPE* LLDoubleLinkedList<DATA_TYPE>::getCurrentData()
00633 {
00634 if (mQueuep)
00635 {
00636 mCurrentp = mQueuep;
00637 mQueuep = mQueuep->mNextp;
00638 return mCurrentp->mDatap;
00639 }
00640 else
00641 {
00642 return NULL;
00643 }
00644 }
00645
00646
00647
00648
00649 template <class DATA_TYPE>
00650 DATA_TYPE* LLDoubleLinkedList<DATA_TYPE>::getFirstData()
00651 {
00652 mQueuep = mHead.mNextp;
00653 mCurrentp = mQueuep;
00654 if (mQueuep)
00655 {
00656 mQueuep = mQueuep->mNextp;
00657 return mCurrentp->mDatap;
00658 }
00659 else
00660 {
00661 return NULL;
00662 }
00663 }
00664
00665
00666
00667
00668
00669 template <class DATA_TYPE>
00670 DATA_TYPE* LLDoubleLinkedList<DATA_TYPE>::getNthData(U32 n)
00671 {
00672 mCurrentp = mHead.mNextp;
00673
00674 if (mCurrentp)
00675 {
00676 for (U32 i=0; i<n; i++)
00677 {
00678 mCurrentp = mCurrentp->mNextp;
00679 if (!mCurrentp)
00680 {
00681 break;
00682 }
00683 }
00684 }
00685
00686 if (mCurrentp)
00687 {
00688
00689 mQueuep = mCurrentp->mNextp;
00690 return mCurrentp->mDatap;
00691 }
00692 else
00693 {
00694 mQueuep = NULL;
00695 return NULL;
00696 }
00697 }
00698
00699
00700
00701
00702 template <class DATA_TYPE>
00703 DATA_TYPE* LLDoubleLinkedList<DATA_TYPE>::getLastData()
00704 {
00705 mQueuep = mTail.mPrevp;
00706 mCurrentp = mQueuep;
00707 if (mQueuep)
00708 {
00709 mQueuep = mQueuep->mPrevp;
00710 return mCurrentp->mDatap;
00711 }
00712 else
00713 {
00714 return NULL;
00715 }
00716 }
00717
00718
00719
00720
00721 template <class DATA_TYPE>
00722 DATA_TYPE* LLDoubleLinkedList<DATA_TYPE>::getNextData()
00723 {
00724 if (mQueuep)
00725 {
00726 mCurrentp = mQueuep;
00727 mQueuep = mQueuep->mNextp;
00728 return mCurrentp->mDatap;
00729 }
00730 else
00731 {
00732 return NULL;
00733 }
00734 }
00735
00736
00737
00738
00739 template <class DATA_TYPE>
00740 DATA_TYPE* LLDoubleLinkedList<DATA_TYPE>::getPreviousData()
00741 {
00742 if (mQueuep)
00743 {
00744 mCurrentp = mQueuep;
00745 mQueuep = mQueuep->mPrevp;
00746 return mCurrentp->mDatap;
00747 }
00748 else
00749 {
00750 return NULL;
00751 }
00752 }
00753
00754
00755
00756
00757 template <class DATA_TYPE>
00758 void LLDoubleLinkedList<DATA_TYPE>::removeCurrentData()
00759 {
00760 if (mCurrentp)
00761 {
00762
00763 if (mCurrentp->mNextp)
00764 {
00765 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
00766 }
00767 else
00768 {
00769 mTail.mPrevp = mCurrentp->mPrevp;
00770 }
00771
00772
00773 if (mCurrentp->mPrevp)
00774 {
00775 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
00776 }
00777 else
00778 {
00779 mHead.mNextp = mCurrentp->mNextp;
00780 }
00781
00782
00783 mCurrentp->removeData();
00784 delete mCurrentp;
00785 mCount--;
00786
00787
00788 if (mCurrentp == mQueuep)
00789 {
00790 mCurrentp = mQueuep = NULL;
00791 }
00792 else
00793 {
00794 mCurrentp = mQueuep;
00795 }
00796 }
00797 }
00798
00799
00800
00801
00802 template <class DATA_TYPE>
00803 void LLDoubleLinkedList<DATA_TYPE>::deleteCurrentData()
00804 {
00805 if (mCurrentp)
00806 {
00807
00808
00809 if (mCurrentp->mNextp)
00810 {
00811 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
00812 }
00813 else
00814 {
00815 mTail.mPrevp = mCurrentp->mPrevp;
00816 }
00817
00818
00819 if (mCurrentp->mPrevp)
00820 {
00821 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
00822 }
00823 else
00824 {
00825 mHead.mNextp = mCurrentp->mNextp;
00826 }
00827
00828
00829 mCurrentp->deleteData();
00830 delete mCurrentp;
00831 mCount--;
00832
00833
00834 if (mCurrentp == mQueuep)
00835 {
00836 mCurrentp = mQueuep = NULL;
00837 }
00838 else
00839 {
00840 mCurrentp = mQueuep;
00841 }
00842 }
00843 }
00844
00845
00846
00847
00848 template <class DATA_TYPE>
00849 void LLDoubleLinkedList<DATA_TYPE>::moveCurrentData(LLDoubleLinkedList<DATA_TYPE> *newlist)
00850 {
00851 if (mCurrentp)
00852 {
00853
00854
00855 if (mCurrentp->mNextp)
00856 {
00857 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
00858 }
00859 else
00860 {
00861 mTail.mPrevp = mCurrentp->mPrevp;
00862 }
00863
00864
00865 if (mCurrentp->mPrevp)
00866 {
00867 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
00868 }
00869 else
00870 {
00871 mHead.mNextp = mCurrentp->mNextp;
00872 }
00873
00874
00875 newlist->addNode(mCurrentp);
00876
00877
00878 if (mCurrentp == mQueuep)
00879 {
00880 mCurrentp = mQueuep = NULL;
00881 }
00882 else
00883 {
00884 mCurrentp = mQueuep;
00885 }
00886 }
00887 }
00888
00889
00890
00891
00892 template <class DATA_TYPE>
00893 void LLDoubleLinkedList<DATA_TYPE>::insertNode(LLDoubleLinkedNode<DATA_TYPE> *nodep)
00894 {
00895
00896 if (!nodep)
00897 {
00898 llerror("NULL pointer passed to LLDoubleLinkedList::insertNode()", 0);
00899 }
00900 if (!nodep->mDatap)
00901 {
00902 llerror("NULL data pointer passed to LLDoubleLinkedList::insertNode()", 0);
00903 }
00904
00905 if (mCurrentp)
00906 {
00907 if (mCurrentp->mPrevp)
00908 {
00909 nodep->mPrevp = mCurrentp->mPrevp;
00910 nodep->mNextp = mCurrentp;
00911 mCurrentp->mPrevp->mNextp = nodep;
00912 mCurrentp->mPrevp = nodep;
00913 }
00914 else
00915 {
00916 nodep->mPrevp = NULL;
00917 nodep->mNextp = mCurrentp;
00918 mHead.mNextp = nodep;
00919 mCurrentp->mPrevp = nodep;
00920 }
00921 mCurrentp = mQueuep;
00922 }
00923 else
00924 {
00925 addNode(nodep);
00926 }
00927 }
00928
00929
00930
00931
00932 template <class DATA_TYPE>
00933 void LLDoubleLinkedList<DATA_TYPE>::insertData(DATA_TYPE *data)
00934 {
00935 if (!data)
00936 {
00937 llerror("NULL data pointer passed to LLDoubleLinkedList::insertNode()", 0);
00938 }
00939 LLDoubleLinkedNode<DATA_TYPE> *node = new LLDoubleLinkedNode<DATA_TYPE>(data);
00940 insertNode(node);
00941 mCount++;
00942 }
00943
00944
00945
00946
00947
00948
00949 template <class DATA_TYPE>
00950 void LLDoubleLinkedList<DATA_TYPE>::swapCurrentWithPrevious()
00951 {
00952 if (mCurrentp)
00953 {
00954 if (mCurrentp->mPrevp)
00955 {
00956
00957 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
00958 if (mCurrentp->mNextp)
00959 {
00960 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
00961 }
00962 else
00963 {
00964 mTail.mPrevp = mCurrentp->mPrevp;
00965 }
00966
00967
00968 mCurrentp->mNextp = mCurrentp->mPrevp;
00969 mCurrentp->mPrevp = mCurrentp->mNextp->mPrevp;
00970 mCurrentp->mNextp->mPrevp = mCurrentp;
00971
00972 if (mCurrentp->mPrevp)
00973 {
00974
00975 mCurrentp->mPrevp->mNextp = mCurrentp;
00976 }
00977 else
00978 {
00979 mHead.mNextp = mCurrentp;
00980 }
00981
00982
00983 mCurrentp = mQueuep;
00984 }
00985 }
00986 }
00987
00988
00989
00990
00991
00992
00993 template <class DATA_TYPE>
00994 void LLDoubleLinkedList<DATA_TYPE>::swapCurrentWithNext()
00995 {
00996 if (mCurrentp)
00997 {
00998 if (mCurrentp->mNextp)
00999 {
01000
01001 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
01002 if (mCurrentp->mPrevp)
01003 {
01004 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
01005 }
01006 else
01007 {
01008 mHead.mNextp = mCurrentp->mNextp;
01009 }
01010
01011
01012 mCurrentp->mPrevp = mCurrentp->mNextp;
01013 mCurrentp->mNextp = mCurrentp->mPrevp->mNextp;
01014 mCurrentp->mPrevp->mNextp = mCurrentp;
01015
01016 if (mCurrentp->mNextp)
01017 {
01018
01019 mCurrentp->mNextp->mPrevp = mCurrentp;
01020 }
01021 else
01022 {
01023 mTail.mPrevp = mCurrentp;
01024 }
01025
01026
01027 mCurrentp = mQueuep;
01028 }
01029 }
01030 }
01031
01032
01033
01034 template <class DATA_TYPE>
01035 void LLDoubleLinkedList<DATA_TYPE>::moveCurrentToFront()
01036 {
01037 if (mCurrentp)
01038 {
01039
01040 if (mCurrentp->mPrevp)
01041 {
01042 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
01043 }
01044 else
01045 {
01046
01047 if (mCurrentp == mQueuep)
01048 {
01049 mCurrentp = mQueuep = NULL;
01050 }
01051 else
01052 {
01053 mCurrentp = mQueuep;
01054 }
01055 return;
01056 }
01057
01058
01059 if (mCurrentp->mNextp)
01060 {
01061 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
01062 }
01063 else
01064 {
01065 mTail.mPrevp = mCurrentp->mPrevp;
01066 }
01067
01068
01069 mCurrentp->mNextp = mHead.mNextp;
01070 mHead.mNextp->mPrevp = mCurrentp;
01071
01072
01073 mCurrentp->mPrevp = NULL;
01074 mHead.mNextp = mCurrentp;
01075
01076
01077 if (mCurrentp == mQueuep)
01078 {
01079 mCurrentp = mQueuep = NULL;
01080 }
01081 else
01082 {
01083 mCurrentp = mQueuep;
01084 }
01085 }
01086
01087 }
01088
01089
01090
01091 template <class DATA_TYPE>
01092 void LLDoubleLinkedList<DATA_TYPE>::moveCurrentToEnd()
01093 {
01094 if (mCurrentp)
01095 {
01096
01097 if (mCurrentp->mNextp)
01098 {
01099 mCurrentp->mNextp->mPrevp = mCurrentp->mPrevp;
01100 }
01101 else
01102 {
01103
01104 if (mCurrentp == mQueuep)
01105 {
01106 mCurrentp = mQueuep = NULL;
01107 }
01108 else
01109 {
01110 mCurrentp = mQueuep;
01111 }
01112 return;
01113 }
01114
01115
01116 if (mCurrentp->mPrevp)
01117 {
01118 mCurrentp->mPrevp->mNextp = mCurrentp->mNextp;
01119 }
01120 else
01121 {
01122 mHead.mNextp = mCurrentp->mNextp;
01123 }
01124
01125
01126 mCurrentp->mPrevp = mTail.mPrevp;
01127 mTail.mPrevp->mNextp = mCurrentp;
01128
01129
01130 mCurrentp->mNextp = NULL;
01131 mTail.mPrevp = mCurrentp;
01132
01133
01134 if (mCurrentp == mQueuep)
01135 {
01136 mCurrentp = mQueuep = NULL;
01137 }
01138 else
01139 {
01140 mCurrentp = mQueuep;
01141 }
01142 }
01143 }
01144
01145
01146 template <class DATA_TYPE>
01147 void LLDoubleLinkedList<DATA_TYPE>::setInsertBefore(BOOL (*insert_before)(DATA_TYPE *first, DATA_TYPE *second) )
01148 {
01149 mInsertBefore = insert_before;
01150 }
01151
01152
01153
01154
01155 template <class DATA_TYPE>
01156 BOOL LLDoubleLinkedList<DATA_TYPE>::addDataSorted(DATA_TYPE *datap)
01157 {
01158
01159 if (!datap)
01160 {
01161 llerror("NULL pointer passed to LLDoubleLinkedList::addDataSorted()", 0);
01162 }
01163
01164
01165 if (!mInsertBefore)
01166 {
01167 addData(datap);
01168 return FALSE;
01169 }
01170
01171
01172 if (!mHead.mNextp)
01173 {
01174 addData(datap);
01175 return TRUE;
01176 }
01177
01178
01179
01180
01181
01182
01183 if (checkData(datap))
01184 {
01185 return FALSE;
01186 }
01187
01188 mCurrentp = mHead.mNextp;
01189 while (mCurrentp)
01190 {
01191
01192 if (datap == mCurrentp->mDatap)
01193 {
01194 return FALSE;
01195 }
01196 else if (mInsertBefore(datap, mCurrentp->mDatap))
01197 {
01198 insertData(datap);
01199 return TRUE;
01200 }
01201 mCurrentp = mCurrentp->mNextp;
01202 }
01203
01204 addDataAtEnd(datap);
01205 return TRUE;
01206 }
01207
01208
01209
01210
01211
01212
01213
01214
01215 template <class DATA_TYPE>
01216 BOOL LLDoubleLinkedList<DATA_TYPE>::bubbleSort()
01217 {
01218 BOOL b_swapped = FALSE;
01219 U32 count = 0;
01220 while (lazyBubbleSort())
01221 {
01222 b_swapped = TRUE;
01223 if (count++ > 0x7FFFFFFF)
01224 {
01225 llwarning("LLDoubleLinkedList::bubbleSort() : too many passes...", 1);
01226 llwarning(" make sure the mInsertBefore(a, b) does not return TRUE for a == b", 1);
01227 break;
01228 }
01229 }
01230 return b_swapped;
01231 }
01232
01233
01234
01235
01236 template <class DATA_TYPE>
01237 BOOL LLDoubleLinkedList<DATA_TYPE>::lazyBubbleSort()
01238 {
01239
01240 if (!mInsertBefore)
01241 {
01242 return FALSE;
01243 }
01244
01245
01246 mCurrentp = mHead.mNextp;
01247 if (!mCurrentp)
01248 {
01249 return FALSE;
01250 }
01251
01252 BOOL b_swapped = FALSE;
01253
01254
01255 S32 length = 0x7FFFFFFF;
01256 S32 count = 0;
01257
01258 while (mCurrentp && mCurrentp->mNextp && count<length)
01259 {
01260 if (mInsertBefore(mCurrentp->mNextp->mDatap, mCurrentp->mDatap))
01261 {
01262 b_swapped = TRUE;
01263 mQueuep = mCurrentp;
01264 swapCurrentWithNext();
01265 }
01266 count++;
01267 mCurrentp = mCurrentp->mNextp;
01268 }
01269
01270 return b_swapped;
01271 }
01272
01273
01274 template <class DATA_TYPE>
01275 BOOL LLDoubleLinkedList<DATA_TYPE>::pushState()
01276 {
01277 if (mStateStackDepth < LLDOUBLE_LINKED_LIST_STATE_STACK_DEPTH)
01278 {
01279 *(mQueuepStack + mStateStackDepth) = mQueuep;
01280 *(mCurrentpStack + mStateStackDepth) = mCurrentp;
01281 mStateStackDepth++;
01282 return TRUE;
01283 }
01284 return FALSE;
01285 }
01286
01287
01288 template <class DATA_TYPE>
01289 BOOL LLDoubleLinkedList<DATA_TYPE>::popState()
01290 {
01291 if (mStateStackDepth > 0)
01292 {
01293 mStateStackDepth--;
01294 mQueuep = *(mQueuepStack + mStateStackDepth);
01295 mCurrentp = *(mCurrentpStack + mStateStackDepth);
01296 return TRUE;
01297 }
01298 return FALSE;
01299 }
01300
01301
01302 template <class DATA_TYPE>
01303 void LLDoubleLinkedList<DATA_TYPE>::clearStateStack()
01304 {
01305 mStateStackDepth = 0;
01306 }
01307
01309
01311
01312
01313
01314 template <class DATA_TYPE>
01315 void LLDoubleLinkedList<DATA_TYPE>::addNode(LLDoubleLinkedNode<DATA_TYPE> *nodep)
01316 {
01317
01318 nodep->mPrevp = NULL;
01319 nodep->mNextp = mHead.mNextp;
01320 mHead.mNextp = nodep;
01321
01322
01323 if (nodep->mNextp)
01324 {
01325 nodep->mNextp->mPrevp = nodep;
01326 }
01327 else
01328 {
01329 mTail.mPrevp = nodep;
01330 }
01331
01332 mCurrentp = mQueuep;
01333 }
01334
01335
01336
01337
01338 template <class DATA_TYPE>
01339 void LLDoubleLinkedList<DATA_TYPE>::addNodeAtEnd(LLDoubleLinkedNode<DATA_TYPE> *node)
01340 {
01341
01342 node->mNextp = NULL;
01343 node->mPrevp = mTail.mPrevp;
01344 mTail.mPrevp = node;
01345
01346
01347 if (node->mPrevp)
01348 {
01349 node->mPrevp->mNextp = node;
01350 }
01351 else
01352 {
01353 mHead.mNextp = node;
01354 }
01355
01356 mCurrentp = mQueuep;
01357 }
01358
01359
01360
01361
01362 template <class DATA_TYPE>
01363 void LLDoubleLinkedList<DATA_TYPE>::scramble()
01364 {
01365 S32 random_number;
01366 DATA_TYPE *datap = getFirstData();
01367 while(datap)
01368 {
01369 random_number = ll_rand(5);
01370
01371 if (0 == random_number)
01372 {
01373 removeCurrentData();
01374 addData(datap);
01375 }
01376 else if (1 == random_number)
01377 {
01378 removeCurrentData();
01379 addDataAtEnd(datap);
01380 }
01381 else if (2 == random_number)
01382 {
01383 swapCurrentWithPrevious();
01384 }
01385 else if (3 == random_number)
01386 {
01387 swapCurrentWithNext();
01388 }
01389 datap = getNextData();
01390 }
01391 mQueuep = mHead.mNextp;
01392 mCurrentp = mQueuep;
01393 }
01394
01395 template <class DATA_TYPE>
01396 BOOL LLDoubleLinkedList<DATA_TYPE>::isEmpty()
01397 {
01398 return (mCount == 0);
01399 }
01400
01401
01402 #endif