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