Implemented iterator (Laurent)
[u/mrichter/AliRoot.git] / MUON / AliMUON2DMapIterator.cxx
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15
16 // $Id$
17
18 #include "AliMUON2DMapIterator.h"
19 #include "AliMpExMap.h"
20 #include "TMap.h"
21 #include "AliLog.h"
22 #include "AliMpIntPair.h"
23
24 /// \class AliMUON2DMapIterator
25 /// \brief Implementation of AliMUONVDataIterator for 2Dmaps
26 /// 
27 /// A simple implementation of VDataIterator for 2Dmaps.
28 ///
29 /// \author Laurent Aphecetche
30
31 /// \cond CLASSIMP
32 ClassImp(AliMUON2DMapIterator)
33 /// \endcond
34
35 //_____________________________________________________________________________
36 AliMUON2DMapIterator::AliMUON2DMapIterator(AliMpExMap& theMap)
37 : AliMUONVDataIterator(), 
38 fIter(theMap.GetIterator()),
39 fIter2(0x0),
40 fCurrentI(-1),
41 fCurrentJ(-1)
42 {
43   // default ctor
44   Reset();
45 }
46
47 //_____________________________________________________________________________
48 AliMUON2DMapIterator::~AliMUON2DMapIterator()
49 {
50   // dtor
51   delete fIter2;
52 }
53
54 //_____________________________________________________________________________
55 TObject*
56 AliMUON2DMapIterator::GetValue(TExMapIter& iter, Int_t& theKey) const
57 {
58   // return the value corresponding to theKey in iterator iter
59   theKey = -1;
60   Long_t key, value;
61   Bool_t ok = iter.Next(key,value);
62   if (!ok) return 0x0;
63   theKey = (Int_t)(key & 0xFFFF);
64   return reinterpret_cast<TObject*>(value);
65 }
66
67 //_____________________________________________________________________________
68 AliMpExMap*
69 AliMUON2DMapIterator::GetMap(TExMapIter& iter, Int_t& key) 
70 {
71   // get the map corresponding to key
72   AliMpExMap* rv(0x0);
73   TObject* o = GetValue(iter,key);
74   if (o)
75   {
76     rv = dynamic_cast<AliMpExMap*>(o);
77     if (!rv)
78     {
79       AliFatal("boom");
80     }
81   }
82   return rv;
83 }
84
85 //_____________________________________________________________________________
86 TObject*
87 AliMUON2DMapIterator::Next()
88 {
89   // logic :
90   // get TObject* from fIter2
91   // if null, increment fIter2 by getting next on fIter
92   
93   if (!fIter2) return 0x0;
94   
95   TObject* o = GetValue(*fIter2,fCurrentJ);
96   if (!o)
97   {
98     // fIter2 exhausted, try to get the next one
99     AliMpExMap* m = GetMap(fIter,fCurrentI);
100     if (!m)
101     {
102       // nothing left, we are done.
103       return 0x0;
104     }
105     delete fIter2;
106     fIter2 = new TExMapIter(m->GetIterator());
107     o = GetValue(*fIter2,fCurrentJ);
108   }
109   return new TPair(new AliMpIntPair(fCurrentI,fCurrentJ),o);
110 }
111
112 //_____________________________________________________________________________
113 void
114 AliMUON2DMapIterator::Reset()
115 {
116   // rewind the iterator
117   delete fIter2;
118   fIter.Reset();
119   AliMpExMap* m = GetMap(fIter,fCurrentI);
120   if (m)
121   {
122     fIter2 = new TExMapIter(m->GetIterator());
123   }  
124 }
125
126 //_____________________________________________________________________________
127 Bool_t
128 AliMUON2DMapIterator::Remove()
129 {
130   // to be implemented if needed
131   AliInfo("Not supported yet");
132   return kFALSE;
133 }