Coverity fixes
[u/mrichter/AliRoot.git] / MUON / AliMUON2DMap.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 "AliMUON2DMap.h"
19
20 #include "AliLog.h"
21 #include "AliMUON2DMapIterator.h"
22 #include "AliMUON2DMapIteratorByI.h"
23 #include "AliMpExMap.h"
24 #include "AliMpExMapIterator.h"
25
26 //-----------------------------------------------------------------------------
27 /// \class AliMUON2DMap
28 /// Basic implementation of AliMUONVStore container using
29 /// AliMpExMap internally.
30 /// What we store is a "double" map : an AliMpExMap of AliMpExMaps
31 ///
32 /// \author Laurent Aphecetche
33 //-----------------------------------------------------------------------------
34
35 /// \cond CLASSIMP
36 ClassImp(AliMUON2DMap)
37 /// \endcond
38
39 const Int_t AliMUON2DMap::fgkOptimalSizeForDEManu = 228;
40
41 //_____________________________________________________________________________
42 AliMUON2DMap::AliMUON2DMap(TRootIOCtor*)
43 : AliMUONVStore(), 
44 fMap(0x0),
45 fOptimizeForDEManu(kFALSE)
46 {
47   /// Root I/O constructor.
48 }
49
50 //_____________________________________________________________________________
51 AliMUON2DMap::AliMUON2DMap(Bool_t optimizeForDEManu) 
52 : AliMUONVStore(), 
53   fMap(new AliMpExMap),
54   fOptimizeForDEManu(optimizeForDEManu)
55 {
56   /// Default constructor.
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...
60     
61   if ( fOptimizeForDEManu ) fMap->SetSize(fgkOptimalSizeForDEManu); 
62 }
63
64 //_____________________________________________________________________________
65 AliMUON2DMap::AliMUON2DMap(const AliMUON2DMap& other)
66 : AliMUONVStore(),
67   fMap(new AliMpExMap(*other.fMap)),
68   fOptimizeForDEManu(other.fOptimizeForDEManu)
69 {
70  /// Copy constructor.
71 }
72
73 //_____________________________________________________________________________
74 AliMUON2DMap&
75 AliMUON2DMap::operator=(const AliMUON2DMap& other)
76 {
77 /// Assignment operator
78   if ( this != &other )
79   {
80     *fMap = *other.fMap;
81     fOptimizeForDEManu = other.fOptimizeForDEManu;
82   }
83   return *this;
84 }
85
86 //_____________________________________________________________________________
87 AliMUON2DMap::~AliMUON2DMap()
88 {
89 /// Destructor. 
90 /// We delete the map, which will delete the objects, as we're owner.
91   delete fMap;
92 }
93
94 //_____________________________________________________________________________
95 AliMUONVStore*
96 AliMUON2DMap::Create() const
97 {
98   /// Create a void copy of *this. 
99   return new AliMUON2DMap(fOptimizeForDEManu);
100 }
101
102 //_____________________________________________________________________________
103 Bool_t
104 AliMUON2DMap::Add(TObject* object)
105 {
106   /// Add object, using the decoding of uniqueID into two ints as the key
107   if (!object) return kFALSE;
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 //_____________________________________________________________________________
115 TObject* 
116 AliMUON2DMap::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 //_____________________________________________________________________________
126 TObject* 
127 AliMUON2DMap::FindObject(Int_t i, Int_t j) const
128 {
129   /// Return the value at position (i,j).
130   AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
131   return m ? m->GetValue(j) : 0x0;
132 }
133
134 //_____________________________________________________________________________
135 TIterator*
136 AliMUON2DMap::CreateIterator() const
137 {
138   // Create and return an iterator on this map
139   // Returned iterator must be deleted by user.
140   return new AliMUON2DMapIterator(*fMap);
141 }
142
143 //_____________________________________________________________________________
144 TIterator*
145 AliMUON2DMap::CreateIterator(Int_t firstI, Int_t lastI) const
146 {
147   // Create and return an iterator on this map
148   // Returned iterator must be deleted by user.
149   return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI);
150 }
151
152 //_____________________________________________________________________________
153 void 
154 AliMUON2DMap::Clear(Option_t*)
155 {
156   /// Clear memory
157   fMap->Clear();
158 }  
159
160 //_____________________________________________________________________________
161 Int_t 
162 AliMUON2DMap::GetSize() const
163 {
164   /// Return the number of objects we hold
165   TIter next(fMap->CreateIterator());
166   Int_t theSize(0);
167   AliMpExMap* m;
168   
169   while ( ( m = static_cast<AliMpExMap*>(next()) ) )
170   {
171     TIter next2(m->CreateIterator());
172     while ( next2() ) 
173     {
174       ++theSize;
175     }
176   }
177   return theSize;
178 }
179
180 //_____________________________________________________________________________
181 Int_t 
182 AliMUON2DMap::GetSize(Int_t i) const
183 {
184   /// Return the number of objects we hold
185   AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
186   return m ? m->GetSize() : 0;
187 }
188
189 //_____________________________________________________________________________
190 Bool_t 
191 AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace)
192 {
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).
197   
198   TObject* o = fMap->GetValue(i);
199   if ( !o )
200   {
201     AliMpExMap* m = new AliMpExMap;
202     if ( fOptimizeForDEManu ) 
203     {
204       m->SetSize(451); // same remark as for the SetSize in ctor...
205     }
206     fMap->Add(i,m);
207     o = fMap->GetValue(i);
208   }
209   AliMpExMap* m = static_cast<AliMpExMap*>(o);
210  
211   o = m->GetValue(j);
212   
213   if ( !o )
214   {
215     m->Add(j,object);
216   }
217   else 
218   {
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     }
229   }
230
231   return kTRUE;
232 }
233