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