ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

#include "AliMUON2DMap.h"

#include "AliLog.h"
#include "AliMUON2DMapIterator.h"
#include "AliMUON2DMapIteratorByI.h"
#include "AliMpExMap.h"
#include "AliMpExMapIterator.h"

//-----------------------------------------------------------------------------
/// \class AliMUON2DMap
/// Basic implementation of AliMUONVStore container using
/// AliMpExMap internally.
/// What we store is a "double" map : an AliMpExMap of AliMpExMaps
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

/// \cond CLASSIMP
ClassImp(AliMUON2DMap)
/// \endcond

const Int_t AliMUON2DMap::fgkOptimalSizeForDEManu = 228;

//_____________________________________________________________________________
AliMUON2DMap::AliMUON2DMap(TRootIOCtor*)
: AliMUONVStore(), 
fMap(0x0),
fOptimizeForDEManu(kFALSE)
{
  /// Root I/O constructor.
}

//_____________________________________________________________________________
AliMUON2DMap::AliMUON2DMap(Bool_t optimizeForDEManu) 
: AliMUONVStore(), 
  fMap(new AliMpExMap),
  fOptimizeForDEManu(optimizeForDEManu)
{
  /// Default constructor.
  // hard-coded constant in order not to depend on mapping
  // if this number ever change, it will not break the code, simply the
  // automatic resizing will give a warning...
    
  if ( fOptimizeForDEManu ) fMap->SetSize(fgkOptimalSizeForDEManu); 
}

//_____________________________________________________________________________
AliMUON2DMap::AliMUON2DMap(const AliMUON2DMap& other)
: AliMUONVStore(),
  fMap(new AliMpExMap(*other.fMap)),
  fOptimizeForDEManu(other.fOptimizeForDEManu)
{
 /// Copy constructor.
}

//_____________________________________________________________________________
AliMUON2DMap&
AliMUON2DMap::operator=(const AliMUON2DMap& other)
{
/// Assignment operator
  if ( this != &other )
  {
    *fMap = *other.fMap;
    fOptimizeForDEManu = other.fOptimizeForDEManu;
  }
  return *this;
}

//_____________________________________________________________________________
AliMUON2DMap::~AliMUON2DMap()
{
/// Destructor. 
/// We delete the map, which will delete the objects, as we're owner.
  delete fMap;
}

//_____________________________________________________________________________
AliMUONVStore*
AliMUON2DMap::Create() const
{
  /// Create a void copy of *this. 
  return new AliMUON2DMap(fOptimizeForDEManu);
}

//_____________________________________________________________________________
Bool_t
AliMUON2DMap::Add(TObject* object)
{
  /// Add object, using the decoding of uniqueID into two ints as the key
  if (!object) return kFALSE;
  UInt_t uniqueID = object->GetUniqueID();
  Int_t j = ( uniqueID & 0xFFFF0000 ) >> 16;
  Int_t i = ( uniqueID & 0xFFFF);
  return Set(i,j,object,kFALSE);
}

//_____________________________________________________________________________
TObject* 
AliMUON2DMap::FindObject(UInt_t uid) const
{
  /// Return the value at position uid
  
  Int_t j = ( uid & 0xFFFF0000 ) >> 16;
  Int_t i = ( uid & 0xFFFF);
  return FindObject(i,j);
}

//_____________________________________________________________________________
TObject* 
AliMUON2DMap::FindObject(Int_t i, Int_t j) const
{
  /// Return the value at position (i,j).
  AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
  return m ? m->GetValue(j) : 0x0;
}

//_____________________________________________________________________________
TIterator*
AliMUON2DMap::CreateIterator() const
{
  // Create and return an iterator on this map
  // Returned iterator must be deleted by user.
  return new AliMUON2DMapIterator(*fMap);
}

//_____________________________________________________________________________
TIterator*
AliMUON2DMap::CreateIterator(Int_t firstI, Int_t lastI) const
{
  // Create and return an iterator on this map
  // Returned iterator must be deleted by user.
  return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI);
}

//_____________________________________________________________________________
void 
AliMUON2DMap::Clear(Option_t*)
{
  /// Clear memory
  fMap->Clear();
}  

//_____________________________________________________________________________
Int_t 
AliMUON2DMap::GetSize() const
{
  /// Return the number of objects we hold
  TIter next(fMap->CreateIterator());
  Int_t theSize(0);
  AliMpExMap* m;
  
  while ( ( m = static_cast<AliMpExMap*>(next()) ) )
  {
    TIter next2(m->CreateIterator());
    while ( next2() ) 
    {
      ++theSize;
    }
  }
  return theSize;
}

//_____________________________________________________________________________
Int_t 
AliMUON2DMap::GetSize(Int_t i) const
{
  /// Return the number of objects we hold
  AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
  return m ? m->GetSize() : 0;
}

//_____________________________________________________________________________
Bool_t 
AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace)
{
/// Set the object at position (i,j).
/// If replace==kTRUE, we don't care if there's an object there already,
/// otherwise we might refuse to set if the (i,j) location is already
/// filled (in which case we return kFALSE).
  
  TObject* o = fMap->GetValue(i);
  if ( !o )
  {
    AliMpExMap* m = new AliMpExMap;
    if ( fOptimizeForDEManu ) 
    {
      m->SetSize(451); // same remark as for the SetSize in ctor...
    }
    fMap->Add(i,m);
    o = fMap->GetValue(i);
  }
  AliMpExMap* m = static_cast<AliMpExMap*>(o);
 
  o = m->GetValue(j);
  
  if ( !o )
  {
    m->Add(j,object);
  }
  else 
  {
    if ( replace ) 
    {
      delete o;
      m->Add(j,object);
    }
    else
    {
      AliError(Form("Object %p is already there for (i,j)=(%d,%d)",o,i,j));
      return kFALSE;
    }
  }

  return kTRUE;
}

 AliMUON2DMap.cxx:1
 AliMUON2DMap.cxx:2
 AliMUON2DMap.cxx:3
 AliMUON2DMap.cxx:4
 AliMUON2DMap.cxx:5
 AliMUON2DMap.cxx:6
 AliMUON2DMap.cxx:7
 AliMUON2DMap.cxx:8
 AliMUON2DMap.cxx:9
 AliMUON2DMap.cxx:10
 AliMUON2DMap.cxx:11
 AliMUON2DMap.cxx:12
 AliMUON2DMap.cxx:13
 AliMUON2DMap.cxx:14
 AliMUON2DMap.cxx:15
 AliMUON2DMap.cxx:16
 AliMUON2DMap.cxx:17
 AliMUON2DMap.cxx:18
 AliMUON2DMap.cxx:19
 AliMUON2DMap.cxx:20
 AliMUON2DMap.cxx:21
 AliMUON2DMap.cxx:22
 AliMUON2DMap.cxx:23
 AliMUON2DMap.cxx:24
 AliMUON2DMap.cxx:25
 AliMUON2DMap.cxx:26
 AliMUON2DMap.cxx:27
 AliMUON2DMap.cxx:28
 AliMUON2DMap.cxx:29
 AliMUON2DMap.cxx:30
 AliMUON2DMap.cxx:31
 AliMUON2DMap.cxx:32
 AliMUON2DMap.cxx:33
 AliMUON2DMap.cxx:34
 AliMUON2DMap.cxx:35
 AliMUON2DMap.cxx:36
 AliMUON2DMap.cxx:37
 AliMUON2DMap.cxx:38
 AliMUON2DMap.cxx:39
 AliMUON2DMap.cxx:40
 AliMUON2DMap.cxx:41
 AliMUON2DMap.cxx:42
 AliMUON2DMap.cxx:43
 AliMUON2DMap.cxx:44
 AliMUON2DMap.cxx:45
 AliMUON2DMap.cxx:46
 AliMUON2DMap.cxx:47
 AliMUON2DMap.cxx:48
 AliMUON2DMap.cxx:49
 AliMUON2DMap.cxx:50
 AliMUON2DMap.cxx:51
 AliMUON2DMap.cxx:52
 AliMUON2DMap.cxx:53
 AliMUON2DMap.cxx:54
 AliMUON2DMap.cxx:55
 AliMUON2DMap.cxx:56
 AliMUON2DMap.cxx:57
 AliMUON2DMap.cxx:58
 AliMUON2DMap.cxx:59
 AliMUON2DMap.cxx:60
 AliMUON2DMap.cxx:61
 AliMUON2DMap.cxx:62
 AliMUON2DMap.cxx:63
 AliMUON2DMap.cxx:64
 AliMUON2DMap.cxx:65
 AliMUON2DMap.cxx:66
 AliMUON2DMap.cxx:67
 AliMUON2DMap.cxx:68
 AliMUON2DMap.cxx:69
 AliMUON2DMap.cxx:70
 AliMUON2DMap.cxx:71
 AliMUON2DMap.cxx:72
 AliMUON2DMap.cxx:73
 AliMUON2DMap.cxx:74
 AliMUON2DMap.cxx:75
 AliMUON2DMap.cxx:76
 AliMUON2DMap.cxx:77
 AliMUON2DMap.cxx:78
 AliMUON2DMap.cxx:79
 AliMUON2DMap.cxx:80
 AliMUON2DMap.cxx:81
 AliMUON2DMap.cxx:82
 AliMUON2DMap.cxx:83
 AliMUON2DMap.cxx:84
 AliMUON2DMap.cxx:85
 AliMUON2DMap.cxx:86
 AliMUON2DMap.cxx:87
 AliMUON2DMap.cxx:88
 AliMUON2DMap.cxx:89
 AliMUON2DMap.cxx:90
 AliMUON2DMap.cxx:91
 AliMUON2DMap.cxx:92
 AliMUON2DMap.cxx:93
 AliMUON2DMap.cxx:94
 AliMUON2DMap.cxx:95
 AliMUON2DMap.cxx:96
 AliMUON2DMap.cxx:97
 AliMUON2DMap.cxx:98
 AliMUON2DMap.cxx:99
 AliMUON2DMap.cxx:100
 AliMUON2DMap.cxx:101
 AliMUON2DMap.cxx:102
 AliMUON2DMap.cxx:103
 AliMUON2DMap.cxx:104
 AliMUON2DMap.cxx:105
 AliMUON2DMap.cxx:106
 AliMUON2DMap.cxx:107
 AliMUON2DMap.cxx:108
 AliMUON2DMap.cxx:109
 AliMUON2DMap.cxx:110
 AliMUON2DMap.cxx:111
 AliMUON2DMap.cxx:112
 AliMUON2DMap.cxx:113
 AliMUON2DMap.cxx:114
 AliMUON2DMap.cxx:115
 AliMUON2DMap.cxx:116
 AliMUON2DMap.cxx:117
 AliMUON2DMap.cxx:118
 AliMUON2DMap.cxx:119
 AliMUON2DMap.cxx:120
 AliMUON2DMap.cxx:121
 AliMUON2DMap.cxx:122
 AliMUON2DMap.cxx:123
 AliMUON2DMap.cxx:124
 AliMUON2DMap.cxx:125
 AliMUON2DMap.cxx:126
 AliMUON2DMap.cxx:127
 AliMUON2DMap.cxx:128
 AliMUON2DMap.cxx:129
 AliMUON2DMap.cxx:130
 AliMUON2DMap.cxx:131
 AliMUON2DMap.cxx:132
 AliMUON2DMap.cxx:133
 AliMUON2DMap.cxx:134
 AliMUON2DMap.cxx:135
 AliMUON2DMap.cxx:136
 AliMUON2DMap.cxx:137
 AliMUON2DMap.cxx:138
 AliMUON2DMap.cxx:139
 AliMUON2DMap.cxx:140
 AliMUON2DMap.cxx:141
 AliMUON2DMap.cxx:142
 AliMUON2DMap.cxx:143
 AliMUON2DMap.cxx:144
 AliMUON2DMap.cxx:145
 AliMUON2DMap.cxx:146
 AliMUON2DMap.cxx:147
 AliMUON2DMap.cxx:148
 AliMUON2DMap.cxx:149
 AliMUON2DMap.cxx:150
 AliMUON2DMap.cxx:151
 AliMUON2DMap.cxx:152
 AliMUON2DMap.cxx:153
 AliMUON2DMap.cxx:154
 AliMUON2DMap.cxx:155
 AliMUON2DMap.cxx:156
 AliMUON2DMap.cxx:157
 AliMUON2DMap.cxx:158
 AliMUON2DMap.cxx:159
 AliMUON2DMap.cxx:160
 AliMUON2DMap.cxx:161
 AliMUON2DMap.cxx:162
 AliMUON2DMap.cxx:163
 AliMUON2DMap.cxx:164
 AliMUON2DMap.cxx:165
 AliMUON2DMap.cxx:166
 AliMUON2DMap.cxx:167
 AliMUON2DMap.cxx:168
 AliMUON2DMap.cxx:169
 AliMUON2DMap.cxx:170
 AliMUON2DMap.cxx:171
 AliMUON2DMap.cxx:172
 AliMUON2DMap.cxx:173
 AliMUON2DMap.cxx:174
 AliMUON2DMap.cxx:175
 AliMUON2DMap.cxx:176
 AliMUON2DMap.cxx:177
 AliMUON2DMap.cxx:178
 AliMUON2DMap.cxx:179
 AliMUON2DMap.cxx:180
 AliMUON2DMap.cxx:181
 AliMUON2DMap.cxx:182
 AliMUON2DMap.cxx:183
 AliMUON2DMap.cxx:184
 AliMUON2DMap.cxx:185
 AliMUON2DMap.cxx:186
 AliMUON2DMap.cxx:187
 AliMUON2DMap.cxx:188
 AliMUON2DMap.cxx:189
 AliMUON2DMap.cxx:190
 AliMUON2DMap.cxx:191
 AliMUON2DMap.cxx:192
 AliMUON2DMap.cxx:193
 AliMUON2DMap.cxx:194
 AliMUON2DMap.cxx:195
 AliMUON2DMap.cxx:196
 AliMUON2DMap.cxx:197
 AliMUON2DMap.cxx:198
 AliMUON2DMap.cxx:199
 AliMUON2DMap.cxx:200
 AliMUON2DMap.cxx:201
 AliMUON2DMap.cxx:202
 AliMUON2DMap.cxx:203
 AliMUON2DMap.cxx:204
 AliMUON2DMap.cxx:205
 AliMUON2DMap.cxx:206
 AliMUON2DMap.cxx:207
 AliMUON2DMap.cxx:208
 AliMUON2DMap.cxx:209
 AliMUON2DMap.cxx:210
 AliMUON2DMap.cxx:211
 AliMUON2DMap.cxx:212
 AliMUON2DMap.cxx:213
 AliMUON2DMap.cxx:214
 AliMUON2DMap.cxx:215
 AliMUON2DMap.cxx:216
 AliMUON2DMap.cxx:217
 AliMUON2DMap.cxx:218
 AliMUON2DMap.cxx:219
 AliMUON2DMap.cxx:220
 AliMUON2DMap.cxx:221
 AliMUON2DMap.cxx:222
 AliMUON2DMap.cxx:223
 AliMUON2DMap.cxx:224
 AliMUON2DMap.cxx:225
 AliMUON2DMap.cxx:226
 AliMUON2DMap.cxx:227
 AliMUON2DMap.cxx:228
 AliMUON2DMap.cxx:229
 AliMUON2DMap.cxx:230
 AliMUON2DMap.cxx:231
 AliMUON2DMap.cxx:232
 AliMUON2DMap.cxx:233