// @(#)root/proofplayer:$Id$
// Author: Axel Naumann, 2010-06-09

/*************************************************************************
 * Copyright (C) 1995-2010, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TOutputListSelectorDataMap                                           //
//                                                                      //
// Set the selector's data members to the corresponding elements of the //
// output list.                                                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "TOutputListSelectorDataMap.h"

#include "TClass.h"
#include "TDataMember.h"
#include "TExMap.h"
#include "THashTable.h"
#include "TList.h"
#include "TMemberInspector.h"
#include "TProofDebug.h"
#include "TSelector.h"
#include "TSelectorCint.h"

#include <cstddef>

namespace {

   static TClass* IsSettableDataMember(TDataMember* dm) {
      if (!dm || !dm->IsaPointer() || dm->IsBasic()) return 0;
      TString dtTypeName = dm->GetFullTypeName();
      if (!dtTypeName.EndsWith("*")) return 0;
      dtTypeName.Remove(dtTypeName.Length()-1);
      return TClass::GetClass(dtTypeName);
   }

   class TSetSelDataMembers: public TMemberInspector {
   public:
      TSetSelDataMembers(const TOutputListSelectorDataMap& owner, TCollection* dmInfo, TList* output);
      using TMemberInspector::Inspect;
      void Inspect(TClass *cl, const char *parent, const char *name, const void *addr, Bool_t isTransient);
      Ssiz_t GetNumSet() const { return fNumSet; }
   private:
      TCollection* fDMInfo; // output list object name / member name pairs for output list entries
      TList* fOutputList; // merged output list
      Ssiz_t fNumSet; // number of initialized data members
      const TOutputListSelectorDataMap& fOwner; // owner, used for messaging
   };
}

//______________________________________________________________________________
TSetSelDataMembers::TSetSelDataMembers(const TOutputListSelectorDataMap& owner,
                                       TCollection* dmInfo, TList* output):
   fDMInfo(dmInfo), fOutputList(output), fNumSet(0), fOwner(owner)
{}

//______________________________________________________________________________
void TSetSelDataMembers::Inspect(TClass *cl, const char* parent, const char *name, const void *addr, Bool_t /* isTransient */)
{
   // This method is called by the ShowMembers() method for each
   // data member to recursively collect all base classes' members.
   //
   //    cl     is the pointer to the current class
   //    parent is the parent name (in case of composed objects)
   //    name   is the data member name
   //    addr   is the data member address

   while (name[0] == '*') ++name;

   TObject* mapping = fDMInfo->FindObject(name);
   if (!mapping) return;

   PDB(kOutput,1) fOwner.Info("SetDataMembers()",
                              "data member `%s%s::%s' maps to output list object `%s'",
                              cl->GetName(), parent, name, mapping->GetTitle());

   TObject* outputObj = fOutputList->FindObject(mapping->GetTitle());
   if (!outputObj) {
      PDB(kOutput,1) fOwner.Warning("SetDataMembers()",
                                    "object `%s' not found in output list!",
                                    mapping->GetTitle());
      return;
   }

   // Check data member type
   TDataMember *dm = cl->GetDataMember(name);
   TClass* cldt = IsSettableDataMember(dm);
   if (!cldt) {
      PDB(kOutput,1) fOwner.Warning("SetDataMembers()",
                                    "unusable data member `%s' should have been detected by TCollectDataMembers!",
                                    name);
      return;
   }

   char *pointer = (char*)addr;
   char **ppointer = (char**)(pointer);
   if (*ppointer) {
      // member points to something - replace instead of delete to not crash on deleting uninitialized values.
      fOwner.Warning("SetDataMembers()", "potential memory leak: replacing data member `%s' != 0. "
                     "Please initialize %s to 0 in constructor %s::%s()",
                     name, name, cl->GetName(), cl->GetName());
   }
   *ppointer = (char*)outputObj;
   ++fNumSet;
}


namespace {
   class TCollectDataMembers: public TMemberInspector {
   public:
      TCollectDataMembers(const TOutputListSelectorDataMap& owner): fOwner(owner) { }
      ~TCollectDataMembers();
      using TMemberInspector::Inspect;
      void Inspect(TClass *cl, const char *parent, const char *name, const void *addr, Bool_t isTransient);
      TExMap& GetMemberPointers() { return fMap; }
   private:
      TExMap fMap; //map of data member's value to TDataMember
      const TOutputListSelectorDataMap& fOwner; //owner, used for messaging
   };
}

//______________________________________________________________________________
void TCollectDataMembers::Inspect(TClass *cl, const char* /*parent*/, const char *name, const void *addr, Bool_t /* isTransient */)
{
   // This method is called by the ShowMembers() method for each
   // data member to recursively collect all base classes' members.
   //
   //    cl     is the pointer to the current class
   //    parent is the parent name (in case of composed objects)
   //    name   is the data member name
   //    addr   is the data member address
   TDataMember *dm = cl->GetDataMember(name);
   if (!IsSettableDataMember(dm)) return;

   char *pointer = (char*)addr;
   char **ppointer = (char**)(pointer);
   char **p3pointer = (char**)(*ppointer);
   if (p3pointer) {
      // The data member points to something.
      // Handle multiple pointers to the same output list object:
      TObject* prev = (TObject*) (ptrdiff_t)fMap.GetValue((Long64_t)(ptrdiff_t)p3pointer);
      if (prev) {
         // We have a previous entry - is it a data member or already a TList (of data members)?
         if (prev->InheritsFrom(TDataMember::Class())) {
            fMap.Remove((Long64_t)(ptrdiff_t)p3pointer);
            TList* dmList = new TList;
            dmList->Add(prev);
            dmList->Add(dm);
            fMap.Add((Long64_t)(ptrdiff_t)p3pointer, (Long64_t)(ptrdiff_t)dmList);
         } else {
            TList* prevList = (TList*) prev;
            prevList->Add(dm);
         }
      } else {
         fMap.Add((Long64_t)(ptrdiff_t)p3pointer, (Long64_t)(ptrdiff_t)dm);
      }
      if (name[0] == '*') ++name;
      PDB(kOutput,1) fOwner.Info("Init()", "considering data member `%s'", name);
   }
}

TCollectDataMembers::~TCollectDataMembers() {
   // Destructor

   // Clean up collection of TDataMembers in fMap
   TExMapIter iMembers(&fMap);
   Long64_t key;
   Long64_t value;
   while (iMembers.Next(key, value)) {
      TObject* obj = (TObject*) (ptrdiff_t) value;
      if (obj->InheritsFrom(TList::Class())) {
         delete obj;
      }
   }
}

ClassImp(TOutputListSelectorDataMap);

//______________________________________________________________________________
TOutputListSelectorDataMap::TOutputListSelectorDataMap(TSelector* sel /*= 0*/):
   fMap(0)
{
   // Create a mapper between output list items and TSelector data members.
   if (sel) Init(sel);
}

//______________________________________________________________________________
const char* TOutputListSelectorDataMap::GetName() const
{
   // Return static name for TOutputListSelectorDataMap objects.
   return "PROOF_TOutputListSelectorDataMap_object";
}

//______________________________________________________________________________
Bool_t TOutputListSelectorDataMap::Init(TSelector* sel)
{
   // Initialize the data member <-> output list mapping from a selector.
   if (!sel) {
      PDB(kOutput,1) Warning("Init","Leave (no selector!)");
      return kFALSE;
   }
   TCollection* outList = sel->GetOutputList();
   if (!outList) {
      PDB(kOutput,1) Info("Init()","Leave (no output)");
      return kFALSE;
   }

   if (outList->FindObject(GetName())) {
      // mapping already exists?!
      PDB(kOutput,1) Warning("Init","Mapping already exists!");
      return kFALSE;
   }

   if (fMap) delete fMap;
   fMap = new THashTable;
   fMap->SetOwner();

   TCollectDataMembers cdm(*this);
   TClass* cl = sel->IsA();
   if (cl && cl->InheritsFrom(TSelectorCint::Class())) {
      // we don't want to set TSelectorCint's data members, but
      // the data members that it represents!
      TSelectorCint* selCINT = dynamic_cast<TSelectorCint*>(sel);
      if (selCINT) {
         cl = selCINT->GetInterpretedClass();
         sel = selCINT->GetInterpretedSelector();
      } else {
         cl = 0;
         Error("Init", "failed to get TSelectorCint interpreted class!");
      }
   }
   if (!cl || (cl && !cl->CallShowMembers(sel, cdm))) {
      // failed to map
      PDB(kOutput,1) Warning("Init","Failed to determine mapping!");
      return kFALSE;
   }
   PDB(kOutput,1) Info("Init()","Found %d data members.",
                        cdm.GetMemberPointers().GetSize());

   // Iterate over output list entries and find data members pointing to the
   // same value. Store that mapping (or a miss).
   TIter iOutput(outList);
   TObject* output;
   TList oneDM;
   while ((output = iOutput())) {
      TObject* obj = (TObject*) (ptrdiff_t)cdm.GetMemberPointers().GetValue((Long64_t)(ptrdiff_t)output);
      if (!obj) continue;

      TList* addAllDM = 0;
      if (obj->InheritsFrom(TDataMember::Class())) {
         oneDM.Add(obj);
         addAllDM = &oneDM;
      } else {
         addAllDM = (TList*) obj;
      }
      TIter iDM(addAllDM);
      TDataMember* dm = 0;
      while ((dm = (TDataMember*) iDM())) {
         fMap->Add(new TNamed(dm->GetName(), output->GetName()));
         PDB(kOutput,1) Info("Init()","Data member `%s' corresponds to output `%s'",
                              dm->GetName(), output->GetName());
      }
      oneDM.Clear();
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TOutputListSelectorDataMap::SetDataMembers(TSelector* sel) const
{
   // Given an output list, set the data members of a TSelector.
   TList* output = sel->GetOutputList();
   if (!output || output->IsEmpty()) return kTRUE;

   Bool_t res = kFALSE;
   // Set fSelector's data members
   TSetSelDataMembers ssdm(*this, fMap, output);
   TClass* cl = sel->IsA();
   if (cl) {
      if (cl->InheritsFrom(TSelectorCint::Class())) {
         // we don't want to set TSelectorCint's data members, but
         // the data members that it represents!
         TSelectorCint* selCINT = dynamic_cast<TSelectorCint*>(sel);
         if (selCINT) {
            cl = selCINT->GetInterpretedClass();
            sel = selCINT->GetInterpretedSelector();
         } else {
            cl = 0;
            Error("Init", "failed to get TSelectorCint interpreted class!");
            return kFALSE;
         }
      }
      res = cl->CallShowMembers(sel, ssdm);
      PDB(kOutput,1) Info("SetDataMembers()","%s, set %d data members.",
                        (res ? "success" : "failure"), ssdm.GetNumSet());
   } else {
      PDB(kOutput,1) Warning("SetDataMembers","Failed to determine selector TClass!");
   }
   return res;
}

//______________________________________________________________________________
Bool_t TOutputListSelectorDataMap::Merge(TObject* obj)
{
   // Merge another TOutputListSelectorDataMap object, check
   // consistency.
   TOutputListSelectorDataMap* other = dynamic_cast<TOutputListSelectorDataMap*>(obj);
   if (!other) return kFALSE;

   // check for consistency
   TIter iMapping(other->GetMap());
   TNamed* mapping = 0;
   while ((mapping = (TNamed*)iMapping())) {
      TObject* oldMap = fMap->FindObject(mapping->GetName());
      if (!oldMap) {
         fMap->Add(new TNamed(*mapping));
      } else {
         if (strcmp(oldMap->GetTitle(), mapping->GetTitle())) {
            // ouch, contradicting maps!
            PDB(kOutput,1)
               Warning("Merge()",
                       "contradicting mapping for data member `%s' (output list entry `%s' vs. `%s'). "
                       "Cancelling automatic TSelector data member setting!",
                       mapping->GetName(), oldMap->GetTitle(), mapping->GetTitle());
            fMap->Clear();
            return kFALSE;
         }
      }
   }
   return kTRUE;
}

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