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