Portability.h
上传用户:speoil
上传日期:2021-10-06
资源大小:100k
文件大小:4k
源码类别:

3G开发

开发平台:

C/C++

  1. #ifndef PORTABILITY
  2. #define PORTABILITY
  3. #ifdef VISUAL_C
  4.    #include <stdlib.h>
  5.    #include <time.h>
  6.    #include <float.h>
  7. #else
  8.    #include <strings.h>
  9.    #include <unistd.h>
  10.    #include <stdlib.h>
  11.    #include <time.h>
  12.    #include <math.h>
  13. #endif
  14. /************************************************************************
  15.  *
  16.  * VISUAL_C utilities
  17.  *
  18.  ************************************************************************/
  19. #ifdef VISUAL_C
  20. inline char* CharTime(void)
  21. {
  22.    time_t tt = time(NULL);
  23.    return ctime(&tt);
  24. }  
  25. inline double atanh(double x)
  26. {  
  27.    return 0.5 * log((x-1)/(x+1));
  28. }
  29. inline long min(long l1, long l2)
  30. {
  31. return (l1 < l2) ? l1 : l2;
  32. }
  33. inline void bzero(void *x, int len)
  34. {
  35. char *str_x = (char *)x;
  36. for (int i=0; i<len; i++)
  37. *str_x++ = 0;
  38. }
  39. inline void bcopy(void *from, void *to, int len)
  40. {
  41. char *str_to = (char*)to;
  42. char *str_from = (char*)from;
  43. if (*str_to > *str_from) 
  44. {
  45. str_to += len-1;
  46. str_from += len-1;
  47. for (int i = 0; i < len; i++)
  48. *str_to-- = *str_from--;
  49. }
  50. else 
  51. {
  52. for (int i = 0; i < len; i++)
  53. *str_to++ = *str_from++;
  54. }
  55. }
  56. inline BOOLEAN isfinite(double &d)
  57. {
  58.    switch(_fpclass(d))
  59.       {
  60.          case _FPCLASS_SNAN:
  61.          case _FPCLASS_QNAN:
  62.          case _FPCLASS_NINF:
  63.          case _FPCLASS_PINF:
  64.             return FALSE;
  65.             break;
  66.          default:
  67.             return TRUE;
  68.       }
  69. }
  70. inline double clip(double &d, double MAXVAL = INF)
  71. {
  72.    switch(_fpclass(d))
  73.       {
  74.          case _FPCLASS_SNAN:
  75.          case _FPCLASS_QNAN:
  76.             d = 0;  // not a number 
  77.             break;
  78.          case _FPCLASS_NINF:
  79.             d = -MAXVAL;
  80.             break;
  81.          case _FPCLASS_PINF:
  82.             d = MAXVAL;
  83.             break;
  84.          default:
  85.             if (d > MAXVAL) 
  86.                d = MAXVAL;
  87.             else if (d < -MAXVAL)
  88.                d = -MAXVAL;
  89. //            else if (fabs(d) < EPSILON)
  90. //               d = 0;
  91.             break;  
  92.       }
  93.   return d;
  94. }
  95. #endif
  96. /************************************************************************
  97.  *
  98.  *  Unix requirements 
  99.  *
  100.  ************************************************************************/
  101. #ifndef VISUAL_C
  102. inline char* CharTime(void)
  103. {
  104.    time_t tt = time(NULL);
  105.    return ctime(&tt);
  106. }
  107. inline double min(double x, double y)
  108. {
  109.   return (x < y) ? x : y;
  110. }
  111. inline long min(long x, long y)
  112. {
  113.   return (x < y) ? x : y;
  114. }
  115. inline int min(int x, int y)
  116. {
  117.   return (x < y) ? x : y;
  118. }
  119. #endif
  120. /************************************************************************
  121.  *
  122.  *  Mixed
  123.  *
  124.  ************************************************************************/
  125. inline unsigned int RandomSeed()
  126. {
  127. #ifdef VISUAL_C
  128.    return (unsigned)time( NULL ) ;
  129. #else
  130.    return time(NULL);
  131. #endif
  132. }
  133. inline void my_srand(unsigned int seed)
  134. {
  135. #ifdef VISUAL_C
  136.    srand( seed );
  137. #else
  138.    srand48( seed );
  139. #endif
  140. }
  141. inline double my_rand()
  142. {
  143. #ifdef VISUAL_C
  144.     return (double)rand() / (double)(RAND_MAX + 1);
  145. #else
  146.     return drand48();
  147. #endif
  148. }
  149. inline double Q(double x)
  150. {
  151. #ifndef VISUAL_C
  152.   return 0.5 * erfc( x / sqrt(2.) );
  153. #else
  154.   return -x;
  155. #endif
  156. }
  157. /************************************************************************
  158.  *
  159.  *  Linux
  160.  *
  161.  ************************************************************************/
  162. #ifdef LINUX_C
  163. inline BOOLEAN isfinite(double d)
  164. {
  165.    if (isnan(d))
  166.       return FALSE;
  167.    else
  168.    {
  169.       switch(isinf(d))
  170.          {
  171.          case -1:
  172.          case 1:
  173.             return FALSE;
  174.             break;
  175.          default:
  176.             return TRUE;
  177.             break;
  178.          }
  179.    }
  180. }
  181. inline double clip(double &d, double MAXVAL = INF)
  182. {
  183.    if (isnan(d))
  184.       d = 0;
  185.    else
  186.    {
  187.       switch(isinf(d))
  188.          {
  189.          case -1:
  190.             d = -MAXVAL;
  191.             break;
  192.          case 1:
  193.             d = MAXVAL;
  194.             break;
  195.          default:
  196.             if (d > MAXVAL) 
  197.                d = MAXVAL;
  198.             else if (d < -MAXVAL)
  199.                d = -MAXVAL;
  200.             break;  
  201.          }
  202.    }
  203.   return d;
  204. }
  205. #endif
  206. #endif