ROOT logo
// $Id: ZDeque.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/.

//__________________________________________________________________________
// ZDeque
//
//

#include "ZDeque.h"
#include "ZDeque.c7"

#include <algorithm>
#include <iterator>

ClassImp(ZDeque);

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

void ZDeque::_init()
{
}

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

void ZDeque::clear_list()
{
  mSize = 0;
  mElements.clear();
}

Int_t ZDeque::remove_references_to(ZGlass* lens)
{
  Int_t m  = ZGlass::remove_references_to(lens);
  Int_t n = 0;
  GMutexHolder llck(mListMutex);
  for(iterator i=begin(); i!=end(); ++i) {
    if(i() == lens) {
      iterator j = i; --i;
      on_remove(j);
      mElements.erase(j);
      ++n;
    }
  }
  if(n > 0) {
    StampListRebuild();
  }
  return n + m;
}

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

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

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

Int_t ZDeque::RebuildListRefs(An_ID_Demangler* idd)
{
  Int_t ret = 0;
  container in;
  mElements.swap(in);
  mSize   = 0;
  for(iterator i=in.begin(); i!=in.end(); ++i) {
    ZGlass* lens = idd->DemangleID(GledNS::CastLens2ID(i()));
    if(lens) {
      try {
	lens->IncRefCount(this);
	mElements.push_back(lens); ++mSize;
      }
      catch(...) {
	++ret;
      }
    } else {
      ++ret;
    }
  }
  on_rebuild();
  return ret;
}

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

  if(mSize == 0) return;

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

/**************************************************************************/
// Generick
/**************************************************************************/

void ZDeque::Add(ZGlass* lens)
{
  PushBack(lens);
}

Int_t ZDeque::RemoveAll(ZGlass* lens)
{
  Int_t n  = 0;
  mListMutex.Lock();
  for(iterator i=begin(); i!=end(); ++i) {
    if(i() == lens) {
      iterator j = i; --i;
      mElements.erase(j); --mSize;
      ++n;
    }
  }
  mListMutex.Unlock();
  if(n) {
    lens->DecRefCount(this, n);
    StampListRebuild();
  }
  return n;
}

/**************************************************************************/
// Deque
/**************************************************************************/

ZGlass* ZDeque::FrontElement()
{
  ZGlass* l;
  { GMutexHolder llck(mListMutex);
    l = mSize ? mElements.front() : 0;
  }
  ZMIR* mir = get_MIR();
  if(mir && mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    GledNS::WriteLensID(b, l);
    mSaturn->ShootMIRResult(b);
  }
  return l;
}

ZGlass* ZDeque::BackElement()
{
  ZGlass* l;
  { GMutexHolder _lstlck(mListMutex);
    l = mSize ? mElements.back() : 0;
  }
  ZMIR* mir = get_MIR();
  if(mir && mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    GledNS::WriteLensID(b, l);
    mSaturn->ShootMIRResult(b);
  }
  return l;
}

void ZDeque::PushBack(ZGlass* lens)
{
  GMutexHolder llck(mListMutex);
  new_element_check(lens);
  lens->IncRefCount(this);
  mElements.push_back(lens); ++mSize;
  on_insert(--end());
  StampListPushBack(lens);
}

ZGlass* ZDeque::PopBack()
{
  static const Exc_t _eh("ZDeque::PopBack ");

  if(mSize == 0)
    throw(_eh + "deque empty.");

  ZGlass* l;
  { GMutexHolder llck(mListMutex);
    l = mElements.back();
    on_remove(--end());
    mElements.pop_back(); --mSize;
    l->DecRefCount(this);
    StampListPopBack();
  }
  ZMIR* mir = get_MIR();
  if(mir && mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    GledNS::WriteLensID(b, l);
    mSaturn->ShootMIRResult(b);
  }
  return l;
}

void ZDeque::PushFront(ZGlass* lens)
{
  GMutexHolder llck(mListMutex);
  new_element_check(lens);
  lens->IncRefCount(this);
  mElements.push_front(lens); ++mSize;
  on_insert(begin());
  StampListPushFront(lens);
}

ZGlass* ZDeque::PopFront()
{
  static const Exc_t _eh("ZDeque::PopFront ");

  if(mSize == 0)
    throw(_eh + "deque empty.");

  ZGlass* l;
  { GMutexHolder llck(mListMutex);
    l = mElements.front();
    on_remove(begin());
    mElements.pop_front(); --mSize;
    l->DecRefCount(this);
    StampListPopFront();
  }
  ZMIR* mir = get_MIR();
  if(mir && mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    GledNS::WriteLensID(b, l);
    mSaturn->ShootMIRResult(b);
  }
  return l;
}

/**************************************************************************/
// ROOT
/**************************************************************************/

void ZDeque::Streamer(TBuffer &b)
{
  static const Exc_t _eh("ZDeque::Streamer ");
  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);
    ID_t id;
    mElements.clear();
    for(Int_t i=0; i<mSize; ++i) {
      b >> id;
      mElements.push_back((ZGlass*)id);
    }
    b.CheckByteCount(R__s, R__c, ZDeque::IsA());

  } else {

    R__c = b.WriteVersion(ZDeque::IsA(), kTRUE);
    AList::Streamer(b);
    for(iterator i=begin(); i!=end(); ++i)
      b << i()->GetSaturnID();
    b.SetByteCount(R__c, kTRUE);

  }
}

 ZDeque.cxx:1
 ZDeque.cxx:2
 ZDeque.cxx:3
 ZDeque.cxx:4
 ZDeque.cxx:5
 ZDeque.cxx:6
 ZDeque.cxx:7
 ZDeque.cxx:8
 ZDeque.cxx:9
 ZDeque.cxx:10
 ZDeque.cxx:11
 ZDeque.cxx:12
 ZDeque.cxx:13
 ZDeque.cxx:14
 ZDeque.cxx:15
 ZDeque.cxx:16
 ZDeque.cxx:17
 ZDeque.cxx:18
 ZDeque.cxx:19
 ZDeque.cxx:20
 ZDeque.cxx:21
 ZDeque.cxx:22
 ZDeque.cxx:23
 ZDeque.cxx:24
 ZDeque.cxx:25
 ZDeque.cxx:26
 ZDeque.cxx:27
 ZDeque.cxx:28
 ZDeque.cxx:29
 ZDeque.cxx:30
 ZDeque.cxx:31
 ZDeque.cxx:32
 ZDeque.cxx:33
 ZDeque.cxx:34
 ZDeque.cxx:35
 ZDeque.cxx:36
 ZDeque.cxx:37
 ZDeque.cxx:38
 ZDeque.cxx:39
 ZDeque.cxx:40
 ZDeque.cxx:41
 ZDeque.cxx:42
 ZDeque.cxx:43
 ZDeque.cxx:44
 ZDeque.cxx:45
 ZDeque.cxx:46
 ZDeque.cxx:47
 ZDeque.cxx:48
 ZDeque.cxx:49
 ZDeque.cxx:50
 ZDeque.cxx:51
 ZDeque.cxx:52
 ZDeque.cxx:53
 ZDeque.cxx:54
 ZDeque.cxx:55
 ZDeque.cxx:56
 ZDeque.cxx:57
 ZDeque.cxx:58
 ZDeque.cxx:59
 ZDeque.cxx:60
 ZDeque.cxx:61
 ZDeque.cxx:62
 ZDeque.cxx:63
 ZDeque.cxx:64
 ZDeque.cxx:65
 ZDeque.cxx:66
 ZDeque.cxx:67
 ZDeque.cxx:68
 ZDeque.cxx:69
 ZDeque.cxx:70
 ZDeque.cxx:71
 ZDeque.cxx:72
 ZDeque.cxx:73
 ZDeque.cxx:74
 ZDeque.cxx:75
 ZDeque.cxx:76
 ZDeque.cxx:77
 ZDeque.cxx:78
 ZDeque.cxx:79
 ZDeque.cxx:80
 ZDeque.cxx:81
 ZDeque.cxx:82
 ZDeque.cxx:83
 ZDeque.cxx:84
 ZDeque.cxx:85
 ZDeque.cxx:86
 ZDeque.cxx:87
 ZDeque.cxx:88
 ZDeque.cxx:89
 ZDeque.cxx:90
 ZDeque.cxx:91
 ZDeque.cxx:92
 ZDeque.cxx:93
 ZDeque.cxx:94
 ZDeque.cxx:95
 ZDeque.cxx:96
 ZDeque.cxx:97
 ZDeque.cxx:98
 ZDeque.cxx:99
 ZDeque.cxx:100
 ZDeque.cxx:101
 ZDeque.cxx:102
 ZDeque.cxx:103
 ZDeque.cxx:104
 ZDeque.cxx:105
 ZDeque.cxx:106
 ZDeque.cxx:107
 ZDeque.cxx:108
 ZDeque.cxx:109
 ZDeque.cxx:110
 ZDeque.cxx:111
 ZDeque.cxx:112
 ZDeque.cxx:113
 ZDeque.cxx:114
 ZDeque.cxx:115
 ZDeque.cxx:116
 ZDeque.cxx:117
 ZDeque.cxx:118
 ZDeque.cxx:119
 ZDeque.cxx:120
 ZDeque.cxx:121
 ZDeque.cxx:122
 ZDeque.cxx:123
 ZDeque.cxx:124
 ZDeque.cxx:125
 ZDeque.cxx:126
 ZDeque.cxx:127
 ZDeque.cxx:128
 ZDeque.cxx:129
 ZDeque.cxx:130
 ZDeque.cxx:131
 ZDeque.cxx:132
 ZDeque.cxx:133
 ZDeque.cxx:134
 ZDeque.cxx:135
 ZDeque.cxx:136
 ZDeque.cxx:137
 ZDeque.cxx:138
 ZDeque.cxx:139
 ZDeque.cxx:140
 ZDeque.cxx:141
 ZDeque.cxx:142
 ZDeque.cxx:143
 ZDeque.cxx:144
 ZDeque.cxx:145
 ZDeque.cxx:146
 ZDeque.cxx:147
 ZDeque.cxx:148
 ZDeque.cxx:149
 ZDeque.cxx:150
 ZDeque.cxx:151
 ZDeque.cxx:152
 ZDeque.cxx:153
 ZDeque.cxx:154
 ZDeque.cxx:155
 ZDeque.cxx:156
 ZDeque.cxx:157
 ZDeque.cxx:158
 ZDeque.cxx:159
 ZDeque.cxx:160
 ZDeque.cxx:161
 ZDeque.cxx:162
 ZDeque.cxx:163
 ZDeque.cxx:164
 ZDeque.cxx:165
 ZDeque.cxx:166
 ZDeque.cxx:167
 ZDeque.cxx:168
 ZDeque.cxx:169
 ZDeque.cxx:170
 ZDeque.cxx:171
 ZDeque.cxx:172
 ZDeque.cxx:173
 ZDeque.cxx:174
 ZDeque.cxx:175
 ZDeque.cxx:176
 ZDeque.cxx:177
 ZDeque.cxx:178
 ZDeque.cxx:179
 ZDeque.cxx:180
 ZDeque.cxx:181
 ZDeque.cxx:182
 ZDeque.cxx:183
 ZDeque.cxx:184
 ZDeque.cxx:185
 ZDeque.cxx:186
 ZDeque.cxx:187
 ZDeque.cxx:188
 ZDeque.cxx:189
 ZDeque.cxx:190
 ZDeque.cxx:191
 ZDeque.cxx:192
 ZDeque.cxx:193
 ZDeque.cxx:194
 ZDeque.cxx:195
 ZDeque.cxx:196
 ZDeque.cxx:197
 ZDeque.cxx:198
 ZDeque.cxx:199
 ZDeque.cxx:200
 ZDeque.cxx:201
 ZDeque.cxx:202
 ZDeque.cxx:203
 ZDeque.cxx:204
 ZDeque.cxx:205
 ZDeque.cxx:206
 ZDeque.cxx:207
 ZDeque.cxx:208
 ZDeque.cxx:209
 ZDeque.cxx:210
 ZDeque.cxx:211
 ZDeque.cxx:212
 ZDeque.cxx:213
 ZDeque.cxx:214
 ZDeque.cxx:215
 ZDeque.cxx:216
 ZDeque.cxx:217
 ZDeque.cxx:218
 ZDeque.cxx:219
 ZDeque.cxx:220
 ZDeque.cxx:221
 ZDeque.cxx:222
 ZDeque.cxx:223
 ZDeque.cxx:224
 ZDeque.cxx:225
 ZDeque.cxx:226
 ZDeque.cxx:227
 ZDeque.cxx:228
 ZDeque.cxx:229
 ZDeque.cxx:230
 ZDeque.cxx:231
 ZDeque.cxx:232
 ZDeque.cxx:233
 ZDeque.cxx:234
 ZDeque.cxx:235
 ZDeque.cxx:236
 ZDeque.cxx:237
 ZDeque.cxx:238
 ZDeque.cxx:239
 ZDeque.cxx:240
 ZDeque.cxx:241
 ZDeque.cxx:242
 ZDeque.cxx:243
 ZDeque.cxx:244
 ZDeque.cxx:245
 ZDeque.cxx:246
 ZDeque.cxx:247
 ZDeque.cxx:248
 ZDeque.cxx:249
 ZDeque.cxx:250
 ZDeque.cxx:251
 ZDeque.cxx:252
 ZDeque.cxx:253
 ZDeque.cxx:254
 ZDeque.cxx:255
 ZDeque.cxx:256
 ZDeque.cxx:257
 ZDeque.cxx:258
 ZDeque.cxx:259
 ZDeque.cxx:260
 ZDeque.cxx:261
 ZDeque.cxx:262
 ZDeque.cxx:263
 ZDeque.cxx:264
 ZDeque.cxx:265
 ZDeque.cxx:266
 ZDeque.cxx:267
 ZDeque.cxx:268
 ZDeque.cxx:269