1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 // $MpId: AliMpExMap.cxx,v 1.5 2006/05/24 13:58:29 ivana Exp $
19 // ------------------------
21 // ------------------------
22 // Helper class making Root persistent TExMap
23 // Author:Ivana Hrivnacova; IPN Orsay
25 #include "AliMpExMap.h"
26 #include "AliMpIntPair.h"
32 #include <Riostream.h>
44 const Int_t AliMpExMap::fgkDefaultSize = 300;
45 const Bool_t AliMpExMap::fgkDefaultOwnership = true;
47 const Int_t AliMpExMap::fgkSeparator1 = 10000;
48 const Int_t AliMpExMap::fgkSeparator2 = 100;
50 const TString AliMpExMap::fgkCharacterMap
51 = " 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.";
57 //______________________________________________________________________________
58 Long_t AliMpExMap::GetIndex(const AliMpIntPair& pair)
60 /// Convert the pair of integers to integer.
62 if (pair.GetFirst() >= fgkSeparator1 || pair.GetSecond() >= fgkSeparator1) {
63 AliFatalClass("Index out of limit.");
67 return pair.GetFirst()*fgkSeparator1 + pair.GetSecond() + 1;
70 //_____________________________________________________________________________
71 Long_t AliMpExMap::GetIndex(const TString& s)
73 /// Convert the TString to integer.
76 AliFatalClass("String too long.");
81 for (Int_t i=s.Length()-1; i>=0; --i)
82 index = index*fgkSeparator2 + fgkCharacterMap.First(s(i));
87 //______________________________________________________________________________
88 AliMpIntPair AliMpExMap::GetPair(Long_t index)
90 /// Convert the integer index to the pair of integers.
92 return AliMpIntPair((index-1)/fgkSeparator1,(index-1)%fgkSeparator1);
95 //_____________________________________________________________________________
96 TString AliMpExMap::GetString(Long_t index)
98 /// Convert the integer index to the string.
102 Char_t c = fgkCharacterMap(index%fgkSeparator2);
104 index = index/fgkSeparator2;
110 // constructors/destructor
113 //_____________________________________________________________________________
114 AliMpExMap::AliMpExMap(Bool_t /*standardConstructor*/)
116 fMap(fgkDefaultSize),
117 fObjects(fgkDefaultSize),
118 fKeys(fgkDefaultSize)
120 /// Standard constructor
122 fObjects.SetOwner(fgkDefaultOwnership);
125 //_____________________________________________________________________________
126 AliMpExMap::AliMpExMap()
132 /// Default constructor
136 //_____________________________________________________________________________
137 AliMpExMap::AliMpExMap(const AliMpExMap& rhs)
148 //_____________________________________________________________________________
150 AliMpExMap::operator=(const AliMpExMap& rhs)
152 /// Assignment operator
158 //_____________________________________________________________________________
160 AliMpExMap::Copy(TObject& dest) const
162 /// Copy this to dest
163 /// Copy implies that dest will become owner of its objects, whatever
164 /// the ownership of (*this) is.
169 AliMpExMap& m = static_cast<AliMpExMap&>(dest);
174 for ( Int_t i = 0; i <= fObjects.GetLast(); ++i )
176 TObject* o = fObjects.At(i)->Clone();
179 AliError("Object was not cloned properly ! Please investigate...");
181 m.fObjects.AddLast(o);
184 m.fObjects.SetOwner(kTRUE);
187 //_____________________________________________________________________________
188 AliMpExMap::~AliMpExMap()
197 //_____________________________________________________________________________
198 void AliMpExMap::FillMap()
200 /// Fill transient map from the arrays of objects and keys
202 for (Int_t i=0; i<fObjects.GetEntriesFast(); i++)
203 fMap.Add(fKeys.At(i), (Long_t)fObjects.At(i));
206 //_____________________________________________________________________________
207 void AliMpExMap::AddKey(Long_t key)
209 /// Add key in array with checking size
211 // Resize array if needed
212 if (fObjects.GetEntriesFast() == fKeys.GetSize()) {
213 fKeys.Set(2*fKeys.GetSize());
214 AliWarningStream() << "AliMpExMap::AddKey: resized Key array " << endl;
217 fKeys.AddAt(key, fObjects.GetEntriesFast());
224 //_____________________________________________________________________________
225 void AliMpExMap::Add(const AliMpIntPair& key, TObject* object)
227 /// Add object with its key to the map and arrays
229 fMap.Add(GetIndex(key), (Long_t)object);
230 AddKey(GetIndex(key));
231 fObjects.Add(object);
234 //_____________________________________________________________________________
235 void AliMpExMap::Add(const TString& key, TObject* object)
237 /// Add object with its key to the map and arrays
239 fMap.Add(GetIndex(key), (Long_t)object);
240 AddKey(GetIndex(key));
241 fObjects.Add(object);
244 //_____________________________________________________________________________
245 void AliMpExMap::Add(Int_t key, TObject* object)
247 /// Add object with its key to the map and arrays
249 fMap.Add(key, (Long_t)object);
251 fObjects.Add(object);
254 //_____________________________________________________________________________
255 void AliMpExMap::SetSize(Int_t size)
257 /// Set given size to the key array
260 // fObjects.Set(size);
264 //_____________________________________________________________________________
265 void AliMpExMap::SetOwner(Bool_t owner)
267 /// Set given ownership to object array
269 fObjects.SetOwner(owner);
272 //_____________________________________________________________________________
273 Int_t AliMpExMap::GetSize() const
275 /// Return the map size
277 return fObjects.GetEntriesFast();
280 //_____________________________________________________________________________
281 TExMapIter AliMpExMap::GetIterator() const
283 /// Return TExMap iterator set to the beginning of the map
285 return TExMapIter(&fMap);
288 //_____________________________________________________________________________
289 TObject* AliMpExMap::GetObject(Int_t index) const
291 /// Return the object via its index in the array
292 /// (This function makes possible looping over map as over an array)
294 if ( index < 0 || index >= fObjects.GetEntriesFast() ) {
295 AliErrorStream() << "Index outside limits" << endl;
299 return fObjects.At(index);
302 //_____________________________________________________________________________
303 TObject* AliMpExMap::GetValue(const AliMpIntPair& key) const
305 /// Return the object associated with the given key if found,
306 /// otherwise return 0
308 return reinterpret_cast<TObject*>(fMap.GetValue(GetIndex(key)));
311 //_____________________________________________________________________________
312 TObject* AliMpExMap::GetValue(const TString& key) const
314 /// Return the object associated with the given key if found,
315 /// otherwise return 0
317 return reinterpret_cast<TObject*>(fMap.GetValue(GetIndex(key)));
320 //_____________________________________________________________________________
321 TObject* AliMpExMap::GetValue(Int_t key) const
323 /// Return the object associated with the given key if found,
324 /// otherwise return 0
326 return reinterpret_cast<TObject*>(fMap.GetValue(key));
329 //_____________________________________________________________________________
330 void AliMpExMap::Streamer(TBuffer &R__b)
332 // Customized streamer \n
333 // After the arrays are read, fill the transient map
335 if (R__b.IsReading()) {
336 AliMpExMap::Class()->ReadBuffer(R__b, this);
340 AliMpExMap::Class()->WriteBuffer(R__b, this);