Fixed memory leak
[u/mrichter/AliRoot.git] / MUON / AliMUONStringIntMap.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 //-----------------------------------------------------------------------------
19 // Class AliMUONStringIntMap
20 // ------------------------------------ 
21 // Helper class that substitutes map <string, int> 
22 // which ALICE does not allow to use 
23 // Author: Ivana Hrivnacova, IPN Orsay
24 //-----------------------------------------------------------------------------
25
26 #include <Riostream.h>
27 #include <TObjString.h>
28
29 #include "AliMUONStringIntMap.h"
30 #include "AliLog.h"
31
32 using std::cout;
33 using std::setw;
34 using std::endl;
35 /// \cond CLASSIMP
36 ClassImp(AliMUONStringIntMap)
37 /// \endcond
38
39 //______________________________________________________________________________
40 AliMUONStringIntMap::AliMUONStringIntMap()
41  : TObject(),
42    fNofItems(0),
43    fFirstArray(100),
44    fSecondArray(100),
45    fCurrentIndex(0)
46 {
47 /// Standard constructor
48
49   fFirstArray.SetOwner(true);
50 }
51
52 //______________________________________________________________________________
53 AliMUONStringIntMap::~AliMUONStringIntMap()
54 {
55 /// Destructor
56
57   fFirstArray.Delete();
58 }
59
60 //
61 // public methods
62 //
63
64 //______________________________________________________________________________
65 Bool_t  AliMUONStringIntMap::Add(const TString& first, Int_t second)
66 {
67 /// Add map element if first not yet present
68   
69   Int_t second2 = Get(first);
70   if ( second2 > 0 ) {
71     AliError(Form("%s is already present in the map", first.Data()));
72     return false;
73   }
74   
75   // Resize TArrayI if needed
76   if (fSecondArray.GetSize() == fNofItems) fSecondArray.Set(2*fNofItems);
77   
78   fFirstArray.Add(new TObjString(first)); 
79   fSecondArray.AddAt(second, fNofItems);
80   fNofItems++;
81    
82   return true;
83 }  
84
85 //______________________________________________________________________________
86 Bool_t  AliMUONStringIntMap::Set(const TString& first, Int_t second)
87 {
88   /// Set map element
89
90   Int_t index = Contains(first);
91   if ( index < 0 )
92   {
93     return Add(first,second);
94   }
95     
96   fSecondArray.AddAt(second, index);
97   
98   return true;
99 }  
100
101 //______________________________________________________________________________
102 Int_t 
103 AliMUONStringIntMap::Contains(const TString& first) const
104 {
105   /// Whether this map contains the string 'first' or not
106   
107   for (Int_t i=0; i<fNofItems; i++) 
108   {
109     if ( ((TObjString*)fFirstArray.At(i))->GetString() == first )
110     {
111       return i;
112     }
113   }
114   
115   return -1;
116 }      
117
118 //______________________________________________________________________________
119 Int_t  AliMUONStringIntMap::Get(const TString& first) const
120 {
121 /// Find the element with specified key (first)
122   
123   for (Int_t i=0; i<fNofItems; i++) {
124     if ( ((TObjString*)fFirstArray.At(i))->GetString() == first )
125       return fSecondArray.At(i);
126   }
127   
128   return 0;
129 }      
130
131 //______________________________________________________________________________
132 Int_t  AliMUONStringIntMap::GetNofItems() const
133 {
134 /// Return the number of elements
135
136   return fNofItems;
137 }  
138
139 //______________________________________________________________________________
140 void  AliMUONStringIntMap::Clear(Option_t* /*option*/)
141 {
142 /// Delete the elements
143
144   fNofItems = 0;
145   fFirstArray.Delete();
146   fSecondArray.Reset();
147 }  
148     
149 //______________________________________________________________________________
150 void AliMUONStringIntMap::Print(const char* /*option*/) const
151 {
152 /// Print the map elements
153
154   for (Int_t i=0; i<fNofItems; i++) {
155     cout << setw(4)
156          << i << "  "
157          << ((TObjString*)fFirstArray.At(i))->GetString()
158          << "  "
159          << setw(5)
160          << fSecondArray.At(i)
161          << endl;
162   }
163 }        
164
165 //______________________________________________________________________________
166 void AliMUONStringIntMap::Print(const TString& key, ofstream& out) const
167 {
168 /// Print the map elements preceded by a key word
169
170   for (Int_t i=0; i<fNofItems; i++) {
171     out  << key << "  "
172          << ((TObjString*)fFirstArray.At(i))->GetString()
173          << "  "
174          << setw(5)
175          << fSecondArray.At(i)
176          << endl;
177   }
178 }        
179
180 //______________________________________________________________________________
181 Bool_t  AliMUONStringIntMap::Next(TString& first, Int_t& second)
182 {
183 /// Iterator: next method.
184 /// Returns false if the iterator reached the end.
185
186  
187   if ( fCurrentIndex >= fNofItems ) return false;
188   
189   TObjString* objString = (TObjString*)fFirstArray.At(fCurrentIndex);
190   first = objString->GetString();
191   
192   second = fSecondArray.At(fCurrentIndex);
193   
194   ++fCurrentIndex;
195   
196   return true;
197 }  
198
199 //______________________________________________________________________________
200 void  AliMUONStringIntMap::ResetItr()
201 {
202 /// Reset iterator
203  
204   fCurrentIndex = 0;
205 }