1 // @(#)root/base: 2 // Authors: Rene Brun, Fons Rademakers 29/07/95 3 4 /************************************************************************* 5 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. * 6 * All rights reserved. * 7 * * 8 * For the licensing terms see $ROOTSYS/LICENSE. * 9 * For the list of contributors see $ROOTSYS/README/CREDITS. * 10 *************************************************************************/ 11 12 #ifndef ROOT_TMathBase 13 #define ROOT_TMathBase 14 15 16 ////////////////////////////////////////////////////////////////////////// 17 // // 18 // TMath Base functions // 19 // // 20 // Define the functions Min, Max, Abs, Sign, Range for all types. // 21 // NB: These functions are unfortunately not available in a portable // 22 // way in std::. // 23 // // 24 // More functions are defined in TMath.h. TMathBase.h is designed to be // 25 // a stable file and used in place of TMath.h in the ROOT miniCore. // 26 // // 27 ////////////////////////////////////////////////////////////////////////// 28 29 #ifndef ROOT_Rtypes 30 #include "Rtypes.h" 31 #endif 32 33 #include <cstdlib> 34 #include <cmath> 35 36 namespace TMath { 37 38 // Abs 39 inline Short_t Abs(Short_t d); 40 inline Int_t Abs(Int_t d); 41 inline Long_t Abs(Long_t d); 42 inline Long64_t Abs(Long64_t d); 43 inline Float_t Abs(Float_t d); 44 inline Double_t Abs(Double_t d); 45 inline LongDouble_t Abs(LongDouble_t d); 46 47 // Even/Odd 48 inline Bool_t Even(Long_t a); 49 inline Bool_t Odd(Long_t a); 50 51 // Sign 52 inline Short_t Sign(Short_t a, Short_t b); 53 inline Int_t Sign(Int_t a, Int_t b); 54 inline Long_t Sign(Long_t a, Long_t b); 55 inline Long64_t Sign(Long64_t a, Long64_t b); 56 inline Float_t Sign(Float_t a, Float_t b); 57 inline Double_t Sign(Double_t a, Double_t b); 58 59 // Min, Max of two scalars 60 inline Short_t Min(Short_t a, Short_t b); 61 inline UShort_t Min(UShort_t a, UShort_t b); 62 inline Int_t Min(Int_t a, Int_t b); 63 inline UInt_t Min(UInt_t a, UInt_t b); 64 inline Long_t Min(Long_t a, Long_t b); 65 inline ULong_t Min(ULong_t a, ULong_t b); 66 inline Long64_t Min(Long64_t a, Long64_t b); 67 inline ULong64_t Min(ULong64_t a, ULong64_t b); 68 inline Float_t Min(Float_t a, Float_t b); 69 inline Double_t Min(Double_t a, Double_t b); 70 71 inline Short_t Max(Short_t a, Short_t b); 72 inline UShort_t Max(UShort_t a, UShort_t b); 73 inline Int_t Max(Int_t a, Int_t b); 74 inline UInt_t Max(UInt_t a, UInt_t b); 75 inline Long_t Max(Long_t a, Long_t b); 76 inline ULong_t Max(ULong_t a, ULong_t b); 77 inline Long64_t Max(Long64_t a, Long64_t b); 78 inline ULong64_t Max(ULong64_t a, ULong64_t b); 79 inline Float_t Max(Float_t a, Float_t b); 80 inline Double_t Max(Double_t a, Double_t b); 81 82 // Range 83 inline Short_t Range(Short_t lb, Short_t ub, Short_t x); 84 inline Int_t Range(Int_t lb, Int_t ub, Int_t x); 85 inline Long_t Range(Long_t lb, Long_t ub, Long_t x); 86 inline ULong_t Range(ULong_t lb, ULong_t ub, ULong_t x); 87 inline Double_t Range(Double_t lb, Double_t ub, Double_t x); 88 89 //NextPrime is used by the Core classes. 90 Long_t NextPrime(Long_t x); // Least prime number greater than x 91 } 92 93 94 //---- Even/odd ---------------------------------------------------------------- 95 96 inline Bool_t TMath::Even(Long_t a) 97 { return ! (a & 1); } 98 99 inline Bool_t TMath::Odd(Long_t a) 100 { return (a & 1); } 101 102 //---- Abs --------------------------------------------------------------------- 103 104 inline Short_t TMath::Abs(Short_t d) 105 { return (d >= 0) ? d : Short_t(-d); } 106 107 inline Int_t TMath::Abs(Int_t d) 108 { return std::abs(d); } 109 110 inline Long_t TMath::Abs(Long_t d) 111 { return std::labs(d); } 112 113 inline Long64_t TMath::Abs(Long64_t d) 114 #if __cplusplus >= 201103 115 { return std::llabs(d); } 116 #else 117 { return (d >= 0) ? d : -d; } 118 #endif 119 120 inline Float_t TMath::Abs(Float_t d) 121 { return std::abs(d); } 122 123 inline Double_t TMath::Abs(Double_t d) 124 { return std::abs(d); } 125 126 inline LongDouble_t TMath::Abs(LongDouble_t d) 127 { return std::abs(d); } 128 129 //---- Sign -------------------------------------------------------------------- 130 131 inline Short_t TMath::Sign(Short_t a, Short_t b) 132 { return (b >= 0) ? Abs(a) : Short_t(-Abs(a)); } 133 134 inline Int_t TMath::Sign(Int_t a, Int_t b) 135 { return (b >= 0) ? Abs(a) : -Abs(a); } 136 137 inline Long_t TMath::Sign(Long_t a, Long_t b) 138 { return (b >= 0) ? Abs(a) : -Abs(a); } 139 140 inline Long64_t TMath::Sign(Long64_t a, Long64_t b) 141 { return (b >= 0) ? Abs(a) : -Abs(a); } 142 143 inline Float_t TMath::Sign(Float_t a, Float_t b) 144 #if __cplusplus >= 201103 145 { return std::copysign(a,b); } 146 #else 147 { return (b >= 0) ? Abs(a) : -Abs(a); } 148 #endif 149 150 inline Double_t TMath::Sign(Double_t a, Double_t b) 151 #if __cplusplus >= 201103 152 { return std::copysign(a,b); } 153 #else 154 { return (b >= 0) ? Abs(a) : -Abs(a); } 155 #endif 156 157 //---- Min --------------------------------------------------------------------- 158 159 inline Short_t TMath::Min(Short_t a, Short_t b) 160 { return a <= b ? a : b; } 161 162 inline UShort_t TMath::Min(UShort_t a, UShort_t b) 163 { return a <= b ? a : b; } 164 165 inline Int_t TMath::Min(Int_t a, Int_t b) 166 { return a <= b ? a : b; } 167 168 inline UInt_t TMath::Min(UInt_t a, UInt_t b) 169 { return a <= b ? a : b; } 170 171 inline Long_t TMath::Min(Long_t a, Long_t b) 172 { return a <= b ? a : b; } 173 174 inline ULong_t TMath::Min(ULong_t a, ULong_t b) 175 { return a <= b ? a : b; } 176 177 inline Long64_t TMath::Min(Long64_t a, Long64_t b) 178 { return a <= b ? a : b; } 179 180 inline ULong64_t TMath::Min(ULong64_t a, ULong64_t b) 181 { return a <= b ? a : b; } 182 183 inline Float_t TMath::Min(Float_t a, Float_t b) 184 { return a <= b ? a : b; } 185 186 inline Double_t TMath::Min(Double_t a, Double_t b) 187 { return a <= b ? a : b; } 188 189 //---- Max --------------------------------------------------------------------- 190 191 inline Short_t TMath::Max(Short_t a, Short_t b) 192 { return a >= b ? a : b; } 193 194 inline UShort_t TMath::Max(UShort_t a, UShort_t b) 195 { return a >= b ? a : b; } 196 197 inline Int_t TMath::Max(Int_t a, Int_t b) 198 { return a >= b ? a : b; } 199 200 inline UInt_t TMath::Max(UInt_t a, UInt_t b) 201 { return a >= b ? a : b; } 202 203 inline Long_t TMath::Max(Long_t a, Long_t b) 204 { return a >= b ? a : b; } 205 206 inline ULong_t TMath::Max(ULong_t a, ULong_t b) 207 { return a >= b ? a : b; } 208 209 inline Long64_t TMath::Max(Long64_t a, Long64_t b) 210 { return a >= b ? a : b; } 211 212 inline ULong64_t TMath::Max(ULong64_t a, ULong64_t b) 213 { return a >= b ? a : b; } 214 215 inline Float_t TMath::Max(Float_t a, Float_t b) 216 { return a >= b ? a : b; } 217 218 inline Double_t TMath::Max(Double_t a, Double_t b) 219 { return a >= b ? a : b; } 220 221 //---- Range ------------------------------------------------------------------- 222 223 inline Short_t TMath::Range(Short_t lb, Short_t ub, Short_t x) 224 { return x < lb ? lb : (x > ub ? ub : x); } 225 226 inline Int_t TMath::Range(Int_t lb, Int_t ub, Int_t x) 227 { return x < lb ? lb : (x > ub ? ub : x); } 228 229 inline Long_t TMath::Range(Long_t lb, Long_t ub, Long_t x) 230 { return x < lb ? lb : (x > ub ? ub : x); } 231 232 inline ULong_t TMath::Range(ULong_t lb, ULong_t ub, ULong_t x) 233 { return x < lb ? lb : (x > ub ? ub : x); } 234 235 inline Double_t TMath::Range(Double_t lb, Double_t ub, Double_t x) 236 { return x < lb ? lb : (x > ub ? ub : x); } 237 238 239 #endif 240