]>
Commit | Line | Data |
---|---|---|
5006ec94 | 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$ | |
617853db | 17 | // $MpId: AliMpExMap.cxx,v 1.2 2006/03/02 16:28:23 ivana Exp $ |
5006ec94 | 18 | // Category: basic |
19 | // | |
20 | // Class AliMpExMap | |
21 | // ------------------------ | |
22 | // Helper class making Root persistent TExMap | |
23 | // Author:Ivana Hrivnacova; IPN Orsay | |
24 | ||
617853db | 25 | #include "AliMpExMap.h" |
26 | ||
5006ec94 | 27 | #include <stdlib.h> |
28 | ||
29 | #include <TClass.h> | |
30 | #include <Riostream.h> | |
31 | #include <TString.h> | |
32 | #include <TError.h> | |
33 | ||
5006ec94 | 34 | //#include "AliMpConstants.h" |
35 | #include "AliMpIntPair.h" | |
36 | #include "AliLog.h" | |
37 | ||
5006ec94 | 38 | // |
39 | // static members | |
40 | // | |
41 | ||
42 | const Int_t AliMpExMap::fgkDefaultSize = 300; | |
43 | const Bool_t AliMpExMap::fgkDefaultOwnership = true; | |
44 | ||
45 | const Int_t AliMpExMap::fgkSeparator1 = 10000; | |
46 | const Int_t AliMpExMap::fgkSeparator2 = 100; | |
47 | ||
48 | const TString AliMpExMap::fgkCharacterMap | |
49 | = " 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ."; | |
50 | ||
617853db | 51 | ClassImp(AliMpExMap) |
52 | ||
5006ec94 | 53 | // |
54 | // static methods | |
55 | // | |
56 | ||
57 | //______________________________________________________________________________ | |
58 | Long_t AliMpExMap::GetIndex(const AliMpIntPair& pair) | |
59 | { | |
60 | /// Convert the pair of integers to integer. | |
61 | ||
62 | if (pair.GetFirst() >= fgkSeparator1 || pair.GetSecond() >= fgkSeparator1) { | |
63 | // to do - use AliLog, is it possible for static function | |
64 | // AliFatal("Index out of limit."); | |
65 | cerr << "AliMpExMap::GetIndex(const AliMpIntPair&): Index out of limit." << endl; | |
66 | exit(1); | |
67 | } | |
68 | ||
69 | return pair.GetFirst()*fgkSeparator1 + pair.GetSecond() + 1; | |
70 | } | |
71 | ||
72 | //_____________________________________________________________________________ | |
73 | Long_t AliMpExMap::GetIndex(const TString& s) | |
74 | { | |
75 | /// Convert the TString to integer. | |
76 | ||
77 | if (s.Length() > 5) { | |
78 | // to do - use AliLog, is it possible for static function | |
79 | // AliFatal("String too long."); | |
80 | cerr << "AliMpExMap::GetIndex(const TString&): String too long." << endl; | |
81 | return 0; | |
82 | } | |
83 | ||
84 | Long_t index = 0; | |
85 | for (Int_t i=s.Length()-1; i>=0; --i) | |
86 | index = index*fgkSeparator2 + fgkCharacterMap.First(s(i)); | |
87 | ||
88 | return index; | |
89 | } | |
90 | ||
91 | //______________________________________________________________________________ | |
92 | AliMpIntPair AliMpExMap::GetPair(Long_t index) | |
93 | { | |
94 | /// Convert the integer index to the pair of integers. | |
95 | ||
96 | return AliMpIntPair((index-1)/fgkSeparator1,(index-1)%fgkSeparator1); | |
97 | } | |
98 | ||
99 | //_____________________________________________________________________________ | |
100 | TString AliMpExMap::GetString(Long_t index) | |
101 | { | |
102 | /// Convert the integer index to the string. | |
103 | ||
104 | TString s; | |
105 | while (index >0) { | |
106 | Char_t c = fgkCharacterMap(index%fgkSeparator2); | |
107 | s += c; | |
108 | index = index/fgkSeparator2; | |
109 | } | |
110 | return s; | |
111 | } | |
112 | ||
113 | // | |
114 | // constructors/destructor | |
115 | // | |
116 | ||
117 | //_____________________________________________________________________________ | |
118 | AliMpExMap::AliMpExMap(Bool_t /*standardConstructor*/) | |
119 | : TObject(), | |
120 | fMap(fgkDefaultSize), | |
121 | fObjects(fgkDefaultSize), | |
122 | fKeys(fgkDefaultSize) | |
123 | { | |
124 | /// Standard constructor | |
125 | ||
126 | fObjects.SetOwner(fgkDefaultOwnership); | |
127 | } | |
128 | ||
129 | //_____________________________________________________________________________ | |
130 | AliMpExMap::AliMpExMap() | |
131 | : TObject(), | |
132 | fMap(), | |
133 | fObjects(), | |
134 | fKeys() | |
135 | { | |
136 | /// Default constructor | |
137 | } | |
138 | ||
139 | //_____________________________________________________________________________ | |
140 | AliMpExMap::~AliMpExMap() | |
141 | { | |
142 | /// Destructor | |
143 | } | |
144 | ||
145 | // | |
146 | // private methods | |
147 | // | |
148 | ||
149 | //_____________________________________________________________________________ | |
150 | void AliMpExMap::FillMap() | |
151 | { | |
152 | /// Fill transient map from the arrays of objects and keys | |
153 | ||
154 | for (Int_t i=0; i<fObjects.GetEntriesFast(); i++) | |
155 | fMap.Add(fKeys.At(i), (Long_t)fObjects.At(i)); | |
156 | } | |
157 | ||
158 | //_____________________________________________________________________________ | |
159 | void AliMpExMap::AddKey(Long_t key) | |
160 | { | |
161 | /// Add key in array with checking size | |
162 | ||
163 | // Resize array if needed | |
164 | if (fObjects.GetEntriesFast() == fKeys.GetSize()) { | |
165 | fKeys.Set(2*fKeys.GetSize()); | |
166 | cout << "AliMpExMap::AddKey: resized Key array " << endl; | |
167 | } | |
168 | ||
169 | fKeys.AddAt(key, fObjects.GetEntriesFast()); | |
170 | } | |
171 | ||
172 | // | |
173 | // public methods | |
174 | // | |
175 | ||
176 | //_____________________________________________________________________________ | |
177 | void AliMpExMap::Add(const AliMpIntPair& key, TObject* object) | |
178 | { | |
179 | /// Add object with its key to the map and arrays | |
180 | ||
181 | fMap.Add(GetIndex(key), (Long_t)object); | |
182 | AddKey(GetIndex(key)); | |
183 | fObjects.Add(object); | |
184 | } | |
185 | ||
186 | //_____________________________________________________________________________ | |
187 | void AliMpExMap::Add(const TString& key, TObject* object) | |
188 | { | |
189 | /// Add object with its key to the map and arrays | |
190 | ||
191 | fMap.Add(GetIndex(key), (Long_t)object); | |
192 | AddKey(GetIndex(key)); | |
193 | fObjects.Add(object); | |
194 | } | |
195 | ||
196 | //_____________________________________________________________________________ | |
197 | void AliMpExMap::Add(Int_t key, TObject* object) | |
198 | { | |
199 | /// Add object with its key to the map and arrays | |
200 | ||
201 | fMap.Add(key, (Long_t)object); | |
202 | AddKey(key); | |
203 | fObjects.Add(object); | |
204 | } | |
205 | ||
206 | //_____________________________________________________________________________ | |
207 | void AliMpExMap::SetSize(Int_t size) | |
208 | { | |
209 | /// Set given size to the key array | |
210 | ||
211 | // fMap.Set(size); | |
212 | // fObjects.Set(size); | |
213 | fKeys.Set(size); | |
214 | } | |
215 | ||
216 | //_____________________________________________________________________________ | |
217 | void AliMpExMap::SetOwner(Bool_t owner) | |
218 | { | |
219 | /// Set given ownership to object array | |
220 | ||
221 | fObjects.SetOwner(owner); | |
222 | } | |
223 | ||
224 | //_____________________________________________________________________________ | |
225 | Int_t AliMpExMap::GetSize() const | |
226 | { | |
227 | /// Return TExMap iterator set to the beginning of the map | |
228 | ||
229 | return fObjects.GetEntriesFast(); | |
230 | } | |
231 | ||
232 | //_____________________________________________________________________________ | |
233 | TExMapIter AliMpExMap::GetIterator() const | |
234 | { | |
235 | /// Return TExMap iterator set to the beginning of the map | |
236 | ||
237 | return TExMapIter(&fMap); | |
238 | } | |
239 | ||
240 | //_____________________________________________________________________________ | |
617853db | 241 | TObject* AliMpExMap::GetValue(const AliMpIntPair& key) const |
5006ec94 | 242 | { |
243 | /// Return the object associated with the given key if found, | |
244 | /// otherwise return 0 | |
245 | ||
617853db | 246 | return reinterpret_cast<TObject*>(fMap.GetValue(GetIndex(key))); |
5006ec94 | 247 | } |
248 | ||
249 | //_____________________________________________________________________________ | |
250 | TObject* AliMpExMap::GetValue(const TString& key) const | |
251 | { | |
252 | /// Return the object associated with the given key if found, | |
253 | /// otherwise return 0 | |
254 | ||
617853db | 255 | return reinterpret_cast<TObject*>(fMap.GetValue(GetIndex(key))); |
5006ec94 | 256 | } |
257 | ||
258 | //_____________________________________________________________________________ | |
259 | TObject* AliMpExMap::GetValue(Int_t key) const | |
260 | { | |
261 | /// Return the object associated with the given key if found, | |
262 | /// otherwise return 0 | |
263 | ||
617853db | 264 | return reinterpret_cast<TObject*>(fMap.GetValue(key)); |
5006ec94 | 265 | } |
266 | ||
267 | //_____________________________________________________________________________ | |
268 | void AliMpExMap::Streamer(TBuffer &R__b) | |
269 | { | |
270 | /// Customized streamer \n | |
271 | /// After the arrays are read, fill the transient map | |
272 | ||
273 | if (R__b.IsReading()) { | |
274 | AliMpExMap::Class()->ReadBuffer(R__b, this); | |
275 | FillMap(); | |
276 | } | |
277 | else { | |
278 | AliMpExMap::Class()->WriteBuffer(R__b, this); | |
279 | } | |
280 | } |