ROOT logo
// $Id: ZVector.cxx 2088 2008-11-23 20:26:46Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

//__________________________________________________________________________
// ZVector
//
//

#include "ZVector.h"
#include "ZVector.c7"

ClassImp(ZVector);

/**************************************************************************/

void ZVector::_init()
{
  mGrowFac  = 1;
  mGrowStep = 4;
  mReserved = 0;
  mNextIdx  = 0;
}

/**************************************************************************/


Int_t ZVector::remove_references_to(ZGlass* lens)
{
  Int_t n  = ZGlass::remove_references_to(lens);
  GMutexHolder llck(mListMutex);
  for(iterator i=begin(); i!=end(); ++i) {
    if(i() == lens) {
      on_remove(i.idx);
      StampListElementSet(0, i.idx);
      ++n;
    }
  }
  return n;
}

void ZVector::clear_list()
{
  mSize     = 0;
  mReserved = 0;
  mNextIdx  = 0;
  container foo;
  mElements.swap(foo);
}

/**************************************************************************/

Int_t ZVector::RebuildListRefs(An_ID_Demangler* idd)
{
  Int_t ret = 0;
  for(iterator i = begin(); i != end(); ++i) {
    ZGlass* lens = 0;
    if(i() != 0) {
      lens = idd->DemangleID(GledNS::CastLens2ID(i()));
      if(lens) {
        try {
          lens->IncRefCount(this);
        }
        catch(Exc_t& exc) {
          lens = 0;
          ++ret;
        }
      }
      *i = lens;
    }
  }
  on_rebuild();
  return ret;
}

void ZVector::ClearList()
{
  static const Exc_t _eh("ZVector::ClearList ");

  if(mSize == 0) return;

  container foo;
  ISdebug(0, _eh + GForm("locking list '%s'.", GetName()));
  mListMutex.Lock();
  mElements.swap(foo);
  clear_list();
  StampListClear();
  Stamp();
  mListMutex.Unlock();
  ISdebug(0, _eh + GForm("unlocked list '%s'.", GetName()));
  for(vpZGlass_i i=foo.begin(); i!=foo.end(); ++i) {
    if(*i) (*i)->DecRefCount(this);
  }
  ISdebug(0, _eh + GForm("finished for '%s'.", GetName()));
}

/**************************************************************************/
// AList methods, public part.
/**************************************************************************/

AList::stepper_base* ZVector::make_stepper_imp()
{
  return new stepper_imp<ZVector>(begin(), end());
}

/**************************************************************************/
// Generick AList
/**************************************************************************/

void ZVector::Add(ZGlass* lens)
{
  // Adds lens at the position mNextIdx, possibly extending the vector.

  static const Exc_t _eh("ZVector::Add ");

  GMutexHolder llck(mListMutex);
  bool growp    = false;
  bool reservep = false;
  if(mNextIdx >= mSize) {
    if(mSize >= mReserved) {
      if(mGrowFac == 1 && mGrowStep == 0)
        throw(_eh + "container full, auto-grow disabled.");
      reservep = true;
    }
    growp = true;
  }
  new_element_check(lens);
  if(lens) lens->IncRefCount(this);
  if(growp) {
    if(reservep) {
      mReserved = TMath::Max((Int_t)(mGrowFac*mSize + mGrowStep), mReserved + 1);
      mElements.reserve(mReserved);
    }
    mElements.push_back(lens); ++mSize;
    on_insert(mNextIdx);
    StampListPushBack(lens, mNextIdx++);
  } else {
    mElements[mNextIdx] = lens;
    on_insert(mNextIdx);
    StampListElementSet(lens, mNextIdx++);
  }
  Stamp();
}

Int_t ZVector::RemoveAll(ZGlass* lens)
{
  Int_t n=0;
  GMutexHolder llck(mListMutex);
  for(iterator i = begin(); i != end(); ++i) {
    if(i() == lens) {
      on_remove(i.idx);
      mElements[i.idx] = 0;
      StampListElementSet(0, i.idx);
      ++n;
    }
  }
  if(n) lens->DecRefCount(this, n);
  return n;
}

/**************************************************************************/
// By-id operations
/**************************************************************************/

void ZVector::SetElementById(ZGlass* lens, Int_t index)
{
  static const Exc_t _eh("ZVector::SetElementById ");

  GMutexHolder llck(mListMutex);
  if(index < 0 || index >= mSize)
    throw(_eh + "index out of range.");
  new_element_check(lens);
  if(lens) lens->IncRefCount(this);
  ZGlass* old_lens = mElements[index];
  mElements[index] = lens;
  if(old_lens) old_lens->DecRefCount(this);
  on_change(index, old_lens);
  StampListElementSet(lens, index);
  if(index >= mNextIdx) {
    mNextIdx = index + 1;
    Stamp(FID());
  }
}

ZGlass* ZVector::GetElementById(Int_t index)
{
  static const Exc_t _eh("ZVector::GetElementById ");

  ZGlass* l;
  {
    GMutexHolder llck(mListMutex);
    if(index < 0 || index >= mSize)
      throw(_eh + "index out of range.");
    l = mElements[index];
  }
  ZMIR* mir = get_MIR();
  if(mir && mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    GledNS::WriteLensID(b, l);
    mSaturn->ShootMIRResult(b);
  }
  return l;
}

/**************************************************************************/
// ZVector
/**************************************************************************/

void ZVector::Resize(Int_t size)
{
  static const Exc_t _eh("ZVector::Resize ");

  if(size < 0) size = 0;

  GMutexHolder llck(mListMutex);

  if(size == mSize)
    return;

  if(size == 0) {
    ClearList();
    return;
  }

  if(size > mSize) {
    mElements.resize(size);
    mSize = size;
    for(Int_t idx = mNextIdx; idx < mSize; ++idx) {
      on_insert(idx);
      StampListPushBack(0, idx);
    }
    Stamp();
    return;
  }

  if(size < mSize) {
    for(Int_t i=mSize-1; i>=size; --i) {
      ZGlass* l = mElements[i];
      on_remove(i);
      mElements[i] = 0;
      if(l) l->DecRefCount(this);
      StampListPopBack();
    }
    mElements.resize(size);
    mSize = size;
    if(mNextIdx > mSize)
      mNextIdx = mSize;
    Stamp();
    return;
  }

  assert(false);
}

void ZVector::Reserve(Int_t reserve)
{
  mElements.reserve(reserve);
  mReserved = mElements.capacity();
}

void ZVector::ClipReserve()
{
  container foo = mElements;
  mElements.swap(foo);
  mReserved = mElements.capacity();
}

void ZVector::SetNextIdx(Int_t nextidx)
{
  if(nextidx < 0) nextidx = 0;
  if(nextidx > mSize) nextidx = mSize;
  mNextIdx = nextidx;
  Stamp(FID());
}

Int_t ZVector::FindFirstEmptyId(Int_t index)
{
  // Returns the first empty id (with 0 lens pointer) at or after index.
  // Default value for index = 0, so it starts at the beginning.
  // Returns -1 if there are no empty ids.

  while (index < mSize)
  {
    if (mElements[index] == 0) return index;
    ++index;
  }
  return -1;
}

Int_t ZVector::CountEmptyIds()
{
  // Returns number of empty ids (with 0 lens pointer).

  Int_t count = 0;
  for (Int_t i=0; i<mSize; ++i)
  {
    if (mElements[i] == 0) ++count;
  }
  return count;
}

/**************************************************************************/

void ZVector::dumpVecStat()
{
  printf("%s size=%zu (mSize=%d), capacity=%zu (mReserved=%d)\n",
         GetName(), mElements.size(), mSize, mElements.capacity(), mReserved);
}

/**************************************************************************/
/**************************************************************************/
// Streamer
/**************************************************************************/

void ZVector::Streamer(TBuffer &b)
{
  UInt_t R__s, R__c;

  if(b.IsReading()) {

    Version_t R__v = b.ReadVersion(&R__s, &R__c); if(R__v) { }
    AList::Streamer(b);
    b >> mGrowFac >> mGrowStep >> mReserved >> mNextIdx;
    TString str;
    ID_t    id;
    container foo;
    mElements.swap(foo);
    mElements.reserve(mReserved);
    mElements.resize(mSize);
    for(Int_t i=0; i<mSize; ++i) {
      b >> id >> str;
      mElements[i] = GledNS::CastID2Lens(id);
    }
    b.CheckByteCount(R__s, R__c, ZVector::IsA());

  } else {

    R__c = b.WriteVersion(ZVector::IsA(), kTRUE);
    AList::Streamer(b);
    b << mGrowFac << mGrowStep << mReserved << mNextIdx;
    for(iterator i=begin(); i!=end(); ++i)
      b << (i() ? i()->GetSaturnID() : (ID_t)0);
    b.SetByteCount(R__c, kTRUE);

  }
}

/**************************************************************************/
 ZVector.cxx:1
 ZVector.cxx:2
 ZVector.cxx:3
 ZVector.cxx:4
 ZVector.cxx:5
 ZVector.cxx:6
 ZVector.cxx:7
 ZVector.cxx:8
 ZVector.cxx:9
 ZVector.cxx:10
 ZVector.cxx:11
 ZVector.cxx:12
 ZVector.cxx:13
 ZVector.cxx:14
 ZVector.cxx:15
 ZVector.cxx:16
 ZVector.cxx:17
 ZVector.cxx:18
 ZVector.cxx:19
 ZVector.cxx:20
 ZVector.cxx:21
 ZVector.cxx:22
 ZVector.cxx:23
 ZVector.cxx:24
 ZVector.cxx:25
 ZVector.cxx:26
 ZVector.cxx:27
 ZVector.cxx:28
 ZVector.cxx:29
 ZVector.cxx:30
 ZVector.cxx:31
 ZVector.cxx:32
 ZVector.cxx:33
 ZVector.cxx:34
 ZVector.cxx:35
 ZVector.cxx:36
 ZVector.cxx:37
 ZVector.cxx:38
 ZVector.cxx:39
 ZVector.cxx:40
 ZVector.cxx:41
 ZVector.cxx:42
 ZVector.cxx:43
 ZVector.cxx:44
 ZVector.cxx:45
 ZVector.cxx:46
 ZVector.cxx:47
 ZVector.cxx:48
 ZVector.cxx:49
 ZVector.cxx:50
 ZVector.cxx:51
 ZVector.cxx:52
 ZVector.cxx:53
 ZVector.cxx:54
 ZVector.cxx:55
 ZVector.cxx:56
 ZVector.cxx:57
 ZVector.cxx:58
 ZVector.cxx:59
 ZVector.cxx:60
 ZVector.cxx:61
 ZVector.cxx:62
 ZVector.cxx:63
 ZVector.cxx:64
 ZVector.cxx:65
 ZVector.cxx:66
 ZVector.cxx:67
 ZVector.cxx:68
 ZVector.cxx:69
 ZVector.cxx:70
 ZVector.cxx:71
 ZVector.cxx:72
 ZVector.cxx:73
 ZVector.cxx:74
 ZVector.cxx:75
 ZVector.cxx:76
 ZVector.cxx:77
 ZVector.cxx:78
 ZVector.cxx:79
 ZVector.cxx:80
 ZVector.cxx:81
 ZVector.cxx:82
 ZVector.cxx:83
 ZVector.cxx:84
 ZVector.cxx:85
 ZVector.cxx:86
 ZVector.cxx:87
 ZVector.cxx:88
 ZVector.cxx:89
 ZVector.cxx:90
 ZVector.cxx:91
 ZVector.cxx:92
 ZVector.cxx:93
 ZVector.cxx:94
 ZVector.cxx:95
 ZVector.cxx:96
 ZVector.cxx:97
 ZVector.cxx:98
 ZVector.cxx:99
 ZVector.cxx:100
 ZVector.cxx:101
 ZVector.cxx:102
 ZVector.cxx:103
 ZVector.cxx:104
 ZVector.cxx:105
 ZVector.cxx:106
 ZVector.cxx:107
 ZVector.cxx:108
 ZVector.cxx:109
 ZVector.cxx:110
 ZVector.cxx:111
 ZVector.cxx:112
 ZVector.cxx:113
 ZVector.cxx:114
 ZVector.cxx:115
 ZVector.cxx:116
 ZVector.cxx:117
 ZVector.cxx:118
 ZVector.cxx:119
 ZVector.cxx:120
 ZVector.cxx:121
 ZVector.cxx:122
 ZVector.cxx:123
 ZVector.cxx:124
 ZVector.cxx:125
 ZVector.cxx:126
 ZVector.cxx:127
 ZVector.cxx:128
 ZVector.cxx:129
 ZVector.cxx:130
 ZVector.cxx:131
 ZVector.cxx:132
 ZVector.cxx:133
 ZVector.cxx:134
 ZVector.cxx:135
 ZVector.cxx:136
 ZVector.cxx:137
 ZVector.cxx:138
 ZVector.cxx:139
 ZVector.cxx:140
 ZVector.cxx:141
 ZVector.cxx:142
 ZVector.cxx:143
 ZVector.cxx:144
 ZVector.cxx:145
 ZVector.cxx:146
 ZVector.cxx:147
 ZVector.cxx:148
 ZVector.cxx:149
 ZVector.cxx:150
 ZVector.cxx:151
 ZVector.cxx:152
 ZVector.cxx:153
 ZVector.cxx:154
 ZVector.cxx:155
 ZVector.cxx:156
 ZVector.cxx:157
 ZVector.cxx:158
 ZVector.cxx:159
 ZVector.cxx:160
 ZVector.cxx:161
 ZVector.cxx:162
 ZVector.cxx:163
 ZVector.cxx:164
 ZVector.cxx:165
 ZVector.cxx:166
 ZVector.cxx:167
 ZVector.cxx:168
 ZVector.cxx:169
 ZVector.cxx:170
 ZVector.cxx:171
 ZVector.cxx:172
 ZVector.cxx:173
 ZVector.cxx:174
 ZVector.cxx:175
 ZVector.cxx:176
 ZVector.cxx:177
 ZVector.cxx:178
 ZVector.cxx:179
 ZVector.cxx:180
 ZVector.cxx:181
 ZVector.cxx:182
 ZVector.cxx:183
 ZVector.cxx:184
 ZVector.cxx:185
 ZVector.cxx:186
 ZVector.cxx:187
 ZVector.cxx:188
 ZVector.cxx:189
 ZVector.cxx:190
 ZVector.cxx:191
 ZVector.cxx:192
 ZVector.cxx:193
 ZVector.cxx:194
 ZVector.cxx:195
 ZVector.cxx:196
 ZVector.cxx:197
 ZVector.cxx:198
 ZVector.cxx:199
 ZVector.cxx:200
 ZVector.cxx:201
 ZVector.cxx:202
 ZVector.cxx:203
 ZVector.cxx:204
 ZVector.cxx:205
 ZVector.cxx:206
 ZVector.cxx:207
 ZVector.cxx:208
 ZVector.cxx:209
 ZVector.cxx:210
 ZVector.cxx:211
 ZVector.cxx:212
 ZVector.cxx:213
 ZVector.cxx:214
 ZVector.cxx:215
 ZVector.cxx:216
 ZVector.cxx:217
 ZVector.cxx:218
 ZVector.cxx:219
 ZVector.cxx:220
 ZVector.cxx:221
 ZVector.cxx:222
 ZVector.cxx:223
 ZVector.cxx:224
 ZVector.cxx:225
 ZVector.cxx:226
 ZVector.cxx:227
 ZVector.cxx:228
 ZVector.cxx:229
 ZVector.cxx:230
 ZVector.cxx:231
 ZVector.cxx:232
 ZVector.cxx:233
 ZVector.cxx:234
 ZVector.cxx:235
 ZVector.cxx:236
 ZVector.cxx:237
 ZVector.cxx:238
 ZVector.cxx:239
 ZVector.cxx:240
 ZVector.cxx:241
 ZVector.cxx:242
 ZVector.cxx:243
 ZVector.cxx:244
 ZVector.cxx:245
 ZVector.cxx:246
 ZVector.cxx:247
 ZVector.cxx:248
 ZVector.cxx:249
 ZVector.cxx:250
 ZVector.cxx:251
 ZVector.cxx:252
 ZVector.cxx:253
 ZVector.cxx:254
 ZVector.cxx:255
 ZVector.cxx:256
 ZVector.cxx:257
 ZVector.cxx:258
 ZVector.cxx:259
 ZVector.cxx:260
 ZVector.cxx:261
 ZVector.cxx:262
 ZVector.cxx:263
 ZVector.cxx:264
 ZVector.cxx:265
 ZVector.cxx:266
 ZVector.cxx:267
 ZVector.cxx:268
 ZVector.cxx:269
 ZVector.cxx:270
 ZVector.cxx:271
 ZVector.cxx:272
 ZVector.cxx:273
 ZVector.cxx:274
 ZVector.cxx:275
 ZVector.cxx:276
 ZVector.cxx:277
 ZVector.cxx:278
 ZVector.cxx:279
 ZVector.cxx:280
 ZVector.cxx:281
 ZVector.cxx:282
 ZVector.cxx:283
 ZVector.cxx:284
 ZVector.cxx:285
 ZVector.cxx:286
 ZVector.cxx:287
 ZVector.cxx:288
 ZVector.cxx:289
 ZVector.cxx:290
 ZVector.cxx:291
 ZVector.cxx:292
 ZVector.cxx:293
 ZVector.cxx:294
 ZVector.cxx:295
 ZVector.cxx:296
 ZVector.cxx:297
 ZVector.cxx:298
 ZVector.cxx:299
 ZVector.cxx:300
 ZVector.cxx:301
 ZVector.cxx:302
 ZVector.cxx:303
 ZVector.cxx:304
 ZVector.cxx:305
 ZVector.cxx:306
 ZVector.cxx:307
 ZVector.cxx:308
 ZVector.cxx:309
 ZVector.cxx:310
 ZVector.cxx:311
 ZVector.cxx:312
 ZVector.cxx:313
 ZVector.cxx:314
 ZVector.cxx:315
 ZVector.cxx:316
 ZVector.cxx:317
 ZVector.cxx:318
 ZVector.cxx:319
 ZVector.cxx:320
 ZVector.cxx:321
 ZVector.cxx:322
 ZVector.cxx:323
 ZVector.cxx:324
 ZVector.cxx:325
 ZVector.cxx:326
 ZVector.cxx:327
 ZVector.cxx:328
 ZVector.cxx:329
 ZVector.cxx:330
 ZVector.cxx:331
 ZVector.cxx:332
 ZVector.cxx:333
 ZVector.cxx:334
 ZVector.cxx:335
 ZVector.cxx:336
 ZVector.cxx:337
 ZVector.cxx:338
 ZVector.cxx:339
 ZVector.cxx:340
 ZVector.cxx:341
 ZVector.cxx:342
 ZVector.cxx:343
 ZVector.cxx:344
 ZVector.cxx:345
 ZVector.cxx:346
 ZVector.cxx:347
 ZVector.cxx:348
 ZVector.cxx:349
 ZVector.cxx:350