]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveHLT/AliEveHOMERSourceMap.h
updated merging function (Michele)
[u/mrichter/AliRoot.git] / EVE / EveHLT / AliEveHOMERSourceMap.h
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #ifndef AliEveAliEveHOMERSourceMap_H
11 #define AliEveAliEveHOMERSourceMap_H
12
13 #include "AliEveHOMERSource.h"
14
15 #include <TNamed.h>
16
17 #include <map>
18
19 //______________________________________________________________________________
20 //
21 // AliEveHOMERSourceMap is an abstract container for HLT HOMER sources.
22 // The concrete implementations AliEveHOMERSourceMapByDet and
23 // AliEveHOMERSourceMapByType allow retrieval of HOMER sources in proper
24 // order as required for their display in EVE object browser.
25
26
27 class AliEveHOMERSourceMap : public TNamed
28 {
29 protected:
30   // --- Inner structs ---
31
32   struct iterator_imp_base
33   {
34     virtual ~iterator_imp_base() {}
35
36     virtual const AliEveHOMERSource::SourceId&    id()    const = 0;
37     virtual const AliEveHOMERSource::SourceState& state() const = 0;
38     virtual       AliEveHOMERSource::SourceState& state() = 0;
39
40     virtual iterator_imp_base* clone() const = 0;
41
42     virtual iterator_imp_base& operator++() = 0;
43     virtual bool operator!=(const iterator_imp_base& o) const = 0;
44
45     virtual TString description() const = 0;
46   };
47
48 public:
49   // --- Inner structs ---
50
51   struct iterator
52   {
53     iterator_imp_base* m_imp;
54
55     iterator()                       :  m_imp(0)   {}
56     iterator(const iterator& it)     :  m_imp(it.m_imp->clone())  {}
57     iterator(iterator_imp_base* imp) :  m_imp(imp) {}
58     ~iterator() { delete m_imp; }
59
60     iterator& operator= (const iterator& o) { delete m_imp; m_imp = o.m_imp->clone(); return *this; }
61     bool      operator!=(const iterator& o) { return m_imp->operator!=(*o.m_imp); }
62
63     const AliEveHOMERSource::SourceId&    id()    { return m_imp->id(); }
64           AliEveHOMERSource::SourceState& state() { return m_imp->state(); }
65
66     Int_t   level();
67     TString description() { return m_imp->description(); }
68
69     iterator& operator++() { m_imp->operator++(); return *this; }
70     iterator& skip_children()
71     {
72       Int_t lvl = level();
73       do operator++(); while (level() > lvl);
74       return *this;
75     }
76   };
77
78   iterator begin() { return iterator(iterator_imp_begin()); }
79   iterator end()   { return iterator(iterator_imp_end()); }
80
81   enum ESourceGrouping_e { kSG_ByDet, kSG_ByType };
82
83   // --- Interface ---
84
85   AliEveHOMERSourceMap(ESourceGrouping_e grouping);
86   virtual ~AliEveHOMERSourceMap() {}
87
88   static AliEveHOMERSourceMap* Create(ESourceGrouping_e grouping);
89
90   virtual void FillMap(const TList* handles, Bool_t def_state) = 0;
91
92   void PrintXXX();
93
94
95 protected:
96   ESourceGrouping_e fGrouping; // Not used so far ...
97
98   virtual iterator_imp_base* iterator_imp_new()   = 0; // Not used so far ...
99   virtual iterator_imp_base* iterator_imp_begin() = 0;
100   virtual iterator_imp_base* iterator_imp_end()   = 0;
101
102   ClassDef(AliEveHOMERSourceMap, 0); // A map of HOMER sources.
103 };
104
105 /******************************************************************************/
106
107 class AliEveHOMERSourceMapByDet : public AliEveHOMERSourceMap
108 {
109 public:
110   AliEveHOMERSourceMapByDet(ESourceGrouping_e grouping);
111   virtual ~AliEveHOMERSourceMapByDet() {}
112
113   virtual void FillMap(const TList* handles, Bool_t def_state);
114
115 protected:
116   typedef std::map<AliEveHOMERSource::SourceId,
117                    AliEveHOMERSource::SourceState,
118                    AliEveHOMERSource::SourceId::CmpByDet>  Map_t;
119   typedef Map_t::iterator                                  Map_i;
120
121   Map_t fMap;
122
123   struct iterator_imp : public iterator_imp_base,
124                         public Map_i
125   {
126     iterator_imp()         : Map_i()   {}
127     iterator_imp(Map_i mi) : Map_i(mi) {}
128     virtual ~iterator_imp() {}
129
130     virtual const AliEveHOMERSource::SourceId&    id()    const { return Map_i::operator*().first; }
131     virtual const AliEveHOMERSource::SourceState& state() const { return Map_i::operator*().second; }
132     virtual       AliEveHOMERSource::SourceState& state() { return Map_i::operator*().second; }
133
134     virtual iterator_imp* clone() const
135     { return new iterator_imp(*this); }
136
137     virtual iterator_imp& operator++()
138     { Map_i::operator++(); return *this; }
139
140     virtual bool operator!=(const iterator_imp_base& rhs) const
141     { const Map_i &lhs = *this; return lhs != dynamic_cast<const Map_i&>(rhs); }
142
143     virtual TString description() const;
144   };
145
146   void insert(AliEveHOMERSource::SourceId& sid, AliEveHOMERSource::SourceState& sst, Bool_t def_state);
147
148   virtual iterator_imp_base* iterator_imp_new()   { return new iterator_imp; }
149   virtual iterator_imp_base* iterator_imp_begin() { return new iterator_imp(fMap.begin()); }
150   virtual iterator_imp_base* iterator_imp_end()   { return new iterator_imp(fMap.end());   }
151
152
153   // ClassDef(AliEveHOMERSourceMapByDet, 0);
154 };
155
156 /******************************************************************************/
157
158 class AliEveHOMERSourceMapByType : public AliEveHOMERSourceMap
159 {
160 public:
161   AliEveHOMERSourceMapByType(ESourceGrouping_e grouping);
162   virtual ~AliEveHOMERSourceMapByType() {}
163
164   virtual void FillMap(const TList* handles, Bool_t def_state);
165
166 protected:
167   typedef std::map<AliEveHOMERSource::SourceId,
168                    AliEveHOMERSource::SourceState,
169                    AliEveHOMERSource::SourceId::CmpByType> Map_t;
170   typedef Map_t::iterator                                  Map_i;
171
172   Map_t fMap;
173
174   struct iterator_imp : public iterator_imp_base,
175                         public Map_i
176   {
177     iterator_imp()         : Map_i()   {}
178     iterator_imp(Map_i mi) : Map_i(mi) {}
179     virtual ~iterator_imp() {}
180
181     virtual const AliEveHOMERSource::SourceId&    id()    const { return Map_i::operator*().first; }
182     virtual const AliEveHOMERSource::SourceState& state() const { return Map_i::operator*().second; }
183     virtual       AliEveHOMERSource::SourceState& state() { return Map_i::operator*().second; }
184
185     virtual iterator_imp* clone() const
186     { return new iterator_imp(*this); }
187
188     virtual iterator_imp& operator++()
189     { Map_i::operator++(); return *this; }
190
191     virtual bool operator!=(const iterator_imp_base& rhs) const
192     { const Map_i &lhs = *this; return lhs != dynamic_cast<const Map_i&>(rhs); }
193
194     virtual TString description() const;
195   };
196
197   void insert(AliEveHOMERSource::SourceId& sid, AliEveHOMERSource::SourceState& sst, Bool_t def_state);
198
199   virtual iterator_imp_base* iterator_imp_new()   { return new iterator_imp; }
200   virtual iterator_imp_base* iterator_imp_begin() { return new iterator_imp(fMap.begin()); }
201   virtual iterator_imp_base* iterator_imp_end()   { return new iterator_imp(fMap.end());   }
202
203   // ClassDef(AliEveHOMERSourceMapByType, 0);
204 };
205
206 #endif