00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _MISC_H_
00012 #define _MISC_H_
00013
00014 #include "CH_assert.H"
00015 #include "REAL.H"
00016 #include <cmath>
00017 #include "BaseNamespaceHeader.H"
00018
00019
00020
00021
00022
00023
00024
00025
00026 template <class T> inline T Min(const T& a_a,
00027 const T& a_b)
00028 {
00029 return (a_a < a_b) ? a_a : a_b;
00030 }
00031
00032
00033
00034
00035
00036
00037
00038
00039 template <class T> inline T Max (const T& a_a,
00040 const T& a_b)
00041 {
00042 return (a_a > a_b) ? a_a : a_b;
00043 }
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 template <class T> inline T Abs(const T& a_a)
00054 {
00055 return (a_a > 0) ? a_a : -a_a;
00056 }
00057
00058
00059
00060
00061
00062 template <class T> inline void Swap(T& a_a,
00063 T& a_b)
00064 {
00065 T tmp = a_a;
00066 a_a = a_b;
00067 a_b = tmp;
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 template <unsigned int P>
00080 constexpr inline int ipow(int M) { return M*ipow<P-1>(M);}
00081 template<>
00082 constexpr inline int ipow<0>(int M) {return 1;}
00083
00084 inline int ipow(int a, int b)
00085 {
00086 CH_assert(b>=0);
00087 int rtn = 1;
00088 for (; b>0; b--)
00089 {
00090 rtn *= a;
00091 }
00092 return rtn;
00093
00094 }
00095
00096 inline Real ipow(const Real& a, const int& b)
00097 {
00098 return std::pow(a, b);
00099
00100
00101
00102
00103
00104
00105 }
00106
00107
00108
00109
00110
00111
00112 namespace Misc
00113 {
00114
00115
00116 inline bool isPower2(const int a_i)
00117 {
00118 if (a_i <= 0) return false;
00119 unsigned i = a_i;
00120 while (!(i & 1))
00121 {
00122 i >>= 1;
00123 }
00124 return (i >> 1) ? false : true;
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 template <typename T>
00136 class TypeTr
00137 {
00138 private:
00139 typedef char One;
00140 typedef struct
00141 {
00142 char a[2];
00143 } Two;
00144 template <typename C> static One test(int C::*);
00145 template <typename C> static Two test(...);
00146 public:
00147 enum
00148 {
00149 IsClass = sizeof(TypeTr<T>::template test<T>(0)) == 1
00150 };
00151 };
00152
00153 }
00154
00155 #include "BaseNamespaceFooter.H"
00156
00157 #endif