12 #ifndef ROOT_TMathBase
13 #define ROOT_TMathBase
38 inline Short_t Abs(Short_t d);
39 inline Int_t Abs(Int_t d);
40 inline Long_t Abs(Long_t d);
41 inline Long64_t Abs(Long64_t d);
42 inline Float_t Abs(Float_t d);
43 inline Double_t Abs(Double_t d);
44 inline LongDouble_t Abs(LongDouble_t d);
47 inline Bool_t Even(Long_t a);
48 inline Bool_t Odd(Long_t a);
51 template<
typename Integer>
52 inline Bool_t SignBit(Integer a);
53 inline Bool_t SignBit(Float_t a);
54 inline Bool_t SignBit(Double_t a);
55 inline Bool_t SignBit(LongDouble_t a);
58 template<
typename T1,
typename T2>
59 inline T1 Sign( T1 a, T2 b);
60 inline Float_t Sign(Float_t a, Float_t b);
61 inline Double_t Sign(Double_t a, Double_t b);
62 inline LongDouble_t Sign(LongDouble_t a, LongDouble_t b);
65 inline Short_t Min(Short_t a, Short_t b);
66 inline UShort_t Min(UShort_t a, UShort_t b);
67 inline Int_t Min(Int_t a, Int_t b);
68 inline UInt_t Min(UInt_t a, UInt_t b);
69 inline Long_t Min(Long_t a, Long_t b);
70 inline ULong_t Min(ULong_t a, ULong_t b);
71 inline Long64_t Min(Long64_t a, Long64_t b);
72 inline ULong64_t Min(ULong64_t a, ULong64_t b);
73 inline Float_t Min(Float_t a, Float_t b);
74 inline Double_t Min(Double_t a, Double_t b);
76 inline Short_t Max(Short_t a, Short_t b);
77 inline UShort_t Max(UShort_t a, UShort_t b);
78 inline Int_t Max(Int_t a, Int_t b);
79 inline UInt_t Max(UInt_t a, UInt_t b);
80 inline Long_t Max(Long_t a, Long_t b);
81 inline ULong_t Max(ULong_t a, ULong_t b);
82 inline Long64_t Max(Long64_t a, Long64_t b);
83 inline ULong64_t Max(ULong64_t a, ULong64_t b);
84 inline Float_t Max(Float_t a, Float_t b);
85 inline Double_t Max(Double_t a, Double_t b);
88 inline Short_t Range(Short_t lb, Short_t ub, Short_t x);
89 inline Int_t Range(Int_t lb, Int_t ub, Int_t x);
90 inline Long_t Range(Long_t lb, Long_t ub, Long_t x);
91 inline ULong_t Range(ULong_t lb, ULong_t ub, ULong_t x);
92 inline Double_t Range(Double_t lb, Double_t ub, Double_t x);
95 Long_t NextPrime(Long_t x);
98 template <
typename T> Long64_t BinarySearch(Long64_t n,
const T *array, T value);
99 template <
typename T> Long64_t BinarySearch(Long64_t n,
const T **array, T value);
100 template <
typename Iterator,
typename Element> Iterator BinarySearch(Iterator first, Iterator last, Element value);
103 template <
typename Element,
typename Index>
104 void Sort(Index n,
const Element* a, Index* index, Bool_t down=kTRUE);
105 template <
typename Iterator,
typename IndexIterator>
106 void SortItr(Iterator first, Iterator last, IndexIterator index, Bool_t down=kTRUE);
112 inline Bool_t TMath::Even(Long_t a)
113 {
return ! (a & 1); }
115 inline Bool_t TMath::Odd(Long_t a)
120 inline Short_t TMath::Abs(Short_t d)
121 {
return (d >= 0) ? d : Short_t(-d); }
123 inline Int_t TMath::Abs(Int_t d)
124 {
return std::abs(d); }
126 inline Long_t TMath::Abs(Long_t d)
127 {
return std::labs(d); }
129 inline Long64_t TMath::Abs(Long64_t d)
130 #if __cplusplus >= 201103
131 {
return std::llabs(d); }
133 {
return (d >= 0) ? d : -d; }
136 inline Float_t TMath::Abs(Float_t d)
137 {
return std::abs(d); }
139 inline Double_t TMath::Abs(Double_t d)
140 {
return std::abs(d); }
142 inline LongDouble_t TMath::Abs(LongDouble_t d)
143 {
return std::abs(d); }
148 template<
typename Integer>
149 inline Bool_t TMath::SignBit( Integer a)
152 inline Bool_t TMath::SignBit(Float_t a)
153 {
return std::signbit(a); }
155 inline Bool_t TMath::SignBit(Double_t a)
156 {
return std::signbit(a); }
158 inline Bool_t TMath::SignBit(LongDouble_t a)
159 {
return std::signbit(a); }
164 template<
typename T1,
typename T2>
165 inline T1 TMath::Sign( T1 a, T2 b)
166 {
return (SignBit(b)) ? - Abs(a) : Abs(a); }
168 inline Float_t TMath::Sign(Float_t a, Float_t b)
169 {
return std::copysign(a,b); }
171 inline Double_t TMath::Sign(Double_t a, Double_t b)
172 {
return std::copysign(a,b); }
174 inline LongDouble_t TMath::Sign(LongDouble_t a, LongDouble_t b)
175 {
return std::copysign(a,b); }
180 inline Short_t TMath::Min(Short_t a, Short_t b)
181 {
return a <= b ? a : b; }
183 inline UShort_t TMath::Min(UShort_t a, UShort_t b)
184 {
return a <= b ? a : b; }
186 inline Int_t TMath::Min(Int_t a, Int_t b)
187 {
return a <= b ? a : b; }
189 inline UInt_t TMath::Min(UInt_t a, UInt_t b)
190 {
return a <= b ? a : b; }
192 inline Long_t TMath::Min(Long_t a, Long_t b)
193 {
return a <= b ? a : b; }
195 inline ULong_t TMath::Min(ULong_t a, ULong_t b)
196 {
return a <= b ? a : b; }
198 inline Long64_t TMath::Min(Long64_t a, Long64_t b)
199 {
return a <= b ? a : b; }
201 inline ULong64_t TMath::Min(ULong64_t a, ULong64_t b)
202 {
return a <= b ? a : b; }
204 inline Float_t TMath::Min(Float_t a, Float_t b)
205 {
return a <= b ? a : b; }
207 inline Double_t TMath::Min(Double_t a, Double_t b)
208 {
return a <= b ? a : b; }
212 inline Short_t TMath::Max(Short_t a, Short_t b)
213 {
return a >= b ? a : b; }
215 inline UShort_t TMath::Max(UShort_t a, UShort_t b)
216 {
return a >= b ? a : b; }
218 inline Int_t TMath::Max(Int_t a, Int_t b)
219 {
return a >= b ? a : b; }
221 inline UInt_t TMath::Max(UInt_t a, UInt_t b)
222 {
return a >= b ? a : b; }
224 inline Long_t TMath::Max(Long_t a, Long_t b)
225 {
return a >= b ? a : b; }
227 inline ULong_t TMath::Max(ULong_t a, ULong_t b)
228 {
return a >= b ? a : b; }
230 inline Long64_t TMath::Max(Long64_t a, Long64_t b)
231 {
return a >= b ? a : b; }
233 inline ULong64_t TMath::Max(ULong64_t a, ULong64_t b)
234 {
return a >= b ? a : b; }
236 inline Float_t TMath::Max(Float_t a, Float_t b)
237 {
return a >= b ? a : b; }
239 inline Double_t TMath::Max(Double_t a, Double_t b)
240 {
return a >= b ? a : b; }
244 inline Short_t TMath::Range(Short_t lb, Short_t ub, Short_t x)
245 {
return x < lb ? lb : (x > ub ? ub : x); }
247 inline Int_t TMath::Range(Int_t lb, Int_t ub, Int_t x)
248 {
return x < lb ? lb : (x > ub ? ub : x); }
250 inline Long_t TMath::Range(Long_t lb, Long_t ub, Long_t x)
251 {
return x < lb ? lb : (x > ub ? ub : x); }
253 inline ULong_t TMath::Range(ULong_t lb, ULong_t ub, ULong_t x)
254 {
return x < lb ? lb : (x > ub ? ub : x); }
256 inline Double_t TMath::Range(Double_t lb, Double_t ub, Double_t x)
257 {
return x < lb ? lb : (x > ub ? ub : x); }
259 template <
typename Iterator,
typename Element>
260 Iterator TMath::BinarySearch(Iterator first, Iterator last, Element value)
270 pind = std::lower_bound(first, last, value);
271 if ( (pind != last) && (*pind == value) )
278 template <
typename T> Long64_t TMath::BinarySearch(Long64_t n,
const T *array, T value)
287 pind = std::lower_bound(array, array + n, value);
288 if ( (pind != array + n) && (*pind == value) )
289 return (pind - array);
291 return ( pind - array - 1);
294 template <
typename T> Long64_t TMath::BinarySearch(Long64_t n,
const T **array, T value)
303 pind = std::lower_bound(*array, *array + n, value);
304 if ( (pind != *array + n) && (*pind == value) )
305 return (pind - *array);
307 return ( pind - *array - 1);
313 CompareDesc(T d) : fData(d) {}
315 template<
typename Index>
316 bool operator()(Index i1, Index i2) {
317 return *(fData + i1) > *(fData + i2);
326 CompareAsc(T d) : fData(d) {}
328 template<
typename Index>
329 bool operator()(Index i1, Index i2) {
330 return *(fData + i1) < *(fData + i2);
336 template <
typename Iterator,
typename IndexIterator>
337 void TMath::SortItr(Iterator first, Iterator last, IndexIterator index, Bool_t down)
349 IndexIterator cindex = index;
350 for ( Iterator cfirst = first; cfirst != last; ++cfirst )
357 std::sort(index, cindex, CompareDesc<Iterator>(first) );
359 std::sort(index, cindex, CompareAsc<Iterator>(first) );
362 template <
typename Element,
typename Index>
void TMath::Sort(Index n,
const Element* a, Index* index, Bool_t down)
373 for(Index i = 0; i < n; i++) { index[i] = i; }
375 std::sort(index, index + n, CompareDesc<const Element*>(a) );
377 std::sort(index, index + n, CompareAsc<const Element*>(a) );