// $Id$
#include "AliMUON2DMapIterator.h"
-#include "AliMpExMap.h"
-#include "TMap.h"
-#include "AliLog.h"
-#include "AliMpIntPair.h"
-#include "AliMUONObjectPair.h"
+//-----------------------------------------------------------------------------
/// \class AliMUON2DMapIterator
-/// Implementation of AliMUONVDataIterator for 2Dmaps
+/// Implementation of TIterator for 2Dmaps
///
/// A simple implementation of VDataIterator for 2Dmaps.
///
/// \author Laurent Aphecetche
+//-----------------------------------------------------------------------------
+
+#include "AliMpExMap.h"
/// \cond CLASSIMP
ClassImp(AliMUON2DMapIterator)
/// \endcond
//_____________________________________________________________________________
-AliMUON2DMapIterator::AliMUON2DMapIterator(AliMpExMap& theMap)
-: AliMUONVDataIterator(),
-fIter(theMap.GetIterator()),
-fIter2(0x0),
-fCurrentI(-1),
-fCurrentJ(-1)
+AliMUON2DMapIterator::AliMUON2DMapIterator(AliMpExMap* theMap)
+: TIterator(),
+fMap(theMap),
+fCurrentMap(0x0),
+fI(-1),
+fJ(-1)
{
- // default ctor
+ /// default ctor
Reset();
}
//_____________________________________________________________________________
-AliMUON2DMapIterator::~AliMUON2DMapIterator()
+AliMUON2DMapIterator::AliMUON2DMapIterator(const AliMUON2DMapIterator& rhs)
+: TIterator(rhs),
+fMap(rhs.fMap),
+fCurrentMap(rhs.fCurrentMap),
+fI(rhs.fI),
+fJ(rhs.fI)
{
- // dtor
- delete fIter2;
+ /// copy ctor
}
//_____________________________________________________________________________
-TObject*
-AliMUON2DMapIterator::GetValue(TExMapIter& iter, Int_t& theKey) const
+AliMUON2DMapIterator&
+AliMUON2DMapIterator::operator=(const AliMUON2DMapIterator& rhs)
{
- // return the value corresponding to theKey in iterator iter
- theKey = -1;
- Long_t key, value;
- Bool_t ok = iter.Next(key,value);
- if (!ok) return 0x0;
- theKey = (Int_t)(key & 0xFFFF);
- return reinterpret_cast<TObject*>(value);
+ /// assignment operator
+ if ( this != &rhs )
+ {
+ fMap = rhs.fMap;
+ fCurrentMap = rhs.fCurrentMap;
+ fI = rhs.fI;
+ fJ = rhs.fJ;
+ }
+ return *this;
}
//_____________________________________________________________________________
-AliMpExMap*
-AliMUON2DMapIterator::GetMap(TExMapIter& iter, Int_t& key)
+TIterator&
+AliMUON2DMapIterator::operator=(const TIterator& rhs)
{
- // get the map corresponding to key
- AliMpExMap* rv(0x0);
- TObject* o = GetValue(iter,key);
- if (o)
+ /// overriden operator= (imposed by Root's definition of TIterator::operator= ?)
+
+ if ( this != &rhs && rhs.IsA() == AliMUON2DMapIterator::Class() )
{
- rv = dynamic_cast<AliMpExMap*>(o);
- if (!rv)
- {
- AliFatal("boom");
- }
+ const AliMUON2DMapIterator& rhs1 = static_cast<const AliMUON2DMapIterator&>(rhs);
+ fMap = rhs1.fMap;
+ fCurrentMap = rhs1.fCurrentMap;
+ fI = rhs1.fI;
+ fJ = rhs1.fJ;
}
- return rv;
+ return *this;
+}
+
+//_____________________________________________________________________________
+AliMUON2DMapIterator::~AliMUON2DMapIterator()
+{
+ /// dtor
+}
+
+//_____________________________________________________________________________
+const TCollection*
+AliMUON2DMapIterator::GetCollection() const
+{
+ /// Return 0 as we're not really dealing with a Root TCollection...
+ return 0x0;
+}
+
+//_____________________________________________________________________________
+AliMpExMap*
+AliMUON2DMapIterator::Map(Int_t i) const
+{
+ /// Get the map at a given index
+ return static_cast<AliMpExMap*>(fMap->GetObjectFast(i));
}
//_____________________________________________________________________________
TObject*
AliMUON2DMapIterator::Next()
{
- // logic :
- // get TObject* from fIter2
- // if null, increment fIter2 by getting next on fIter
+ /// return next object
+
+ if (!fCurrentMap) return 0x0;
- if (!fIter2) return 0x0;
+ ++fJ;
- TObject* o = GetValue(*fIter2,fCurrentJ);
- if (!o)
+ if ( fJ < fCurrentMap->GetSize() )
{
- // fIter2 exhausted, try to get the next one
- AliMpExMap* m = GetMap(fIter,fCurrentI);
- if (!m)
+ return fCurrentMap->GetObjectFast(fJ);
+ }
+ else
+ {
+ ++fI;
+ if ( fI < fMap->GetSize() )
{
- // nothing left, we are done.
- return 0x0;
+ fCurrentMap = Map(fI);
+ fJ = -1;
+ return Next();
}
- delete fIter2;
- fIter2 = new TExMapIter(m->GetIterator());
- o = GetValue(*fIter2,fCurrentJ);
- }
- return new AliMUONObjectPair(new AliMpIntPair(fCurrentI,fCurrentJ),o,
- kTRUE, /* owner of intpair */
- kFALSE /* but not of o */);
+ return 0x0;
+ }
}
//_____________________________________________________________________________
void
AliMUON2DMapIterator::Reset()
{
- // rewind the iterator
- delete fIter2;
- fIter.Reset();
- AliMpExMap* m = GetMap(fIter,fCurrentI);
- if (m)
+ /// rewind the iterator
+ fI = -1;
+ fJ = -1;
+ fCurrentMap = 0x0;
+
+ if ( fMap->GetSize() > 0 )
{
- fIter2 = new TExMapIter(m->GetIterator());
- }
+ fI = 0;
+ fCurrentMap = Map(fI);
+ fJ = -1;
+ }
}
-//_____________________________________________________________________________
-Bool_t
-AliMUON2DMapIterator::Remove()
-{
- // to be implemented if needed
- AliInfo("Not supported yet");
- return kFALSE;
-}