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
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #include "TList.h"
00070 #include "TClass.h"
00071
00072 #include <string>
00073 namespace std {} using namespace std;
00074
00075 ClassImp(TList)
00076
00077
00078 TList::~TList()
00079 {
00080
00081
00082
00083 Clear();
00084 }
00085
00086
00087 void TList::AddFirst(TObject *obj)
00088 {
00089
00090
00091 if (IsArgNull("AddFirst", obj)) return;
00092
00093 if (!fFirst) {
00094 fFirst = NewLink(obj);
00095 fLast = fFirst;
00096 } else {
00097 TObjLink *t = NewLink(obj);
00098 t->fNext = fFirst;
00099 fFirst->fPrev = t;
00100 fFirst = t;
00101 }
00102 fSize++;
00103 Changed();
00104 }
00105
00106
00107 void TList::AddFirst(TObject *obj, Option_t *opt)
00108 {
00109
00110
00111
00112
00113
00114
00115 if (IsArgNull("AddFirst", obj)) return;
00116
00117 if (!fFirst) {
00118 fFirst = NewOptLink(obj, opt);
00119 fLast = fFirst;
00120 } else {
00121 TObjLink *t = NewOptLink(obj, opt);
00122 t->fNext = fFirst;
00123 fFirst->fPrev = t;
00124 fFirst = t;
00125 }
00126 fSize++;
00127 Changed();
00128 }
00129
00130
00131 void TList::AddLast(TObject *obj)
00132 {
00133
00134
00135 if (IsArgNull("AddLast", obj)) return;
00136
00137 if (!fFirst) {
00138 fFirst = NewLink(obj);
00139 fLast = fFirst;
00140 } else
00141 fLast = NewLink(obj, fLast);
00142 fSize++;
00143 Changed();
00144 }
00145
00146
00147 void TList::AddLast(TObject *obj, Option_t *opt)
00148 {
00149
00150
00151
00152
00153
00154
00155 if (IsArgNull("AddLast", obj)) return;
00156
00157 if (!fFirst) {
00158 fFirst = NewOptLink(obj, opt);
00159 fLast = fFirst;
00160 } else
00161 fLast = NewOptLink(obj, opt, fLast);
00162 fSize++;
00163 Changed();
00164 }
00165
00166
00167 void TList::AddBefore(const TObject *before, TObject *obj)
00168 {
00169
00170
00171 if (IsArgNull("AddBefore", obj)) return;
00172
00173 if (!before)
00174 TList::AddFirst(obj);
00175 else {
00176 Int_t idx;
00177 TObjLink *t = FindLink(before, idx);
00178 if (!t) {
00179 Error("AddBefore", "before not found, object not added");
00180 return;
00181 }
00182 if (t == fFirst)
00183 TList::AddFirst(obj);
00184 else {
00185 NewLink(obj, t->Prev());
00186 fSize++;
00187 Changed();
00188 }
00189 }
00190 }
00191
00192
00193 void TList::AddBefore(TObjLink *before, TObject *obj)
00194 {
00195
00196
00197
00198
00199 if (IsArgNull("AddBefore", obj)) return;
00200
00201 if (!before)
00202 TList::AddFirst(obj);
00203 else {
00204 if (before == fFirst)
00205 TList::AddFirst(obj);
00206 else {
00207 NewLink(obj, before->Prev());
00208 fSize++;
00209 Changed();
00210 }
00211 }
00212 }
00213
00214
00215 void TList::AddAfter(const TObject *after, TObject *obj)
00216 {
00217
00218
00219 if (IsArgNull("AddAfter", obj)) return;
00220
00221 if (!after)
00222 TList::AddLast(obj);
00223 else {
00224 Int_t idx;
00225 TObjLink *t = FindLink(after, idx);
00226 if (!t) {
00227 Error("AddAfter", "after not found, object not added");
00228 return;
00229 }
00230 if (t == fLast)
00231 TList::AddLast(obj);
00232 else {
00233 NewLink(obj, t);
00234 fSize++;
00235 Changed();
00236 }
00237 }
00238 }
00239
00240
00241 void TList::AddAfter(TObjLink *after, TObject *obj)
00242 {
00243
00244
00245
00246
00247 if (IsArgNull("AddAfter", obj)) return;
00248
00249 if (!after)
00250 TList::AddLast(obj);
00251 else {
00252 if (after == fLast)
00253 TList::AddLast(obj);
00254 else {
00255 NewLink(obj, after);
00256 fSize++;
00257 Changed();
00258 }
00259 }
00260 }
00261
00262
00263 void TList::AddAt(TObject *obj, Int_t idx)
00264 {
00265
00266
00267 if (IsArgNull("AddAt", obj)) return;
00268
00269 TObjLink *lnk = LinkAt(idx);
00270 if (!lnk)
00271 TList::AddLast(obj);
00272 else if (lnk == fFirst)
00273 TList::AddFirst(obj);
00274 else {
00275 NewLink(obj, lnk->Prev());
00276 fSize++;
00277 Changed();
00278 }
00279 }
00280
00281
00282 TObject *TList::After(const TObject *obj) const
00283 {
00284
00285
00286
00287 TObjLink *t;
00288
00289 if (fCache && fCache->GetObject() && fCache->GetObject()->IsEqual(obj)) {
00290 t = fCache;
00291 ((TList*)this)->fCache = fCache->Next();
00292 } else {
00293 Int_t idx;
00294 t = FindLink(obj, idx);
00295 if (t) ((TList*)this)->fCache = t->Next();
00296 }
00297
00298 if (t && t->Next())
00299 return t->Next()->GetObject();
00300 else
00301 return 0;
00302 }
00303
00304
00305 TObject *TList::At(Int_t idx) const
00306 {
00307
00308
00309 TObjLink *lnk = LinkAt(idx);
00310 if (lnk) return lnk->GetObject();
00311 return 0;
00312 }
00313
00314
00315 TObject *TList::Before(const TObject *obj) const
00316 {
00317
00318
00319
00320 TObjLink *t;
00321
00322 if (fCache && fCache->GetObject() && fCache->GetObject()->IsEqual(obj)) {
00323 t = fCache;
00324 ((TList*)this)->fCache = fCache->Prev();
00325 } else {
00326 Int_t idx;
00327 t = FindLink(obj, idx);
00328 if (t) ((TList*)this)->fCache = t->Prev();
00329 }
00330
00331 if (t && t->Prev())
00332 return t->Prev()->GetObject();
00333 else
00334 return 0;
00335 }
00336
00337
00338 void TList::Clear(Option_t *option)
00339 {
00340
00341
00342
00343
00344
00345
00346
00347 Bool_t nodel = option ? (!strcmp(option, "nodelete") ? kTRUE : kFALSE) : kFALSE;
00348
00349 if (!nodel && IsOwner()) {
00350 Delete(option);
00351 return;
00352 }
00353
00354 while (fFirst) {
00355 TObjLink *tlk = fFirst;
00356 fFirst = fFirst->Next();
00357 fSize--;
00358
00359 if (!nodel && tlk->GetObject() && tlk->GetObject()->IsOnHeap()) {
00360 if (tlk->GetObject()->TestBit(kCanDelete)) {
00361 if(tlk->GetObject()->TestBit(kNotDeleted)) {
00362 TCollection::GarbageCollect(tlk->GetObject());
00363 }
00364 }
00365 }
00366 delete tlk;
00367 }
00368 fFirst = fLast = fCache = 0;
00369 fSize = 0;
00370 Changed();
00371 }
00372
00373
00374 void TList::Delete(Option_t *option)
00375 {
00376
00377
00378
00379
00380
00381
00382 Bool_t slow = option ? (!strcmp(option, "slow") ? kTRUE : kFALSE) : kFALSE;
00383
00384 TList removeDirectory;
00385
00386 if (slow) {
00387
00388 while (fFirst) {
00389 TObjLink *tlk = fFirst;
00390 fFirst = fFirst->Next();
00391 fSize--;
00392
00393 if (tlk->GetObject() && tlk->GetObject()->IsOnHeap())
00394 TCollection::GarbageCollect(tlk->GetObject());
00395 else if (tlk->GetObject() && tlk->GetObject()->IsA()->GetDirectoryAutoAdd())
00396 removeDirectory.Add(tlk->GetObject());
00397
00398 delete tlk;
00399 }
00400 fFirst = fLast = fCache = 0;
00401 fSize = 0;
00402
00403 } else {
00404
00405 TObjLink *first = fFirst;
00406 fFirst = fLast = fCache = 0;
00407 fSize = 0;
00408 while (first) {
00409 TObjLink *tlk = first;
00410 first = first->Next();
00411
00412 if (tlk->GetObject() && tlk->GetObject()->IsOnHeap())
00413 TCollection::GarbageCollect(tlk->GetObject());
00414 else if (tlk->GetObject() && tlk->GetObject()->IsA()->GetDirectoryAutoAdd())
00415 removeDirectory.Add(tlk->GetObject());
00416
00417 delete tlk;
00418 }
00419 }
00420
00421
00422
00423
00424
00425 TIter iRemDir(&removeDirectory);
00426 TObject* dirRem = 0;
00427 while ((dirRem = iRemDir())) {
00428 (*dirRem->IsA()->GetDirectoryAutoAdd())(dirRem, 0);
00429 }
00430 Changed();
00431 }
00432
00433
00434 void TList::DeleteLink(TObjLink *lnk)
00435 {
00436
00437
00438 lnk->fNext = lnk->fPrev = 0;
00439 lnk->fObject = 0;
00440 delete lnk;
00441 }
00442
00443
00444 TObject *TList::FindObject(const char *name) const
00445 {
00446
00447
00448
00449
00450
00451 if (!name) return 0;
00452 TObjLink *lnk = FirstLink();
00453 while (lnk) {
00454 TObject *obj = lnk->GetObject();
00455 const char *objname = obj->GetName();
00456 if (objname && !strcmp(name, objname)) return obj;
00457 lnk = lnk->Next();
00458 }
00459 return 0;
00460 }
00461
00462
00463 TObject *TList::FindObject(const TObject *obj) const
00464 {
00465
00466
00467
00468
00469
00470
00471 TObjLink *lnk = FirstLink();
00472
00473 while (lnk) {
00474 TObject *ob = lnk->GetObject();
00475 if (ob->IsEqual(obj)) return ob;
00476 lnk = lnk->Next();
00477 }
00478 return 0;
00479 }
00480
00481
00482 TObjLink *TList::FindLink(const TObject *obj, Int_t &idx) const
00483 {
00484
00485
00486
00487 if (!fFirst) return 0;
00488
00489 TObject *object;
00490 TObjLink *lnk = fFirst;
00491 idx = 0;
00492
00493 while (lnk) {
00494 object = lnk->GetObject();
00495 if (object) {
00496 if (object->TestBit(kNotDeleted)) {
00497 if (object->IsEqual(obj)) return lnk;
00498 }
00499 }
00500 lnk = lnk->Next();
00501 idx++;
00502 }
00503 return 0;
00504 }
00505
00506
00507 TObject *TList::First() const
00508 {
00509
00510
00511 if (fFirst) return fFirst->GetObject();
00512 return 0;
00513 }
00514
00515
00516 TObject **TList::GetObjectRef(const TObject *obj) const
00517 {
00518
00519
00520 TObjLink *lnk = FirstLink();
00521
00522 while (lnk) {
00523 TObject *ob = lnk->GetObject();
00524 if (ob->IsEqual(obj)) return lnk->GetObjectRef();
00525 lnk = lnk->Next();
00526 }
00527 return 0;
00528 }
00529
00530
00531 TObject *TList::Last() const
00532 {
00533
00534
00535 if (fLast) return fLast->GetObject();
00536 return 0;
00537 }
00538
00539
00540 TObjLink *TList::LinkAt(Int_t idx) const
00541 {
00542
00543
00544 Int_t i = 0;
00545 TObjLink *lnk = fFirst;
00546 while (i < idx && lnk) {
00547 i++;
00548 lnk = lnk->Next();
00549 }
00550 return lnk;
00551 }
00552
00553
00554 TIterator *TList::MakeIterator(Bool_t dir) const
00555 {
00556
00557
00558 return new TListIter(this, dir);
00559 }
00560
00561
00562 TObjLink *TList::NewLink(TObject *obj, TObjLink *prev)
00563 {
00564
00565
00566 if (prev)
00567 return new TObjLink(obj, prev);
00568 else
00569 return new TObjLink(obj);
00570 }
00571
00572
00573 TObjLink *TList::NewOptLink(TObject *obj, Option_t *opt, TObjLink *prev)
00574 {
00575
00576
00577 if (prev)
00578 return new TObjOptLink(obj, prev, opt);
00579 else
00580 return new TObjOptLink(obj, opt);
00581 }
00582
00583
00584 void TList::RecursiveRemove(TObject *obj)
00585 {
00586
00587
00588
00589 if (!obj) return;
00590
00591 TObjLink *lnk = fFirst;
00592 TObjLink *next = 0;
00593 while (lnk) {
00594 next = lnk->Next();
00595 TObject *ob = lnk->GetObject();
00596 if (ob->TestBit(kNotDeleted)) {
00597 if (ob->IsEqual(obj)) {
00598 if (lnk == fFirst) {
00599 fFirst = next;
00600 if (lnk == fLast)
00601 fLast = fFirst;
00602 else
00603 fFirst->fPrev = 0;
00604 DeleteLink(lnk);
00605 } else if (lnk == fLast) {
00606 fLast = lnk->Prev();
00607 fLast->fNext = 0;
00608 DeleteLink(lnk);
00609 } else {
00610 lnk->Prev()->fNext = next;
00611 lnk->Next()->fPrev = lnk->Prev();
00612 DeleteLink(lnk);
00613 }
00614 fSize--;
00615 fCache = 0;
00616 Changed();
00617 } else
00618 ob->RecursiveRemove(obj);
00619 }
00620 lnk = next;
00621 }
00622 }
00623
00624
00625 TObject *TList::Remove(TObject *obj)
00626 {
00627
00628
00629 if (!obj) return 0;
00630
00631 Int_t idx;
00632 TObjLink *lnk = FindLink(obj, idx);
00633
00634 if (!lnk) return 0;
00635
00636
00637
00638 TObject *ob = lnk->GetObject();
00639
00640 if (lnk == fFirst) {
00641 fFirst = lnk->Next();
00642 if (lnk == fLast)
00643 fLast = fFirst;
00644 else
00645 fFirst->fPrev = 0;
00646 DeleteLink(lnk);
00647 } else if (lnk == fLast) {
00648 fLast = lnk->Prev();
00649 fLast->fNext = 0;
00650 DeleteLink(lnk);
00651 } else {
00652 lnk->Prev()->fNext = lnk->Next();
00653 lnk->Next()->fPrev = lnk->Prev();
00654 DeleteLink(lnk);
00655 }
00656 fSize--;
00657 fCache = 0;
00658 Changed();
00659
00660 return ob;
00661 }
00662
00663
00664 TObject *TList::Remove(TObjLink *lnk)
00665 {
00666
00667
00668
00669 if (!lnk) return 0;
00670
00671 TObject *obj = lnk->GetObject();
00672
00673 if (lnk == fFirst) {
00674 fFirst = lnk->Next();
00675 if (lnk == fLast)
00676 fLast = fFirst;
00677 else
00678 fFirst->fPrev = 0;
00679 DeleteLink(lnk);
00680 } else if (lnk == fLast) {
00681 fLast = lnk->Prev();
00682 fLast->fNext = 0;
00683 DeleteLink(lnk);
00684 } else {
00685 lnk->Prev()->fNext = lnk->Next();
00686 lnk->Next()->fPrev = lnk->Prev();
00687 DeleteLink(lnk);
00688 }
00689 fSize--;
00690 fCache = 0;
00691 Changed();
00692
00693 return obj;
00694 }
00695
00696
00697 void TList::RemoveLast()
00698 {
00699
00700
00701 TObjLink *lnk = fLast;
00702 if (!lnk) return;
00703
00704 if (lnk == fFirst) {
00705 fFirst = 0;
00706 fLast = 0;
00707 } else {
00708 fLast = lnk->Prev();
00709 fLast->fNext = 0;
00710 }
00711 DeleteLink(lnk);
00712
00713 fSize--;
00714 fCache = 0;
00715 Changed();
00716 }
00717
00718
00719 void TList::Sort(Bool_t order)
00720 {
00721
00722
00723
00724
00725 if (!fFirst) return;
00726
00727 fAscending = order;
00728
00729 if (!fFirst->GetObject()->IsSortable()) {
00730 Error("Sort", "objects in list are not sortable");
00731 return;
00732 }
00733
00734 DoSort(&fFirst, fSize);
00735
00736
00737 TObjLink *ol, *lnk = fFirst;
00738
00739 if (lnk) lnk->fPrev = 0;
00740 while ((ol = lnk)) {
00741 lnk = lnk->fNext;
00742 if (lnk)
00743 lnk->fPrev = ol;
00744 else
00745 fLast = ol;
00746 }
00747 fSorted = kTRUE;
00748 }
00749
00750
00751 Bool_t TList::LnkCompare(TObjLink *l1, TObjLink *l2)
00752 {
00753
00754
00755
00756
00757 Int_t cmp = l1->GetObject()->Compare(l2->GetObject());
00758
00759 if ((IsAscending() && cmp <=0) || (!IsAscending() && cmp > 0))
00760 return kTRUE;
00761 return kFALSE;
00762 }
00763
00764
00765 TObjLink **TList::DoSort(TObjLink **head, Int_t n)
00766 {
00767
00768
00769 TObjLink *p1, *p2, **h2, **t2;
00770
00771 switch (n) {
00772 case 0:
00773 return head;
00774
00775 case 1:
00776 return &((*head)->fNext);
00777
00778 case 2:
00779 p2 = (p1 = *head)->fNext;
00780 if (LnkCompare(p1, p2)) return &(p2->fNext);
00781 p1->fNext = (*head = p2)->fNext;
00782 return &((p2->fNext = p1)->fNext);
00783 }
00784
00785 int m;
00786 n -= m = n / 2;
00787
00788 t2 = DoSort(h2 = DoSort(head, n), m);
00789
00790 if (LnkCompare((p1 = *head), (p2 = *h2))) {
00791 do {
00792 if (!--n) return *h2 = p2, t2;
00793 } while (LnkCompare((p1 = *(head = &(p1->fNext))), p2));
00794 }
00795
00796 while (1) {
00797 *head = p2;
00798 do {
00799 if (!--m) return *h2 = *t2, *t2 = p1, h2;
00800 } while (!LnkCompare(p1, (p2 = *(head = &(p2->fNext)))));
00801 *head = p1;
00802 do {
00803 if (!--n) return *h2 = p2, t2;
00804 } while (LnkCompare((p1 = *(head = &(p1->fNext))), p2));
00805 }
00806 }
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817 TObjLink::TObjLink(TObject *obj, TObjLink *prev)
00818 : fNext(prev->fNext), fPrev(prev), fObject(obj)
00819 {
00820
00821
00822 fPrev->fNext = this;
00823 if (fNext) fNext->fPrev = this;
00824 }
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834 ClassImp(TListIter)
00835
00836
00837 TListIter::TListIter(const TList *l, Bool_t dir)
00838 : fList(l), fCurCursor(0), fCursor(0), fDirection(dir), fStarted(kFALSE)
00839 {
00840
00841
00842 }
00843
00844
00845 TListIter::TListIter(const TListIter &iter) : TIterator(iter)
00846 {
00847
00848
00849 fList = iter.fList;
00850 fCurCursor = iter.fCurCursor;
00851 fCursor = iter.fCursor;
00852 fDirection = iter.fDirection;
00853 fStarted = iter.fStarted;
00854 }
00855
00856
00857 TIterator &TListIter::operator=(const TIterator &rhs)
00858 {
00859
00860
00861 if (this != &rhs && rhs.IsA() == TListIter::Class()) {
00862 const TListIter &rhs1 = (const TListIter &)rhs;
00863 fList = rhs1.fList;
00864 fCurCursor = rhs1.fCurCursor;
00865 fCursor = rhs1.fCursor;
00866 fDirection = rhs1.fDirection;
00867 fStarted = rhs1.fStarted;
00868 }
00869 return *this;
00870 }
00871
00872
00873 TListIter &TListIter::operator=(const TListIter &rhs)
00874 {
00875
00876
00877 if (this != &rhs) {
00878 fList = rhs.fList;
00879 fCurCursor = rhs.fCurCursor;
00880 fCursor = rhs.fCursor;
00881 fDirection = rhs.fDirection;
00882 fStarted = rhs.fStarted;
00883 }
00884 return *this;
00885 }
00886
00887
00888 TObject *TListIter::Next()
00889 {
00890
00891
00892 if (!fList) return 0;
00893
00894 if (fDirection == kIterForward) {
00895 if (!fStarted) {
00896 fCursor = fList->fFirst;
00897 fStarted = kTRUE;
00898 }
00899 fCurCursor = fCursor;
00900 if (fCursor) fCursor = fCursor->Next();
00901 } else {
00902 if (!fStarted) {
00903 fCursor = fList->fLast;
00904 fStarted = kTRUE;
00905 }
00906 fCurCursor = fCursor;
00907 if (fCursor) fCursor = fCursor->Prev();
00908 }
00909
00910 if (fCurCursor) return fCurCursor->GetObject();
00911 return 0;
00912 }
00913
00914
00915 Option_t *TListIter::GetOption() const
00916 {
00917
00918
00919 if (fCurCursor) return fCurCursor->GetOption();
00920 return "";
00921 }
00922
00923
00924 void TListIter::SetOption(Option_t *option)
00925 {
00926
00927
00928 if (fCurCursor) fCurCursor->SetOption(option);
00929 }
00930
00931
00932 void TListIter::Reset()
00933 {
00934
00935
00936 fStarted = kFALSE;
00937 }
00938
00939
00940 bool TListIter::operator!=(const TIterator &aIter) const
00941 {
00942
00943
00944 if (nullptr == (&aIter))
00945 return fCurCursor;
00946
00947 if ((aIter.IsA() == TListIter::Class())) {
00948 const TListIter &iter(dynamic_cast<const TListIter &>(aIter));
00949 return (fCurCursor != iter.fCurCursor);
00950 }
00951 return false;
00952 }
00953
00954
00955 bool TListIter::operator!=(const TListIter &aIter) const
00956 {
00957
00958
00959 if (nullptr == (&aIter))
00960 return fCurCursor;
00961
00962 return (fCurCursor != aIter.fCurCursor);
00963 }
00964
00965
00966 void TList::Streamer(TBuffer &b)
00967 {
00968
00969
00970 Int_t nobjects;
00971 UChar_t nch;
00972 Int_t nbig;
00973 TObject *obj;
00974 UInt_t R__s, R__c;
00975
00976 if (b.IsReading()) {
00977 Version_t v = b.ReadVersion(&R__s, &R__c);
00978 if (v > 3) {
00979 TObject::Streamer(b);
00980 fName.Streamer(b);
00981 b >> nobjects;
00982 string readOption;
00983 for (Int_t i = 0; i < nobjects; i++) {
00984 b >> obj;
00985 b >> nch;
00986 if (v > 4 && nch == 255) {
00987 b >> nbig;
00988 } else {
00989 nbig = nch;
00990 }
00991 readOption.resize(nbig,'\0');
00992 b.ReadFastArray((char*) readOption.data(),nbig);
00993 if (obj) {
00994 if (nch) {
00995 Add(obj,readOption.c_str());
00996 } else {
00997 Add(obj);
00998 }
00999 }
01000 }
01001 b.CheckByteCount(R__s, R__c,TList::IsA());
01002 return;
01003 }
01004
01005
01006 if (v > 2)
01007 TObject::Streamer(b);
01008 if (v > 1)
01009 fName.Streamer(b);
01010 b >> nobjects;
01011 for (Int_t i = 0; i < nobjects; i++) {
01012 b >> obj;
01013 Add(obj);
01014 }
01015 b.CheckByteCount(R__s, R__c,TList::IsA());
01016
01017 } else {
01018 R__c = b.WriteVersion(TList::IsA(), kTRUE);
01019 TObject::Streamer(b);
01020 fName.Streamer(b);
01021 nobjects = GetSize();
01022 b << nobjects;
01023
01024 TObjLink *lnk = fFirst;
01025 while (lnk) {
01026 obj = lnk->GetObject();
01027 b << obj;
01028
01029 nbig = strlen(lnk->GetAddOption());
01030 if (nbig > 254) {
01031 nch = 255;
01032 b << nch;
01033 b << nbig;
01034 } else {
01035 nch = UChar_t(nbig);
01036 b << nch;
01037 }
01038 b.WriteFastArray(lnk->GetAddOption(),nbig);
01039
01040 lnk = lnk->Next();
01041 }
01042 b.SetByteCount(R__c, kTRUE);
01043 }
01044 }