// @(#)root/base:
// Authors: Rene Brun, Fons Rademakers   29/07/95

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TMathBase
#define ROOT_TMathBase


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TMath Base functions                                                 //
//                                                                      //
// Define the functions Min, Max, Abs, Sign, Range for all types.       //
// NB: These functions are unfortunately not available in a portable    //
// way in std::.                                                        //
//                                                                      //
// More functions are defined in TMath.h. TMathBase.h is designed to be //
// a stable file and used in place of TMath.h in the ROOT miniCore.     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

#include <cstdlib>
#include <cmath>

namespace TMath {

   // Abs
   inline Short_t  Abs(Short_t d);
   inline Int_t    Abs(Int_t d);
   inline Long_t   Abs(Long_t d);
   inline Long64_t Abs(Long64_t d);
   inline Float_t  Abs(Float_t d);
   inline Double_t Abs(Double_t d);
   inline LongDouble_t Abs(LongDouble_t d);

   // Even/Odd
   inline Bool_t   Even(Long_t a);
   inline Bool_t   Odd(Long_t a);

   // SignBit
   template<typename Integer>
   inline Bool_t SignBit(Integer a);
   inline Bool_t SignBit(Float_t a);
   inline Bool_t SignBit(Double_t a);
   inline Bool_t SignBit(LongDouble_t a);

   // Sign
   template<typename T1, typename T2>
   inline T1 Sign( T1 a, T2 b);
   inline Float_t  Sign(Float_t a, Float_t b);
   inline Double_t Sign(Double_t a, Double_t b);
   inline LongDouble_t Sign(LongDouble_t a, LongDouble_t b);
   
   // Min, Max of two scalars
   inline Short_t   Min(Short_t a, Short_t b);
   inline UShort_t  Min(UShort_t a, UShort_t b);
   inline Int_t     Min(Int_t a, Int_t b);
   inline UInt_t    Min(UInt_t a, UInt_t b);
   inline Long_t    Min(Long_t a, Long_t b);
   inline ULong_t   Min(ULong_t a, ULong_t b);
   inline Long64_t  Min(Long64_t a, Long64_t b);
   inline ULong64_t Min(ULong64_t a, ULong64_t b);
   inline Float_t   Min(Float_t a, Float_t b);
   inline Double_t  Min(Double_t a, Double_t b);

   inline Short_t   Max(Short_t a, Short_t b);
   inline UShort_t  Max(UShort_t a, UShort_t b);
   inline Int_t     Max(Int_t a, Int_t b);
   inline UInt_t    Max(UInt_t a, UInt_t b);
   inline Long_t    Max(Long_t a, Long_t b);
   inline ULong_t   Max(ULong_t a, ULong_t b);
   inline Long64_t  Max(Long64_t a, Long64_t b);
   inline ULong64_t Max(ULong64_t a, ULong64_t b);
   inline Float_t   Max(Float_t a, Float_t b);
   inline Double_t  Max(Double_t a, Double_t b);

   // Range
   inline Short_t   Range(Short_t lb, Short_t ub, Short_t x);
   inline Int_t     Range(Int_t lb, Int_t ub, Int_t x);
   inline Long_t    Range(Long_t lb, Long_t ub, Long_t x);
   inline ULong_t   Range(ULong_t lb, ULong_t ub, ULong_t x);
   inline Double_t  Range(Double_t lb, Double_t ub, Double_t x);

   //NextPrime is used by the Core classes.
   Long_t   NextPrime(Long_t x);   // Least prime number greater than x
}


//---- Even/odd ----------------------------------------------------------------

inline Bool_t TMath::Even(Long_t a)
   { return ! (a & 1); }

inline Bool_t TMath::Odd(Long_t a)
   { return (a & 1); }

//---- Abs ---------------------------------------------------------------------

inline Short_t TMath::Abs(Short_t d)
{ return (d >= 0) ? d : Short_t(-d);  }

inline Int_t TMath::Abs(Int_t d)
{ return std::abs(d); }

inline Long_t TMath::Abs(Long_t d)
{ return std::labs(d); }

inline Long64_t TMath::Abs(Long64_t d)
#if __cplusplus >= 201103
{ return std::llabs(d); }
#else
{ return (d >= 0) ? d : -d;  }
#endif

inline Float_t TMath::Abs(Float_t d)
{ return std::abs(d); }

inline Double_t TMath::Abs(Double_t d)
{ return std::abs(d); }

inline LongDouble_t TMath::Abs(LongDouble_t d)
{ return std::abs(d); }


//---- Sign Bit--------------------------------------------------------------------

template<typename Integer>
inline Bool_t TMath::SignBit( Integer a)
   { return (a < 0); }

inline Bool_t TMath::SignBit(Float_t a)
   { return std::signbit(a);  }

inline Bool_t TMath::SignBit(Double_t a)
   { return std::signbit(a);  }

inline Bool_t TMath::SignBit(LongDouble_t a)
   { return std::signbit(a);  }


//---- Sign --------------------------------------------------------------------

template<typename T1, typename T2>
inline T1 TMath::Sign( T1 a, T2 b)
   { return (SignBit(b)) ? - Abs(a) : Abs(a); } 

inline Float_t TMath::Sign(Float_t a, Float_t b)
   { return std::copysign(a,b);  }

inline Double_t TMath::Sign(Double_t a, Double_t b)
   { return std::copysign(a,b);  }

inline LongDouble_t TMath::Sign(LongDouble_t a, LongDouble_t b)
   { return std::copysign(a,b);  }


//---- Min ---------------------------------------------------------------------

inline Short_t TMath::Min(Short_t a, Short_t b)
   { return a <= b ? a : b; }

inline UShort_t TMath::Min(UShort_t a, UShort_t b)
   { return a <= b ? a : b; }

inline Int_t TMath::Min(Int_t a, Int_t b)
   { return a <= b ? a : b; }

inline UInt_t TMath::Min(UInt_t a, UInt_t b)
   { return a <= b ? a : b; }

inline Long_t TMath::Min(Long_t a, Long_t b)
   { return a <= b ? a : b; }

inline ULong_t TMath::Min(ULong_t a, ULong_t b)
   { return a <= b ? a : b; }

inline Long64_t TMath::Min(Long64_t a, Long64_t b)
   { return a <= b ? a : b; }

inline ULong64_t TMath::Min(ULong64_t a, ULong64_t b)
   { return a <= b ? a : b; }

inline Float_t TMath::Min(Float_t a, Float_t b)
   { return a <= b ? a : b; }

inline Double_t TMath::Min(Double_t a, Double_t b)
   { return a <= b ? a : b; }

//---- Max ---------------------------------------------------------------------

inline Short_t TMath::Max(Short_t a, Short_t b)
   { return a >= b ? a : b; }

inline UShort_t TMath::Max(UShort_t a, UShort_t b)
   { return a >= b ? a : b; }

inline Int_t TMath::Max(Int_t a, Int_t b)
   { return a >= b ? a : b; }

inline UInt_t TMath::Max(UInt_t a, UInt_t b)
   { return a >= b ? a : b; }

inline Long_t TMath::Max(Long_t a, Long_t b)
   { return a >= b ? a : b; }

inline ULong_t TMath::Max(ULong_t a, ULong_t b)
   { return a >= b ? a : b; }

inline Long64_t TMath::Max(Long64_t a, Long64_t b)
   { return a >= b ? a : b; }

inline ULong64_t TMath::Max(ULong64_t a, ULong64_t b)
   { return a >= b ? a : b; }

inline Float_t TMath::Max(Float_t a, Float_t b)
   { return a >= b ? a : b; }

inline Double_t TMath::Max(Double_t a, Double_t b)
   { return a >= b ? a : b; }

//---- Range -------------------------------------------------------------------

inline Short_t TMath::Range(Short_t lb, Short_t ub, Short_t x)
   { return x < lb ? lb : (x > ub ? ub : x); }

inline Int_t TMath::Range(Int_t lb, Int_t ub, Int_t x)
   { return x < lb ? lb : (x > ub ? ub : x); }

inline Long_t TMath::Range(Long_t lb, Long_t ub, Long_t x)
   { return x < lb ? lb : (x > ub ? ub : x); }

inline ULong_t TMath::Range(ULong_t lb, ULong_t ub, ULong_t x)
   { return x < lb ? lb : (x > ub ? ub : x); }

inline Double_t TMath::Range(Double_t lb, Double_t ub, Double_t x)
   { return x < lb ? lb : (x > ub ? ub : x); }


#endif
 TMathBase.h:1
 TMathBase.h:2
 TMathBase.h:3
 TMathBase.h:4
 TMathBase.h:5
 TMathBase.h:6
 TMathBase.h:7
 TMathBase.h:8
 TMathBase.h:9
 TMathBase.h:10
 TMathBase.h:11
 TMathBase.h:12
 TMathBase.h:13
 TMathBase.h:14
 TMathBase.h:15
 TMathBase.h:16
 TMathBase.h:17
 TMathBase.h:18
 TMathBase.h:19
 TMathBase.h:20
 TMathBase.h:21
 TMathBase.h:22
 TMathBase.h:23
 TMathBase.h:24
 TMathBase.h:25
 TMathBase.h:26
 TMathBase.h:27
 TMathBase.h:28
 TMathBase.h:29
 TMathBase.h:30
 TMathBase.h:31
 TMathBase.h:32
 TMathBase.h:33
 TMathBase.h:34
 TMathBase.h:35
 TMathBase.h:36
 TMathBase.h:37
 TMathBase.h:38
 TMathBase.h:39
 TMathBase.h:40
 TMathBase.h:41
 TMathBase.h:42
 TMathBase.h:43
 TMathBase.h:44
 TMathBase.h:45
 TMathBase.h:46
 TMathBase.h:47
 TMathBase.h:48
 TMathBase.h:49
 TMathBase.h:50
 TMathBase.h:51
 TMathBase.h:52
 TMathBase.h:53
 TMathBase.h:54
 TMathBase.h:55
 TMathBase.h:56
 TMathBase.h:57
 TMathBase.h:58
 TMathBase.h:59
 TMathBase.h:60
 TMathBase.h:61
 TMathBase.h:62
 TMathBase.h:63
 TMathBase.h:64
 TMathBase.h:65
 TMathBase.h:66
 TMathBase.h:67
 TMathBase.h:68
 TMathBase.h:69
 TMathBase.h:70
 TMathBase.h:71
 TMathBase.h:72
 TMathBase.h:73
 TMathBase.h:74
 TMathBase.h:75
 TMathBase.h:76
 TMathBase.h:77
 TMathBase.h:78
 TMathBase.h:79
 TMathBase.h:80
 TMathBase.h:81
 TMathBase.h:82
 TMathBase.h:83
 TMathBase.h:84
 TMathBase.h:85
 TMathBase.h:86
 TMathBase.h:87
 TMathBase.h:88
 TMathBase.h:89
 TMathBase.h:90
 TMathBase.h:91
 TMathBase.h:92
 TMathBase.h:93
 TMathBase.h:94
 TMathBase.h:95
 TMathBase.h:96
 TMathBase.h:97
 TMathBase.h:98
 TMathBase.h:99
 TMathBase.h:100
 TMathBase.h:101
 TMathBase.h:102
 TMathBase.h:103
 TMathBase.h:104
 TMathBase.h:105
 TMathBase.h:106
 TMathBase.h:107
 TMathBase.h:108
 TMathBase.h:109
 TMathBase.h:110
 TMathBase.h:111
 TMathBase.h:112
 TMathBase.h:113
 TMathBase.h:114
 TMathBase.h:115
 TMathBase.h:116
 TMathBase.h:117
 TMathBase.h:118
 TMathBase.h:119
 TMathBase.h:120
 TMathBase.h:121
 TMathBase.h:122
 TMathBase.h:123
 TMathBase.h:124
 TMathBase.h:125
 TMathBase.h:126
 TMathBase.h:127
 TMathBase.h:128
 TMathBase.h:129
 TMathBase.h:130
 TMathBase.h:131
 TMathBase.h:132
 TMathBase.h:133
 TMathBase.h:134
 TMathBase.h:135
 TMathBase.h:136
 TMathBase.h:137
 TMathBase.h:138
 TMathBase.h:139
 TMathBase.h:140
 TMathBase.h:141
 TMathBase.h:142
 TMathBase.h:143
 TMathBase.h:144
 TMathBase.h:145
 TMathBase.h:146
 TMathBase.h:147
 TMathBase.h:148
 TMathBase.h:149
 TMathBase.h:150
 TMathBase.h:151
 TMathBase.h:152
 TMathBase.h:153
 TMathBase.h:154
 TMathBase.h:155
 TMathBase.h:156
 TMathBase.h:157
 TMathBase.h:158
 TMathBase.h:159
 TMathBase.h:160
 TMathBase.h:161
 TMathBase.h:162
 TMathBase.h:163
 TMathBase.h:164
 TMathBase.h:165
 TMathBase.h:166
 TMathBase.h:167
 TMathBase.h:168
 TMathBase.h:169
 TMathBase.h:170
 TMathBase.h:171
 TMathBase.h:172
 TMathBase.h:173
 TMathBase.h:174
 TMathBase.h:175
 TMathBase.h:176
 TMathBase.h:177
 TMathBase.h:178
 TMathBase.h:179
 TMathBase.h:180
 TMathBase.h:181
 TMathBase.h:182
 TMathBase.h:183
 TMathBase.h:184
 TMathBase.h:185
 TMathBase.h:186
 TMathBase.h:187
 TMathBase.h:188
 TMathBase.h:189
 TMathBase.h:190
 TMathBase.h:191
 TMathBase.h:192
 TMathBase.h:193
 TMathBase.h:194
 TMathBase.h:195
 TMathBase.h:196
 TMathBase.h:197
 TMathBase.h:198
 TMathBase.h:199
 TMathBase.h:200
 TMathBase.h:201
 TMathBase.h:202
 TMathBase.h:203
 TMathBase.h:204
 TMathBase.h:205
 TMathBase.h:206
 TMathBase.h:207
 TMathBase.h:208
 TMathBase.h:209
 TMathBase.h:210
 TMathBase.h:211
 TMathBase.h:212
 TMathBase.h:213
 TMathBase.h:214
 TMathBase.h:215
 TMathBase.h:216
 TMathBase.h:217
 TMathBase.h:218
 TMathBase.h:219
 TMathBase.h:220
 TMathBase.h:221
 TMathBase.h:222
 TMathBase.h:223
 TMathBase.h:224
 TMathBase.h:225
 TMathBase.h:226
 TMathBase.h:227
 TMathBase.h:228
 TMathBase.h:229
 TMathBase.h:230
 TMathBase.h:231
 TMathBase.h:232
 TMathBase.h:233
 TMathBase.h:234
 TMathBase.h:235
 TMathBase.h:236
 TMathBase.h:237
 TMathBase.h:238
 TMathBase.h:239
 TMathBase.h:240
 TMathBase.h:241
 TMathBase.h:242
 TMathBase.h:243
 TMathBase.h:244
 TMathBase.h:245
 TMathBase.h:246
 TMathBase.h:247
 TMathBase.h:248
 TMathBase.h:249
 TMathBase.h:250