2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
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 **************************************************************************/
10 #ifndef AliEveAliEveHOMERSourceMap_H
11 #define AliEveAliEveHOMERSourceMap_H
13 #include "AliEveHOMERSource.h"
19 //______________________________________________________________________________
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.
27 class AliEveHOMERSourceMap : public TNamed
30 // --- Inner structs ---
32 struct iterator_imp_base
34 virtual ~iterator_imp_base() {}
36 virtual const AliEveHOMERSource::SourceId& id() const = 0;
37 virtual const AliEveHOMERSource::SourceState& state() const = 0;
38 virtual AliEveHOMERSource::SourceState& state() = 0;
40 virtual iterator_imp_base* clone() const = 0;
42 virtual iterator_imp_base& operator++() = 0;
43 virtual bool operator!=(const iterator_imp_base& o) const = 0;
45 virtual TString description() const = 0;
49 // --- Inner structs ---
53 iterator_imp_base* m_imp;
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; }
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); }
63 const AliEveHOMERSource::SourceId& id() { return m_imp->id(); }
64 AliEveHOMERSource::SourceState& state() { return m_imp->state(); }
67 TString description() { return m_imp->description(); }
69 iterator& operator++() { m_imp->operator++(); return *this; }
70 iterator& skip_children()
73 do operator++(); while (level() > lvl);
78 iterator begin() { return iterator(iterator_imp_begin()); }
79 iterator end() { return iterator(iterator_imp_end()); }
81 enum ESourceGrouping_e { kSG_ByDet, kSG_ByType };
85 AliEveHOMERSourceMap(ESourceGrouping_e grouping);
86 virtual ~AliEveHOMERSourceMap() {}
88 static AliEveHOMERSourceMap* Create(ESourceGrouping_e grouping);
90 virtual void FillMap(const TList* handles, Bool_t def_state) = 0;
96 ESourceGrouping_e fGrouping; // Not used so far ...
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;
102 ClassDef(AliEveHOMERSourceMap, 0); // A map of HOMER sources.
105 /******************************************************************************/
107 class AliEveHOMERSourceMapByDet : public AliEveHOMERSourceMap
110 AliEveHOMERSourceMapByDet(ESourceGrouping_e grouping);
111 virtual ~AliEveHOMERSourceMapByDet() {}
113 virtual void FillMap(const TList* handles, Bool_t def_state);
116 typedef std::map<AliEveHOMERSource::SourceId,
117 AliEveHOMERSource::SourceState,
118 AliEveHOMERSource::SourceId::CmpByDet> Map_t;
119 typedef Map_t::iterator Map_i;
123 struct iterator_imp : public iterator_imp_base,
126 iterator_imp() : Map_i() {}
127 iterator_imp(Map_i mi) : Map_i(mi) {}
128 virtual ~iterator_imp() {}
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; }
134 virtual iterator_imp* clone() const
135 { return new iterator_imp(*this); }
137 virtual iterator_imp& operator++()
138 { Map_i::operator++(); return *this; }
140 virtual bool operator!=(const iterator_imp_base& rhs) const
141 { const Map_i &lhs = *this; return lhs != dynamic_cast<const Map_i&>(rhs); }
143 virtual TString description() const;
146 void insert(AliEveHOMERSource::SourceId& sid, AliEveHOMERSource::SourceState& sst, Bool_t def_state);
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()); }
153 // ClassDef(AliEveHOMERSourceMapByDet, 0);
156 /******************************************************************************/
158 class AliEveHOMERSourceMapByType : public AliEveHOMERSourceMap
161 AliEveHOMERSourceMapByType(ESourceGrouping_e grouping);
162 virtual ~AliEveHOMERSourceMapByType() {}
164 virtual void FillMap(const TList* handles, Bool_t def_state);
167 typedef std::map<AliEveHOMERSource::SourceId,
168 AliEveHOMERSource::SourceState,
169 AliEveHOMERSource::SourceId::CmpByType> Map_t;
170 typedef Map_t::iterator Map_i;
174 struct iterator_imp : public iterator_imp_base,
177 iterator_imp() : Map_i() {}
178 iterator_imp(Map_i mi) : Map_i(mi) {}
179 virtual ~iterator_imp() {}
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; }
185 virtual iterator_imp* clone() const
186 { return new iterator_imp(*this); }
188 virtual iterator_imp& operator++()
189 { Map_i::operator++(); return *this; }
191 virtual bool operator!=(const iterator_imp_base& rhs) const
192 { const Map_i &lhs = *this; return lhs != dynamic_cast<const Map_i&>(rhs); }
194 virtual TString description() const;
197 void insert(AliEveHOMERSource::SourceId& sid, AliEveHOMERSource::SourceState& sst, Bool_t def_state);
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()); }
203 // ClassDef(AliEveHOMERSourceMapByType, 0);