Coverity fixes
[u/mrichter/AliRoot.git] / MUON / AliMUON2DMap.cxx
CommitLineData
f6e5d0e9 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 "AliMUON2DMap.h"
19
20#include "AliLog.h"
f246123b 21#include "AliMUON2DMapIterator.h"
4178b5c7 22#include "AliMUON2DMapIteratorByI.h"
f6e5d0e9 23#include "AliMpExMap.h"
630711ed 24#include "AliMpExMapIterator.h"
f6e5d0e9 25
3d1463c8 26//-----------------------------------------------------------------------------
5398f946 27/// \class AliMUON2DMap
4178b5c7 28/// Basic implementation of AliMUONVStore container using
9d5f6a64 29/// AliMpExMap internally.
30/// What we store is a "double" map : an AliMpExMap of AliMpExMaps
31///
5398f946 32/// \author Laurent Aphecetche
3d1463c8 33//-----------------------------------------------------------------------------
f6e5d0e9 34
5398f946 35/// \cond CLASSIMP
f6e5d0e9 36ClassImp(AliMUON2DMap)
5398f946 37/// \endcond
f6e5d0e9 38
7332f213 39const Int_t AliMUON2DMap::fgkOptimalSizeForDEManu = 228;
40
630711ed 41//_____________________________________________________________________________
42AliMUON2DMap::AliMUON2DMap(TRootIOCtor*)
43: AliMUONVStore(),
44fMap(0x0),
45fOptimizeForDEManu(kFALSE)
4178b5c7 46{
630711ed 47 /// Root I/O constructor.
4178b5c7 48}
49
f6e5d0e9 50//_____________________________________________________________________________
d91c6144 51AliMUON2DMap::AliMUON2DMap(Bool_t optimizeForDEManu)
4178b5c7 52: AliMUONVStore(),
630711ed 53 fMap(new AliMpExMap),
d91c6144 54 fOptimizeForDEManu(optimizeForDEManu)
f6e5d0e9 55{
4178b5c7 56 /// Default constructor.
7332f213 57 // hard-coded constant in order not to depend on mapping
58 // if this number ever change, it will not break the code, simply the
59 // automatic resizing will give a warning...
630711ed 60
7332f213 61 if ( fOptimizeForDEManu ) fMap->SetSize(fgkOptimalSizeForDEManu);
f6e5d0e9 62}
63
9d5f6a64 64//_____________________________________________________________________________
65AliMUON2DMap::AliMUON2DMap(const AliMUON2DMap& other)
4178b5c7 66: AliMUONVStore(),
7332f213 67 fMap(new AliMpExMap(*other.fMap)),
68 fOptimizeForDEManu(other.fOptimizeForDEManu)
9d5f6a64 69{
5398f946 70 /// Copy constructor.
9d5f6a64 71}
884a73f1 72
9d5f6a64 73//_____________________________________________________________________________
74AliMUON2DMap&
75AliMUON2DMap::operator=(const AliMUON2DMap& other)
76{
5398f946 77/// Assignment operator
0d66cd7d 78 if ( this != &other )
79 {
80 *fMap = *other.fMap;
81 fOptimizeForDEManu = other.fOptimizeForDEManu;
82 }
9d5f6a64 83 return *this;
884a73f1 84}
85
f6e5d0e9 86//_____________________________________________________________________________
87AliMUON2DMap::~AliMUON2DMap()
88{
5398f946 89/// Destructor.
90/// We delete the map, which will delete the objects, as we're owner.
f6e5d0e9 91 delete fMap;
92}
93
9d5f6a64 94//_____________________________________________________________________________
4178b5c7 95AliMUONVStore*
96AliMUON2DMap::Create() const
d91c6144 97{
98 /// Create a void copy of *this.
547c1de0 99 return new AliMUON2DMap(fOptimizeForDEManu);
d91c6144 100}
101
102//_____________________________________________________________________________
4178b5c7 103Bool_t
104AliMUON2DMap::Add(TObject* object)
105{
106 /// Add object, using the decoding of uniqueID into two ints as the key
7332f213 107 if (!object) return kFALSE;
4178b5c7 108 UInt_t uniqueID = object->GetUniqueID();
109 Int_t j = ( uniqueID & 0xFFFF0000 ) >> 16;
110 Int_t i = ( uniqueID & 0xFFFF);
111 return Set(i,j,object,kFALSE);
112}
113
114//_____________________________________________________________________________
f6e5d0e9 115TObject*
49419555 116AliMUON2DMap::FindObject(UInt_t uid) const
117{
118 /// Return the value at position uid
119
120 Int_t j = ( uid & 0xFFFF0000 ) >> 16;
121 Int_t i = ( uid & 0xFFFF);
122 return FindObject(i,j);
123}
124
125//_____________________________________________________________________________
126TObject*
4178b5c7 127AliMUON2DMap::FindObject(Int_t i, Int_t j) const
f6e5d0e9 128{
4178b5c7 129 /// Return the value at position (i,j).
4178b5c7 130 AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
7332f213 131 return m ? m->GetValue(j) : 0x0;
4178b5c7 132}
133
134//_____________________________________________________________________________
135TIterator*
136AliMUON2DMap::CreateIterator() const
137{
138 // Create and return an iterator on this map
139 // Returned iterator must be deleted by user.
7332f213 140 return new AliMUON2DMapIterator(*fMap);
f6e5d0e9 141}
142
143//_____________________________________________________________________________
4178b5c7 144TIterator*
145AliMUON2DMap::CreateIterator(Int_t firstI, Int_t lastI) const
f246123b 146{
147 // Create and return an iterator on this map
148 // Returned iterator must be deleted by user.
7332f213 149 return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI);
f246123b 150}
151
152//_____________________________________________________________________________
4178b5c7 153void
154AliMUON2DMap::Clear(Option_t*)
49f43921 155{
7332f213 156 /// Clear memory
157 fMap->Clear();
4178b5c7 158}
159
160//_____________________________________________________________________________
161Int_t
162AliMUON2DMap::GetSize() const
163{
164 /// Return the number of objects we hold
630711ed 165 TIter next(fMap->CreateIterator());
4178b5c7 166 Int_t theSize(0);
630711ed 167 AliMpExMap* m;
49f43921 168
630711ed 169 while ( ( m = static_cast<AliMpExMap*>(next()) ) )
4178b5c7 170 {
630711ed 171 TIter next2(m->CreateIterator());
172 while ( next2() )
173 {
174 ++theSize;
175 }
4178b5c7 176 }
177 return theSize;
178}
179
180//_____________________________________________________________________________
181Int_t
182AliMUON2DMap::GetSize(Int_t i) const
183{
184 /// Return the number of objects we hold
185 AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
7332f213 186 return m ? m->GetSize() : 0;
49f43921 187}
188
189//_____________________________________________________________________________
f6e5d0e9 190Bool_t
191AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace)
192{
5398f946 193/// Set the object at position (i,j).
194/// If replace==kTRUE, we don't care if there's an object there already,
195/// otherwise we might refuse to set if the (i,j) location is already
196/// filled (in which case we return kFALSE).
e5cc543e 197
f6e5d0e9 198 TObject* o = fMap->GetValue(i);
199 if ( !o )
200 {
630711ed 201 AliMpExMap* m = new AliMpExMap;
d91c6144 202 if ( fOptimizeForDEManu )
203 {
f0195aa5 204 m->SetSize(451); // same remark as for the SetSize in ctor...
d91c6144 205 }
f6e5d0e9 206 fMap->Add(i,m);
207 o = fMap->GetValue(i);
f6e5d0e9 208 }
4178b5c7 209 AliMpExMap* m = static_cast<AliMpExMap*>(o);
4178b5c7 210
f6e5d0e9 211 o = m->GetValue(j);
4178b5c7 212
213 if ( !o )
f6e5d0e9 214 {
f6e5d0e9 215 m->Add(j,object);
216 }
4178b5c7 217 else
f6e5d0e9 218 {
4178b5c7 219 if ( replace )
220 {
221 delete o;
222 m->Add(j,object);
223 }
224 else
225 {
226 AliError(Form("Object %p is already there for (i,j)=(%d,%d)",o,i,j));
227 return kFALSE;
228 }
f6e5d0e9 229 }
4178b5c7 230
f6e5d0e9 231 return kTRUE;
232}
233