ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#ifndef AliEveAliEveHOMERSourceMap_H
#define AliEveAliEveHOMERSourceMap_H

#include "AliEveHOMERSource.h"

#include <TNamed.h>

#include <map>

//______________________________________________________________________________
//
// AliEveHOMERSourceMap is an abstract container for HLT HOMER sources.
// The concrete implementations AliEveHOMERSourceMapByDet and
// AliEveHOMERSourceMapByType allow retrieval of HOMER sources in proper
// order as required for their display in EVE object browser.


class AliEveHOMERSourceMap : public TNamed
{
protected:
  // --- Inner structs ---

  struct iterator_imp_base
  {
    virtual ~iterator_imp_base() {}

    virtual const AliEveHOMERSource::SourceId&    id()    const = 0;
    virtual const AliEveHOMERSource::SourceState& state() const = 0;
    virtual       AliEveHOMERSource::SourceState& state() = 0;

    virtual iterator_imp_base* clone() const = 0;

    virtual iterator_imp_base& operator++() = 0;
    virtual bool operator!=(const iterator_imp_base& o) const = 0;

    virtual TString description() const = 0;
  };

public:
  // --- Inner structs ---

  struct iterator
  {
    iterator_imp_base* m_imp;

    iterator()                       :  m_imp(0)   {}
    iterator(const iterator& it)     :  m_imp(it.m_imp->clone())  {}
    iterator(iterator_imp_base* imp) :  m_imp(imp) {}
    ~iterator() { delete m_imp; }

    iterator& operator= (const iterator& o) { delete m_imp; m_imp = o.m_imp->clone(); return *this; }
    bool      operator!=(const iterator& o) { return m_imp->operator!=(*o.m_imp); }

    const AliEveHOMERSource::SourceId&    id()    { return m_imp->id(); }
          AliEveHOMERSource::SourceState& state() { return m_imp->state(); }

    Int_t   level();
    TString description() { return m_imp->description(); }

    iterator& operator++() { m_imp->operator++(); return *this; }
    iterator& skip_children()
    {
      Int_t lvl = level();
      do operator++(); while (level() > lvl);
      return *this;
    }
  };

  iterator begin() { return iterator(iterator_imp_begin()); }
  iterator end()   { return iterator(iterator_imp_end()); }

  enum ESourceGrouping_e { kSG_ByDet, kSG_ByType };

  // --- Interface ---

  AliEveHOMERSourceMap(ESourceGrouping_e grouping);
  virtual ~AliEveHOMERSourceMap() {}

  static AliEveHOMERSourceMap* Create(ESourceGrouping_e grouping);

  virtual void FillMap(const TList* handles, Bool_t def_state) = 0;

  void PrintXXX();


protected:
  ESourceGrouping_e fGrouping; // Not used so far ...

  virtual iterator_imp_base* iterator_imp_new()   = 0; // Not used so far ...
  virtual iterator_imp_base* iterator_imp_begin() = 0;
  virtual iterator_imp_base* iterator_imp_end()   = 0;

  ClassDef(AliEveHOMERSourceMap, 0); // A map of HOMER sources.
};

#endif
 AliEveHOMERSourceMap.h:1
 AliEveHOMERSourceMap.h:2
 AliEveHOMERSourceMap.h:3
 AliEveHOMERSourceMap.h:4
 AliEveHOMERSourceMap.h:5
 AliEveHOMERSourceMap.h:6
 AliEveHOMERSourceMap.h:7
 AliEveHOMERSourceMap.h:8
 AliEveHOMERSourceMap.h:9
 AliEveHOMERSourceMap.h:10
 AliEveHOMERSourceMap.h:11
 AliEveHOMERSourceMap.h:12
 AliEveHOMERSourceMap.h:13
 AliEveHOMERSourceMap.h:14
 AliEveHOMERSourceMap.h:15
 AliEveHOMERSourceMap.h:16
 AliEveHOMERSourceMap.h:17
 AliEveHOMERSourceMap.h:18
 AliEveHOMERSourceMap.h:19
 AliEveHOMERSourceMap.h:20
 AliEveHOMERSourceMap.h:21
 AliEveHOMERSourceMap.h:22
 AliEveHOMERSourceMap.h:23
 AliEveHOMERSourceMap.h:24
 AliEveHOMERSourceMap.h:25
 AliEveHOMERSourceMap.h:26
 AliEveHOMERSourceMap.h:27
 AliEveHOMERSourceMap.h:28
 AliEveHOMERSourceMap.h:29
 AliEveHOMERSourceMap.h:30
 AliEveHOMERSourceMap.h:31
 AliEveHOMERSourceMap.h:32
 AliEveHOMERSourceMap.h:33
 AliEveHOMERSourceMap.h:34
 AliEveHOMERSourceMap.h:35
 AliEveHOMERSourceMap.h:36
 AliEveHOMERSourceMap.h:37
 AliEveHOMERSourceMap.h:38
 AliEveHOMERSourceMap.h:39
 AliEveHOMERSourceMap.h:40
 AliEveHOMERSourceMap.h:41
 AliEveHOMERSourceMap.h:42
 AliEveHOMERSourceMap.h:43
 AliEveHOMERSourceMap.h:44
 AliEveHOMERSourceMap.h:45
 AliEveHOMERSourceMap.h:46
 AliEveHOMERSourceMap.h:47
 AliEveHOMERSourceMap.h:48
 AliEveHOMERSourceMap.h:49
 AliEveHOMERSourceMap.h:50
 AliEveHOMERSourceMap.h:51
 AliEveHOMERSourceMap.h:52
 AliEveHOMERSourceMap.h:53
 AliEveHOMERSourceMap.h:54
 AliEveHOMERSourceMap.h:55
 AliEveHOMERSourceMap.h:56
 AliEveHOMERSourceMap.h:57
 AliEveHOMERSourceMap.h:58
 AliEveHOMERSourceMap.h:59
 AliEveHOMERSourceMap.h:60
 AliEveHOMERSourceMap.h:61
 AliEveHOMERSourceMap.h:62
 AliEveHOMERSourceMap.h:63
 AliEveHOMERSourceMap.h:64
 AliEveHOMERSourceMap.h:65
 AliEveHOMERSourceMap.h:66
 AliEveHOMERSourceMap.h:67
 AliEveHOMERSourceMap.h:68
 AliEveHOMERSourceMap.h:69
 AliEveHOMERSourceMap.h:70
 AliEveHOMERSourceMap.h:71
 AliEveHOMERSourceMap.h:72
 AliEveHOMERSourceMap.h:73
 AliEveHOMERSourceMap.h:74
 AliEveHOMERSourceMap.h:75
 AliEveHOMERSourceMap.h:76
 AliEveHOMERSourceMap.h:77
 AliEveHOMERSourceMap.h:78
 AliEveHOMERSourceMap.h:79
 AliEveHOMERSourceMap.h:80
 AliEveHOMERSourceMap.h:81
 AliEveHOMERSourceMap.h:82
 AliEveHOMERSourceMap.h:83
 AliEveHOMERSourceMap.h:84
 AliEveHOMERSourceMap.h:85
 AliEveHOMERSourceMap.h:86
 AliEveHOMERSourceMap.h:87
 AliEveHOMERSourceMap.h:88
 AliEveHOMERSourceMap.h:89
 AliEveHOMERSourceMap.h:90
 AliEveHOMERSourceMap.h:91
 AliEveHOMERSourceMap.h:92
 AliEveHOMERSourceMap.h:93
 AliEveHOMERSourceMap.h:94
 AliEveHOMERSourceMap.h:95
 AliEveHOMERSourceMap.h:96
 AliEveHOMERSourceMap.h:97
 AliEveHOMERSourceMap.h:98
 AliEveHOMERSourceMap.h:99
 AliEveHOMERSourceMap.h:100
 AliEveHOMERSourceMap.h:101
 AliEveHOMERSourceMap.h:102
 AliEveHOMERSourceMap.h:103
 AliEveHOMERSourceMap.h:104
 AliEveHOMERSourceMap.h:105