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

//__________________________________________________________________________
// ZStringMap
//
//

#include "ZStringMap.h"
#include "ZStringMap.c7"

ClassImp(ZStringMap);

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

void ZStringMap::_init()
{
  mAddLensPrefix = "undef-";
  mAddLensFormat = "%03d";
  mAddLensCurId  = 1;
}

/**************************************************************************/
// AList methods, protected part.
/**************************************************************************/

Int_t ZStringMap::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);
      StampListElementSet(0, i->first);
      ++n;
    }
  }
  return n;
}

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

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

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

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

  if(mSize == 0) return;

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

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

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

void ZStringMap::Add(ZGlass* lens)
{
  // Adds lens with the unique 'unknown' label. Label string is
  // specified by members mAddLensPrefix and mAddLensFormat.

  GMutexHolder llck(mListMutex);
  new_element_check(lens);
  TString  label;
  iterator i;
  do {
    label  = mAddLensPrefix;
    label += GForm(mAddLensFormat, mAddLensCurId++);
    i = mElements.find(label);
  } while(i != end());
  if(lens) lens->IncRefCount(this);
  pair<iterator, bool> r = mElements.insert(element(label, lens));
  ++mSize;
  i = r.first;
  on_insert(i);
  ++i;
  StampListInsertLabel(lens, label, i != end() ? i->first : "");
}

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

/**************************************************************************/
// Label operations
/**************************************************************************/

void ZStringMap::SetElementByLabel(ZGlass* lens, TString label)
{
  static const Exc_t _eh("ZStringMap::SetElementByLabel ");

  if(label.IsNull())
    throw(_eh + "argument label is null.");

  GMutexHolder llck(mListMutex);
  new_element_check(lens);

  iterator i = mElements.find(label);
  if(i != end()) {
    if(i->second == lens)
      return;
    ZGlass* exlens = i->second;
    if(lens) lens->IncRefCount(this);
    i->second = lens;
    if(exlens) exlens->DecRefCount(this);
    on_change(i, exlens);
    StampListElementSet(lens, label);
  } else {
    if(lens) lens->IncRefCount(this);
    pair<iterator, bool> r = mElements.insert(element(label, lens));
    ++mSize;
    i = r.first;
    on_insert(i);
    ++i;
    StampListInsertLabel(lens, label, i != end() ? i->first : "");
  }
}

void ZStringMap::AddLabel(TString label)
{
  static const Exc_t _eh("ZStringMap::AddLabel ");

  if(label.IsNull())
    throw(_eh + "argument label is null.");

  GMutexHolder llck(mListMutex);

  if(label.IsNull())
    throw(_eh + "null label supplied,");
  iterator i = mElements.find(label);
  if(i != end())
    throw(_eh + "label '" + label + "' already exists.");

  pair<iterator, bool> r = mElements.insert(element(label, 0));
  ++mSize;
  i = r.first;
  on_insert(i);
  ++i;
  StampListInsertLabel(0, label, i != end() ? i->first : "");

}

void ZStringMap::RemoveLabel(TString label)
{
  static const Exc_t _eh("ZStringMap::RemoveLabel ");

  if(label.IsNull())
    throw(_eh + "argument label is null.");

  GMutexHolder llck(mListMutex);

  iterator i = mElements.find(label);
  if(i == end())
    throw(_eh + "label '" + label + "' not found.");

  ZGlass* lens = i->second;
  on_remove(i);
  mElements.erase(i); --mSize;
  lens->DecRefCount(this);
  StampListRemoveLabel(lens, label);
}

void ZStringMap::ChangeLabel(TString label, TString new_label)
{
  // Renames label to new_label.
  // It is an error if new_label already exists.
  //
  // If successful it emits two rays: RemoveLabel and InsertLabel.

  static const Exc_t _eh("ZStringMap::ChangeLabel ");

  if(label.IsNull())
    throw(_eh + "argument label is null.");
  if(new_label.IsNull())
    throw(_eh + "argument new_label is null.");

  GMutexHolder llck(mListMutex);

  iterator i = mElements.find(new_label);
  if(i != end())
    throw(_eh + "new_label '" + new_label + "' already exists.");
  i = mElements.find(label);
  if(i == end())
    throw(_eh + "label '" + label + "' not found.");

  ZGlass* lens = i->second;
  mElements.erase(i);
  StampListRemoveLabel(lens, label);
  pair<iterator, bool> r = mElements.insert(element(new_label, lens));
  i = r.first;
  on_change_label(i, label);
  ++i;
  StampListInsertLabel(lens, new_label, i != end() ? i->first : "");
}

ZGlass* ZStringMap::GetElementByLabel(TString label)
{
  static const Exc_t _eh("ZStringMap::GetElementByLabel ");

  ZGlass* l;
  {
    GMutexHolder llck(mListMutex);
    iterator i = mElements.find(label);
    if(i == mElements.end())
      throw(_eh + "label not found.");
    l = i->second;
  }
  ZMIR* mir = get_MIR();
  if(mir && mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    GledNS::WriteLensID(b, l);
    mSaturn->ShootMIRResult(b);
  }
  return l;
}

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

void ZStringMap::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 >> mAddLensPrefix >> mAddLensFormat >> mAddLensCurId;
    TString str;
    ID_t    id;
    mElements.clear();
    container::iterator p = mElements.begin();
    for(Int_t i=0; i<mSize; ++i) {
      b >> id >> str;
      p = mElements.insert(p, element(str, GledNS::CastID2Lens(id)));
    }
    b.CheckByteCount(R__s, R__c, ZStringMap::IsA());

  } else {

    R__c = b.WriteVersion(ZStringMap::IsA(), kTRUE);
    AList::Streamer(b);
    b << mAddLensPrefix << mAddLensFormat << mAddLensCurId;
    for(iterator i=begin(); i!=end(); ++i)
      b << (i() ? i()->GetSaturnID() : (ID_t)0) << i->first;
    b.SetByteCount(R__c, kTRUE);

  }
}

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