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 #include "listt_i.hpp"
00028
00029
00030
00031 VOID _PList::__exchange_p( _PListNode *n1, _PListNode *n2 )
00032 {
00033 VOID *tmp;
00034 __SWAP__( n1->dp, n2->dp, tmp);
00035 }
00036
00037
00038
00039 VOID _PList::_exchange_lp( Lix p1, Lix p2 )
00040 {
00041 if ((p1==0) || (p2==0)) {
00042 LISTERROR("_exchange_lp","null Lix");
00043 return;
00044 }
00045 else if (p1!=p2) {
00046 LISTVERIFY(p1,"_exchange_lp");
00047 LISTVERIFY(p2,"_exchange_lp");
00048 _PListNode* b1 = (_PListNode*) p1;
00049 _PListNode* b2 = (_PListNode*) p2;
00050 _PListNode* t;
00051 if (b1->f == b2) {
00052 if (b2->f == b1) {
00053 __SWAP__(b1->f,b1->b,t);
00054 __SWAP__(b2->f,b2->b,t);
00055 }
00056 else {
00057 b2->f->b=b1;
00058 b1->b->f=b2;
00059 b1->f = b2->f;
00060 b2->b = b1->b;
00061 b1->b = b2;
00062 b2->f = b1;
00063 }
00064 }
00065 else if (b2->f == b1) {
00066 b1->f->b=b2;
00067 b2->b->f=b1;
00068 b2->f = b1->f;
00069 b1->b = b2->b;
00070 b2->b = b1;
00071 b1->f = b2;
00072 }
00073 else {
00074 b1->b->f=b2;
00075 b1->f->b=b2;
00076 b2->b->f=b1;
00077 b2->f->b=b1;
00078 __SWAP__(b1->f,b2->f,t);
00079 __SWAP__(b1->b,b2->b,t);
00080 }
00081 if (h == b1) h = b2;
00082 else if (h == b2) h = b1;
00083 }
00084 }
00085
00086
00087
00088 VOID _PList::_exchange_p( Lix p1, Lix p2 )
00089 {
00090 if ((p1==0) || (p2==0)) {
00091 LISTERROR("_exchange_p","null Lix");
00092 return;
00093 }
00094 else if (p1!=p2) {
00095 LISTVERIFY(p1,"_exchange_p");
00096 LISTVERIFY(p2,"_exchange_p");
00097 __exchange_p((_PListNode*)p1,(_PListNode*)p2);
00098 }
00099 }
00100
00101
00102
00103 Lix _PList::_movebefore_lp(Lix who, Lix where)
00104 {
00105 if ((who==0) || (where==0)) {
00106 LISTERROR("_movebefore_lp","null Lix");
00107 return 0;
00108 }
00109 if (who==where) return who;
00110
00111 __del(who,1);
00112 return __insbefore(where,(_PListNode *)who);
00113 }
00114
00115
00116
00117 Lix _PList::_moveafter_lp(Lix who, Lix where)
00118 {
00119 if ((who==0) || (where==0)) {
00120 LISTERROR("_moveafter_lp","null Lix");
00121 return 0;
00122 }
00123 if (who==where) return who;
00124
00125 __del(who,1);
00126 return __insafter(where,(_PListNode *)who);
00127 }
00128
00129
00130
00131 VOID _PList::_sort( INT(*comparefunc)(const VOID*item1, const VOID*item2), BOOL lpmove )
00132 {
00133 _PListNode *i, *j, *m;
00134 if (!h) return;
00135
00136 i=h;
00137 do {
00138 m=i;
00139 j=i->f;
00140 while (j!=h) { if (comparefunc(j->dp,m->dp)<0) m=j; j=j->f; }
00141 j = i->f;
00142 if (m!=i) {
00143 if (lpmove) _exchange_lp(i,m);
00144 else _exchange_p(i,m);
00145 }
00146 i = j;
00147 } while (i!=h);
00148
00149 }
00150
00151
00152
00153 Lix _PList::_insbefore_d(LIINT i, const VOID* item)
00154 {
00155 return _insbefore_d(LIX_SAFE(i,"_insbefore_d",TRUE),item);
00156 }
00157
00158
00159
00160 Lix _PList::_insbefore_p(LIINT i, VOID* item)
00161 {
00162 return _insbefore_p(LIX_SAFE(i,"_insbefore_p",TRUE),item);
00163 }
00164
00165
00166
00167 Lix _PList::_insbefore_d(LIINT i, const _PList& a)
00168 {
00169 return _insbefore_d(LIX_SAFE(i,"_insbefore_d",TRUE),a);
00170 }
00171
00172
00173
00174 Lix _PList::_insbefore_p(LIINT i, _PList& a)
00175 {
00176 return _insbefore_p(LIX_SAFE(i,"_insbefore_p",TRUE),a);
00177 }
00178
00179
00180
00181 Lix _PList::_insbefore_mv(LIINT i, _PList& a)
00182 {
00183 return _insbefore_mv(LIX_SAFE(i,"_insbefore_mv",TRUE),a);
00184 }
00185
00186
00187
00188 Lix _PList::_insafter_d(LIINT i, const VOID* item)
00189 {
00190 return _insafter_d(LIX_SAFE(i,"_insafter_d",TRUE),item);
00191 }
00192
00193
00194
00195 Lix _PList::_insafter_p(LIINT i, VOID* item)
00196 {
00197 return _insafter_p(LIX_SAFE(i,"_insafter_p",TRUE),item);
00198 }
00199
00200
00201
00202 Lix _PList::_insafter_d(LIINT i, const _PList& a)
00203 {
00204 return _insafter_d(LIX_SAFE(i,"_insafter_d",TRUE),a);
00205 }
00206
00207
00208
00209 Lix _PList::_insafter_p(LIINT i, _PList& a)
00210 {
00211 return _insafter_p(LIX_SAFE(i,"_insafter_p",TRUE),a);
00212 }
00213
00214
00215
00216 Lix _PList::_insafter_mv(LIINT i, _PList& a)
00217 {
00218 return _insafter_mv(LIX_SAFE(i,"_insafter_mv",TRUE),a);
00219 }
00220
00221
00222
00223 VOID _PList::_del(LIINT i, BOOL cdata)
00224 {
00225 _del(LIX_SAFE(i,"_del",FALSE),cdata);
00226 }
00227
00228
00229
00230 VOID _PList::_delprev(LIINT i, BOOL cdata)
00231 {
00232 _delprev(LIX_SAFE(i,"_delprev",FALSE),cdata);
00233 }
00234
00235
00236
00237 VOID _PList::_delnext(LIINT i, BOOL cdata)
00238 {
00239 _delnext(LIX_SAFE(i,"_delnext",FALSE),cdata);
00240 }
00241
00242
00243
00244 const VOID* _PList::_item(LIINT i) const
00245 {
00246 return ((_PListNode*)LIX_SAFE(i,"_item",FALSE))->dp;
00247 }
00248
00249
00250
00251 VOID _PList::_exchange_lp( LIINT i1, LIINT i2 )
00252 {
00253 _exchange_lp(LIX_SAFE(i1,"_exchange_lp",FALSE),LIX_SAFE(i2,"_exchange_lp",FALSE));
00254 }
00255
00256
00257
00258 VOID _PList::_exchange_p( LIINT i1, LIINT i2 )
00259 {
00260 _exchange_p(LIX_SAFE(i1,"_exchange_p",FALSE),LIX_SAFE(i2,"_exchange_p",FALSE));
00261 }
00262
00263
00264
00265 Lix _PList::_moveafter_lp( LIINT i1, LIINT i2 )
00266 {
00267 return _moveafter_lp(LIX_SAFE(i1,"_moveafter_lp",FALSE),LIX_SAFE(i2,"_moveafter_lp",FALSE));
00268 }
00269
00270
00271
00272 Lix _PList::_movebefore_lp( LIINT i1, LIINT i2 )
00273 {
00274 return _movebefore_lp(LIX_SAFE(i1,"_movebefore_lp",FALSE),LIX_SAFE(i2,"_movebefore_lp",FALSE));
00275 }
00276
00277