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
00052
00053
00054
00055
00056 #ifndef cxx_base_INCLUDED
00057 #define cxx_base_INCLUDED
00058
00059 #include "errors.h"
00060
00061 #ifdef _KEEP_RCS_ID
00062 static char *cxx_basercs_id = "$Source: /scratch/mee/2.4-65/kpro64-pending/be/com/SCCS/s.cxx_base.h $ $Revision: 1.2 $";
00063 #endif
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
00377
00378
00379
00380
00381
00382 class SLIST_NODE {
00383 friend class SLIST;
00384 friend class SLIST_ITER;
00385 private:
00386 SLIST_NODE *_next;
00387
00388 SLIST_NODE& operator= (const SLIST_NODE& sl);
00389 SLIST_NODE(const SLIST_NODE&);
00390
00391 protected:
00392 SLIST_NODE(void) { _next = NULL; }
00393 ~SLIST_NODE(void) {}
00394
00395 void Insert_After(SLIST_NODE *nd) { nd->_next = _next; _next = nd; }
00396 SLIST_NODE *Insert_Before(SLIST_NODE *nd) { nd->_next = this; return nd; }
00397 SLIST_NODE *Remove(SLIST_NODE *prev);
00398 void Set_Next(SLIST_NODE *n) { _next = n; }
00399 INT32 Len(void) const;
00400 INT Pos(SLIST_NODE *) const;
00401 public:
00402 SLIST_NODE *Next(void) const { return _next;}
00403 };
00404
00405 class SLIST {
00406 private:
00407 SLIST_NODE *_head;
00408 SLIST_NODE *_tail;
00409
00410 SLIST& operator= (const SLIST& sl);
00411 SLIST(const SLIST&);
00412
00413 protected:
00414 SLIST(void) { _head = _tail = NULL; }
00415 public:
00416 SLIST(SLIST_NODE *list);
00417 ~SLIST(void) {}
00418
00419 void Set_Head(SLIST_NODE *h) { _head = h; }
00420 void Set_Tail(SLIST_NODE *t) { _tail = t; }
00421
00422 void Init(SLIST_NODE *list);
00423 void Init_Head(SLIST_NODE *list) { _head = list; _tail = NULL; }
00424 void Clear(void) { _head = _tail = NULL; }
00425
00426 BOOL Append( SLIST_NODE *nd, SLIST_NODE *od);
00427 BOOL Prepend( SLIST_NODE *nd, SLIST_NODE *od );
00428 void Append_List(SLIST *new_list);
00429 void Prepend_List(SLIST *new_list);
00430 SLIST_NODE *Remove_Headnode(void);
00431 SLIST_NODE *Remove(SLIST_NODE *prev, SLIST_NODE *cur);
00432 void Remove_node(SLIST_NODE *slist_node);
00433
00434 SLIST_NODE *Head(void) { return _head; }
00435 const SLIST_NODE *Head(void) const { return _head; }
00436 SLIST_NODE *Tail(void) { return _tail; }
00437 const SLIST_NODE *Tail(void) const { return _tail; }
00438 BOOL Is_Empty(void) const { return _head == NULL; }
00439 INT32 Len(void) const;
00440 INT Pos(SLIST_NODE *nd) const { return _head->Pos(nd); }
00441
00442 void Append( SLIST_NODE *nd )
00443 {
00444 if (nd == NULL) return;
00445 if (_head == NULL)
00446 _head = _tail = nd;
00447 else {
00448 _tail->Insert_After(nd);
00449 _tail = _tail->Next();
00450 }
00451 }
00452
00453 void Prepend( SLIST_NODE *nd )
00454 {
00455 if (nd == NULL) return;
00456
00457 if (_head == NULL)
00458 _head = _tail = nd;
00459 else {
00460 _head = _head->Insert_Before(nd);
00461 }
00462 }
00463
00464 };
00465
00466 class SLIST_ITER {
00467 private:
00468 SLIST_NODE *_head;
00469 SLIST_NODE *_cur;
00470 mINT16 _len;
00471 mINT16 _idx;
00472
00473 SLIST_ITER& operator= (const SLIST_ITER& sl);
00474 SLIST_ITER(const SLIST_ITER&);
00475
00476 protected:
00477 SLIST_ITER(void) { _head = NULL; _cur = NULL; _len = -1; _idx = -1;}
00478 void Set_Cur(SLIST_NODE* cur) { _cur = cur;}
00479 void Set_Idx(mINT16 idx) {_idx = idx;}
00480
00481 public:
00482 SLIST_ITER(SLIST_NODE *nd)
00483 { _head = nd; _cur = _head; _len = -1; _idx = -1; }
00484 SLIST_ITER(SLIST *sl)
00485 { _head=sl->Head(); _cur=_head; _len=-1; _idx=-1; }
00486 ~SLIST_ITER(void) {}
00487
00488 void Init(SLIST_NODE *nd) { _head = nd; _cur = _head;}
00489 void Init(SLIST *sl) { _head = (sl ? sl->Head() : NULL);
00490 _cur = _head;}
00491 void Init(void) { _head = NULL; _cur = _head;}
00492 void Clear(void) { _head = NULL; _cur = NULL; _len = -1; _idx = -1;}
00493 void Set(SLIST_NODE *nd) {_cur = nd; _idx = -1;}
00494 SLIST_NODE *First(void) {
00495 if (this == NULL)
00496 return NULL;
00497 if (_head)
00498 _cur = _head;
00499 else
00500 _cur = NULL;
00501 _idx = 0;
00502 return _cur;
00503 }
00504 SLIST_NODE *Next(void) {
00505 if (this == NULL)
00506 return NULL;
00507 if (_cur != NULL) {
00508 _cur = _cur->Next();
00509 _idx++;
00510 }
00511 return _cur;
00512 }
00513 SLIST_NODE *Nth(INT n);
00514
00515 SLIST_NODE *Peek_Next(void) const {return _cur->Next();}
00516 SLIST_NODE *Head(void) const {return _head;}
00517 SLIST_NODE *Cur(void) const {return _cur;}
00518 INT Idx(void) const {return _idx;}
00519 INT32 Len(void);
00520 BOOL Is_Empty(void) const { return _cur == NULL; }
00521 };
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532 #define DECLARE_SLIST_NODE_CLASS( NAME_NODE ) \
00533 \
00534 public: \
00535 NAME_NODE *Next(void) { \
00536 return (NAME_NODE *) SLIST_NODE::Next(); \
00537 } \
00538 const NAME_NODE *Next(void) const { \
00539 return (NAME_NODE *) SLIST_NODE::Next(); \
00540 } \
00541 void Insert_After(NAME_NODE *nd) { \
00542 SLIST_NODE::Insert_After(nd); \
00543 } \
00544 void Insert_Before(NAME_NODE *nd) { \
00545 SLIST_NODE::Insert_Before(nd); \
00546 } \
00547 NAME_NODE *Remove(NAME_NODE *prev) { \
00548 return (NAME_NODE*) SLIST_NODE::Remove(prev); \
00549 } \
00550 void Set_Next(NAME_NODE *nd) { \
00551 SLIST_NODE::Set_Next(nd); \
00552 } \
00553 INT32 Len(void) const { return SLIST_NODE::Len(); } \
00554 INT Pos(NAME_NODE *od) { return SLIST_NODE::Pos(od); } \
00555
00556
00557
00558
00559
00560
00561
00562
00563 #define DECLARE_SLIST_CLASS( NAME_LIST, NAME_NODE) \
00564 public: \
00565 typedef NAME_NODE CONTAINER_NODE; \
00566 NAME_LIST(NAME_NODE *nd) { SLIST::Init(nd); } \
00567 NAME_LIST() : SLIST() {} \
00568 void Append(NAME_NODE *nd) { SLIST::Append(nd); } \
00569 BOOL Append(NAME_NODE *nd, NAME_NODE *od) { \
00570 return SLIST::Append(nd, od); \
00571 } \
00572 void Prepend(NAME_NODE *nd) { SLIST::Prepend(nd); } \
00573 BOOL Prepend(NAME_NODE *nd, NAME_NODE *od) { \
00574 return SLIST::Prepend(nd, od); \
00575 } \
00576 void Append_List(NAME_LIST *nl) { SLIST::Append_List(nl); } \
00577 void Prepend_List(NAME_LIST *nl) { SLIST::Prepend_List(nl); } \
00578 NAME_NODE *Remove_Headnode(void) { \
00579 return (NAME_NODE*) SLIST::Remove_Headnode(); \
00580 } \
00581 NAME_NODE *Remove(NAME_NODE *prev, NAME_NODE *cur) { \
00582 return (NAME_NODE*) SLIST::Remove(prev, cur); \
00583 } \
00584 NAME_NODE *Head(void) { return (NAME_NODE *) SLIST::Head(); } \
00585 const NAME_NODE *Head(void) const \
00586 { return (const NAME_NODE *) SLIST::Head(); } \
00587 NAME_NODE *Tail(void) { return (NAME_NODE *) SLIST::Tail(); } \
00588 const NAME_NODE *Tail(void) const \
00589 { return (const NAME_NODE *) SLIST::Tail(); } \
00590 BOOL Is_Empty(void) const { return SLIST::Is_Empty(); } \
00591 INT32 Len(void) const { return SLIST::Len(); } \
00592 INT Pos(NAME_NODE *od) { return SLIST::Pos(od); } \
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 #define DECLARE_SLIST_ITER_CLASS( NAME_ITER, NAME_NODE, NAME_LIST) \
00603 public: \
00604 NAME_ITER(NAME_NODE *nd) { SLIST_ITER::Init(nd); } \
00605 NAME_ITER(NAME_LIST *nl) { SLIST_ITER::Init(nl); } \
00606 NAME_ITER(void) { SLIST_ITER::Init(); } \
00607 void Init(NAME_NODE *nd) { SLIST_ITER::Init(nd); } \
00608 void Init(NAME_LIST *nl) { SLIST_ITER::Init(nl); } \
00609 void Set(NAME_NODE *nd) { SLIST_ITER::Set(nd); } \
00610 NAME_NODE *First(void) { return (NAME_NODE *) SLIST_ITER::First(); } \
00611 NAME_NODE *Next(void) { return (NAME_NODE *) SLIST_ITER::Next(); } \
00612 NAME_NODE *Nth(INT n) { return (NAME_NODE *) SLIST_ITER::Nth(n); } \
00613 NAME_NODE *Peek_Next(void) { return (NAME_NODE *) SLIST_ITER::Peek_Next(); }\
00614 NAME_NODE *Head(void) { return (NAME_NODE *) SLIST_ITER::Head(); } \
00615 NAME_NODE *Cur(void) { return (NAME_NODE *) SLIST_ITER::Cur(); } \
00616 BOOL Is_Empty(void) { return SLIST_ITER::Is_Empty(); } \
00617
00618 #define DECLARE_SLIST_CONST_ITER_CLASS( NAME_ITER, NAME_NODE, NAME_LIST) \
00619 public: \
00620 NAME_ITER(const NAME_NODE *nd) { SLIST_ITER::Init((NAME_NODE*)nd); } \
00621 NAME_ITER(const NAME_LIST *nl) { SLIST_ITER::Init((NAME_LIST*)nl); } \
00622 NAME_ITER(void) { SLIST_ITER::Init(); } \
00623 void Init(NAME_NODE *nd) { SLIST_ITER::Init(nd); } \
00624 void Init(NAME_LIST *nl) { SLIST_ITER::Init(nl); } \
00625 void Set(NAME_NODE *nd) { SLIST_ITER::Set(nd); } \
00626 const NAME_NODE *First(void) { return (NAME_NODE *) SLIST_ITER::First(); } \
00627 const NAME_NODE *Next(void) { return (NAME_NODE *) SLIST_ITER::Next(); } \
00628 const NAME_NODE *Nth(INT n) { return (NAME_NODE *) SLIST_ITER::Nth(n); } \
00629 const NAME_NODE *Peek_Next(void) { return (NAME_NODE *) SLIST_ITER::Peek_Next(); } \
00630 const NAME_NODE *Head(void) { return (NAME_NODE *) SLIST_ITER::Head(); } \
00631 const NAME_NODE *Cur(void) { return (NAME_NODE *) SLIST_ITER::Cur(); } \
00632 BOOL Is_Empty(void) { return SLIST_ITER::Is_Empty(); } \
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
00674
00675
00676
00677
00678
00679 class CHAIN_NODE {
00680 friend class CHAIN;
00681 friend class CHAIN_ITER;
00682 private:
00683 CHAIN_NODE *_next;
00684 CHAIN_NODE *_prev;
00685
00686 CHAIN_NODE& operator= (const CHAIN_NODE& sl);
00687 CHAIN_NODE(const CHAIN_NODE&);
00688
00689 protected:
00690 CHAIN_NODE(void) { _next = _prev = NULL; }
00691 ~CHAIN_NODE(void) {}
00692
00693 CHAIN_NODE *Insert_After(CHAIN_NODE *nd);
00694 CHAIN_NODE *Insert_Before(CHAIN_NODE *nd);
00695 CHAIN_NODE *Remove(void);
00696
00697 CHAIN_NODE *Next(void) { return _next;}
00698 const CHAIN_NODE *Next(void) const { return _next;}
00699 CHAIN_NODE *Prev(void) { return _prev;}
00700 const CHAIN_NODE *Prev(void) const { return _prev;}
00701 void Set_Next(CHAIN_NODE *n) { _next = n; }
00702 void Set_Prev(CHAIN_NODE *n) { _prev = n; }
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
00793
00794
00795
00796
00797
00798 class CHAIN {
00799 private:
00800 CHAIN_NODE *_head;
00801 CHAIN_NODE *_tail;
00802
00803 CHAIN& operator= (const CHAIN& sl);
00804 CHAIN(const CHAIN&);
00805
00806 protected:
00807 CHAIN(void) { _head = _tail = NULL; }
00808
00809 public:
00810 CHAIN(CHAIN_NODE *nd) { _head = _tail = nd; }
00811 ~CHAIN(void) {}
00812
00813
00814 void Init(void) { _head = _tail = NULL; }
00815 void Init(CHAIN_NODE *nd) { _head = _tail = nd; }
00816 void Init(CHAIN *list)
00817 { _head = list->Head(); _tail = list->Tail();}
00818 void Clear(void) { _head = _tail = NULL; }
00819
00820 void Append( CHAIN_NODE *nd );
00821 void Prepend( CHAIN_NODE *nd );
00822 void Insert_After(CHAIN_NODE *nd, CHAIN_NODE *after_nd);
00823 void Insert_Before(CHAIN_NODE *nd, CHAIN_NODE *before_nd);
00824 BOOL Is_Member(CHAIN_NODE *nd) const;
00825
00826 void Append_List(CHAIN *new_list);
00827 void Prepend_List(CHAIN *new_list);
00828 void Remove(CHAIN_NODE *);
00829 CHAIN_NODE *Remove_Head(void);
00830 CHAIN_NODE *Remove_Tail(void);
00831
00832 CHAIN_NODE *Head(void) { return _head; }
00833 const CHAIN_NODE *Head(void) const { return _head; }
00834 CHAIN_NODE *Tail(void) { return _tail; }
00835 const CHAIN_NODE *Tail(void) const { return _tail; }
00836 BOOL Is_Empty(void) const { return _head == NULL; }
00837 INT32 Len(void) const;
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
00937
00938
00939
00940
00941
00942 class CHAIN_ITER {
00943 private:
00944 CHAIN_NODE *_cur;
00945 CHAIN *_list;
00946 mINT16 _len;
00947 mINT16 _idx;
00948
00949 CHAIN_ITER& operator= (const CHAIN_ITER& sl);
00950 CHAIN_ITER(const CHAIN_ITER&);
00951
00952 protected:
00953 CHAIN_ITER(void) { _list = NULL; _cur = NULL; _len = -1; _idx = -1;}
00954 void Set_Cur(CHAIN_NODE *cur) { _cur = cur; }
00955
00956 public:
00957 CHAIN_ITER(CHAIN *sl)
00958 { _list = sl; _cur=_list->Head();
00959 _len = -1; _idx = -1; }
00960 ~CHAIN_ITER(void) {}
00961
00962 void Init(CHAIN *sl) { _list = sl; _len=_idx=-1; _cur=_list->Head();}
00963 void Clear(void) { _list = NULL; _cur = NULL; _len = -1; _idx = -1;}
00964 CHAIN_NODE *First(void);
00965 CHAIN_NODE *Last(void);
00966 CHAIN_NODE *Next(void);
00967 CHAIN_NODE *Prev(void);
00968 CHAIN_NODE *Nth(INT n);
00969 CHAIN_NODE *Last_Nth(INT n);
00970
00971 CHAIN *List(void) {return _list;}
00972 CHAIN_NODE *Peek_Next(void) {return _cur->Next();}
00973 CHAIN_NODE *Cur(void) {return _cur;}
00974 INT Idx(void) {return _idx;}
00975 INT32 Len(void);
00976 BOOL Is_Empty(void) { return _cur == NULL; }
00977 BOOL Is_Empty_Reverse(void){ return _cur == NULL; }
00978 };
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989 #define DECLARE_CHAIN_NODE_CLASS( NAME_NODE ) \
00990 public: \
00991 NAME_NODE *Next(void) \
00992 {return (NAME_NODE *)CHAIN_NODE::Next();} \
00993 NAME_NODE *Prev(void) \
00994 {return (NAME_NODE *)CHAIN_NODE::Prev();} \
00995 const NAME_NODE *Next(void) const \
00996 {return (const NAME_NODE *)CHAIN_NODE::Next();} \
00997 const NAME_NODE *Prev(void) const \
00998 {return (const NAME_NODE *)CHAIN_NODE::Prev();} \
00999 NAME_NODE *Insert_Before(NAME_NODE *nd) { \
01000 return (NAME_NODE*) CHAIN_NODE::Insert_Before(nd); \
01001 } \
01002 NAME_NODE *Insert_After(NAME_NODE *nd) { \
01003 return (NAME_NODE*) CHAIN_NODE::Insert_After(nd); \
01004 } \
01005 NAME_NODE *Remove() { \
01006 return (NAME_NODE*) CHAIN_NODE::Remove(); \
01007 } \
01008
01009
01010
01011
01012
01013
01014
01015
01016 #define DECLARE_CHAIN_CLASS( NAME_LIST, NAME_NODE) \
01017 public: \
01018 NAME_LIST(NAME_NODE *nd) { CHAIN::Init((CHAIN_NODE*)nd); } \
01019 NAME_LIST(void) { CHAIN::Init(); } \
01020 void Clear() {CHAIN::Clear();} \
01021 void Append(NAME_NODE* nd) {CHAIN::Append((CHAIN_NODE*)nd);} \
01022 void Prepend(NAME_NODE* nd) {CHAIN::Prepend((CHAIN_NODE*)nd);}\
01023 void Insert_After(NAME_NODE* a, NAME_NODE* b) \
01024 {CHAIN::Insert_After((CHAIN_NODE*)a,(CHAIN_NODE*)b);} \
01025 void Insert_Before(NAME_NODE* a, NAME_NODE* b) \
01026 {CHAIN::Insert_Before((CHAIN_NODE*)a,(CHAIN_NODE*)b);} \
01027 void Append_List(NAME_LIST* l) {CHAIN::Append_List(l);} \
01028 void Prepend_List(NAME_LIST* l) {CHAIN::Prepend_List(l);} \
01029 \
01030 BOOL Is_Member(NAME_NODE *nd) const { return CHAIN::Is_Member((CHAIN_NODE*)nd); } \
01031 NAME_NODE *Head(void) { return (NAME_NODE *) CHAIN::Head(); } \
01032 const NAME_NODE *Head(void) const \
01033 { return (const NAME_NODE *) CHAIN::Head(); } \
01034 NAME_NODE *Tail(void) { return (NAME_NODE *) CHAIN::Tail(); } \
01035 const NAME_NODE *Tail(void) const \
01036 { return (const NAME_NODE *) CHAIN::Tail(); } \
01037 void Remove(NAME_NODE *nd) { \
01038 CHAIN::Remove((CHAIN_NODE*)nd); \
01039 } \
01040 NAME_NODE *Remove_Head(void) { \
01041 return (NAME_NODE*) CHAIN::Remove_Head(); \
01042 } \
01043 NAME_NODE *Remove_Tail(void) { \
01044 return (NAME_NODE*) CHAIN::Remove_Tail(); \
01045 } \
01046 BOOL Is_Empty(void) const { return CHAIN::Is_Empty(); } \
01047 BOOL Is_Empty_Reverse(void) const { return CHAIN::Is_Empty(); } \
01048 INT32 Len(void) const { return CHAIN::Len(); } \
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058 #define DECLARE_CHAIN_ITER_CLASS( NAME_ITER, NAME_NODE, NAME_LIST) \
01059 public: \
01060 NAME_ITER(NAME_LIST *nl) { CHAIN_ITER::Init(nl); } \
01061 NAME_NODE *First(void) { return (NAME_NODE *) CHAIN_ITER::First(); } \
01062 NAME_NODE *Last(void) { return (NAME_NODE *) CHAIN_ITER::Last(); } \
01063 NAME_NODE *Next(void) { return (NAME_NODE *) CHAIN_ITER::Next(); } \
01064 NAME_NODE *Prev(void) { return (NAME_NODE *) CHAIN_ITER::Prev(); } \
01065 NAME_NODE *List(void) { return (NAME_NODE *) CHAIN_ITER::List(); } \
01066 NAME_NODE *Nth(INT n) { return (NAME_NODE *) CHAIN_ITER::Nth(n); } \
01067 NAME_NODE *Last_Nth(INT n) \
01068 { return (NAME_NODE *) CHAIN_ITER::Last_Nth(n); } \
01069 NAME_NODE *Peek_Next(void) { return (NAME_NODE *) CHAIN_ITER::Peek_Next(); }\
01070 NAME_NODE *Head(void) { return (NAME_NODE *) CHAIN_ITER::List(); } \
01071 NAME_NODE *Cur(void) { return (NAME_NODE *) CHAIN_ITER::Cur(); } \
01072 BOOL Is_Empty(void) { return CHAIN_ITER::Is_Empty(); } \
01073 BOOL Is_Empty_Reverse(void) { return CHAIN_ITER::Is_Empty(); } \
01074
01075
01076 #define DECLARE_CHAIN_CONST_ITER_CLASS( NAME_ITER, NAME_NODE, NAME_LIST) \
01077 public: \
01078 NAME_ITER(const NAME_LIST *nl) \
01079 { CHAIN_ITER::Init((NAME_LIST *)nl); } \
01080 const NAME_NODE *First(void) \
01081 { return (const NAME_NODE *) CHAIN_ITER::First(); } \
01082 const NAME_NODE *Last(void) \
01083 { return (const NAME_NODE *) CHAIN_ITER::Last(); } \
01084 const NAME_NODE *Next(void) \
01085 { return (const NAME_NODE *) CHAIN_ITER::Next(); } \
01086 const NAME_NODE *Prev(void) \
01087 { return (const NAME_NODE *) CHAIN_ITER::Prev(); } \
01088 const NAME_NODE *List(void) \
01089 { return (const NAME_NODE *) CHAIN_ITER::List(); } \
01090 const NAME_NODE *Nth(INT n) \
01091 { return (const NAME_NODE *) CHAIN_ITER::Nth(n); } \
01092 const NAME_NODE *Last_Nth(INT n) \
01093 { return (const NAME_NODE *) CHAIN_ITER::Last_Nth(n); } \
01094 const NAME_NODE *Peek_Next(void) \
01095 { return (const NAME_NODE *) CHAIN_ITER::Peek_Next(); } \
01096 const NAME_NODE *Head(void) \
01097 { return (const NAME_NODE *) CHAIN_ITER::List(); } \
01098 const NAME_NODE *Cur(void) \
01099 { return (const NAME_NODE *) CHAIN_ITER::Cur(); } \
01100 BOOL Is_Empty(void) { return CHAIN_ITER::Is_Empty(); } \
01101 BOOL Is_Empty_Reverse(void) { return CHAIN_ITER::Is_Empty(); } \
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
01146
01147
01148
01149
01150
01151 class CLIST_NODE {
01152 friend class CLIST;
01153 friend class CLIST_ITER;
01154 private:
01155 CLIST_NODE *_next;
01156
01157 CLIST_NODE& operator= (const CLIST_NODE& cl);
01158 CLIST_NODE(const CLIST_NODE&);
01159
01160
01161 CLIST_NODE *Find_Next( void ) const;
01162
01163 protected:
01164 CLIST_NODE(void) { _next = this; }
01165 ~CLIST_NODE(void) { _next = NULL; }
01166
01167 void Insert_After(CLIST_NODE *nd) { nd->_next = _next; _next = nd; }
01168 CLIST_NODE *Insert_Before(CLIST_NODE *nd);
01169 CLIST_NODE *Remove(CLIST_NODE *prev);
01170
01171 CLIST_NODE *Next(void) const { return _next;}
01172 void Set_Next(CLIST_NODE *n) { _next = n; }
01173 INT32 Len(void) const;
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
01241
01242
01243
01244
01245
01246 class CLIST {
01247 private:
01248 CLIST_NODE *_head;
01249 CLIST_NODE *_tail;
01250
01251 CLIST& operator = (const CLIST& cl);
01252 CLIST(const CLIST&);
01253
01254 protected:
01255 CLIST(void) { _head = _tail = NULL; }
01256
01257 public:
01258 void Init(CLIST_NODE *list);
01259 CLIST(CLIST_NODE *list) { Init(list); }
01260 ~CLIST(void) { _head = _tail = NULL; }
01261
01262 void Clear(void) { _head = _tail = NULL; }
01263
01264 void Append( CLIST_NODE *nd );
01265 BOOL Append( CLIST_NODE *nd, CLIST_NODE *od);
01266 void Prepend( CLIST_NODE *nd );
01267 BOOL Prepend( CLIST_NODE *nd, CLIST_NODE *od );
01268
01269 void Append_List(CLIST *new_list);
01270 void Prepend_List(CLIST *new_list);
01271 CLIST_NODE *Remove_Headnode(void);
01272
01273 CLIST_NODE *Head(void) const { return _head; }
01274 CLIST_NODE *Tail(void) const { return _tail; }
01275 BOOL Is_Empty(void) const { return _head == NULL; }
01276 INT32 Len(void) const;
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
01354
01355
01356
01357
01358
01359 class CLIST_ITER {
01360 private:
01361 CLIST_NODE *_head;
01362 CLIST_NODE *_cur;
01363 BOOL _saw_head;
01364
01365 CLIST_ITER& operator= (const CLIST_ITER& cl);
01366 CLIST_ITER(const CLIST_ITER&);
01367
01368 protected:
01369 CLIST_ITER(void) { _head = NULL;
01370 _cur = NULL;
01371 _saw_head = FALSE;
01372 }
01373
01374 public:
01375 CLIST_ITER(CLIST_NODE *nd) { _head = nd;
01376 _cur = _head;
01377 _saw_head = FALSE;
01378 }
01379 CLIST_ITER(CLIST *cl) { _head = cl->Head();
01380 _cur = _head;
01381 _saw_head = FALSE;
01382 }
01383 ~CLIST_ITER(void) { _head = NULL;
01384 _cur = NULL;
01385 _saw_head = FALSE;
01386 }
01387
01388 void Init(CLIST_NODE *nd)
01389 { _head = nd;
01390 _cur = _head;
01391 _saw_head = FALSE;
01392 }
01393 void Init(CLIST *cl) { _head = cl->Head();
01394 _cur = _head;
01395 _saw_head = FALSE;
01396 }
01397 void Init(void) { _head = NULL;
01398 _cur = NULL;
01399 _saw_head = FALSE;
01400 }
01401
01402 void Clear(void) { Init(); }
01403 void Set(CLIST_NODE *nd) {_cur = nd; }
01404 CLIST_NODE *First(void);
01405 CLIST_NODE *Next(void);
01406
01407 CLIST_NODE *Peek_Next(void) const {return _cur->Next();}
01408 CLIST_NODE *Head(void) const {return _head;}
01409 CLIST_NODE *Cur(void) const {return _cur;}
01410 BOOL Saw_Head(void) const {return _saw_head;}
01411 INT32 Len(void) const;
01412
01413
01414 BOOL Is_Empty(void){ return ( _cur == NULL ||
01415 (_cur == _head && _saw_head) );
01416 }
01417 };
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428 #define DECLARE_CLIST_NODE_CLASS( NAME_LIST ) \
01429 \
01430 public: \
01431 NAME_LIST *Next(void) {return (NAME_LIST *) CLIST_NODE::Next();} \
01432 void Insert_After(NAME_LIST *nd) { \
01433 CLIST_NODE::Insert_After(nd); \
01434 } \
01435 void Insert_Before(NAME_LIST *nd) { \
01436 CLIST_NODE::Insert_Before(nd); \
01437 } \
01438 NAME_NODE* Remove(NAME_LIST *prev) { \
01439 return (NAME_NODE*)CLIST_NODE::Remove(prev); \
01440 } \
01441 void Set_Next(NAME_LIST *nd) { \
01442 CLIST_NODE::Set_Next(nd); \
01443 } \
01444 INT32 Len(void) { return CLIST_NODE::Len(); } \
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454 #define DECLARE_CLIST_CLASS( NAME_LIST, NAME_NODE) \
01455 public: \
01456 NAME_LIST(NAME_NODE *nd) { CLIST::Init(nd); } \
01457 void Append(NAME_NODE *nd) { CLIST::Append(nd); } \
01458 void Append(NAME_NODE *nd, NAME_NODE *od) { \
01459 CLIST::Append(nd, od); \
01460 } \
01461 void Prepend(NAME_NODE *nd) { CLIST::Prepend(nd); } \
01462 void Prepend(NAME_NODE *nd, NAME_NODE *od) { \
01463 CLIST::Prepend(nd, od); \
01464 } \
01465 void Append_List(NAME_LIST *nl) { CLIST::Append_List(nl); } \
01466 void Prepend_List(NAME_LIST *nl) { CLIST::Prepend_List(nl); } \
01467 NAME_NODE *Remove_Headnode(void) { \
01468 return (NAME_NODE*)CLIST::Remove_Headnode(); \
01469 } \
01470 NAME_NODE *Head(void) { return (NAME_NODE *) CLIST::Head(); } \
01471 NAME_NODE *Tail(void) { return (NAME_NODE *) CLIST::Tail(); } \
01472 BOOL Is_Empty(void) const { return CLIST::Is_Empty(); } \
01473 INT32 Len(void) const { return CLIST::Len(); } \
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484 #define DECLARE_CLIST_ITER_CLASS( NAME_ITER, NAME_NODE, NAME_LIST) \
01485 public: \
01486 NAME_ITER(NAME_NODE *nd) { CLIST_ITER::Init(nd); } \
01487 NAME_ITER(NAME_LIST *nl) { CLIST_ITER::Init(nl); } \
01488 NAME_ITER(void) { CLIST_ITER::Init(); } \
01489 void Init(NAME_NODE *nd) { CLIST_ITER::Init(nd); } \
01490 void Init(NAME_LIST *nl) { CLIST_ITER::Init(nl); } \
01491 void Set(NAME_NODE *nd) { CLIST_ITER::Set(nd); } \
01492 NAME_NODE *First(void) { return (NAME_NODE *) CLIST_ITER::First(); } \
01493 NAME_NODE *Next(void) { return (NAME_NODE *) CLIST_ITER::Next(); } \
01494 NAME_NODE *Peek_Next(void){ return (NAME_NODE *) CLIST_ITER::Peek_Next(); }\
01495 NAME_NODE *Head(void) { return (NAME_NODE *) CLIST_ITER::Head(); } \
01496 NAME_NODE *Cur(void) { return (NAME_NODE *) CLIST_ITER::Cur(); } \
01497 BOOL Saw_Head(void) { return CLIST_ITER::Saw_Head(); } \
01498
01499
01500
01501 #endif // cxx_base_INCLUDED
01502