对于不同类型的变量,这里定义了其最大最小值来提供给ACE_Utils等使用
1 templatestruct ACE_Numeric_Limits; 2 3 4 // ------------------------------------------ 5 // Special cases. 6 template<> 7 struct ACE_Export ACE_Numeric_Limits 8 { 9 static char min (void) { return CHAR_MIN; } 10 static char max (void) { return CHAR_MAX; } 11 }; 12 13 // ------------------------------------------ 14 // Signed integers. 15 16 template<> 17 struct ACE_Export ACE_Numeric_Limits 18 { 19 static signed char min (void) { return SCHAR_MIN; } 20 static signed char max (void) { return SCHAR_MAX; } 21 }; 22 23 template<> 24 struct ACE_Export ACE_Numeric_Limits 25 { 26 static signed short min (void) { return SHRT_MIN; } 27 static signed short max (void) { return SHRT_MAX; } 28 }; 29 30 template<> 31 struct ACE_Export ACE_Numeric_Limits 32 { 33 static signed int min (void) { return INT_MIN; } 34 static signed int max (void) { return INT_MAX; } 35 }; 36 37 template<> 38 struct ACE_Export ACE_Numeric_Limits 39 { 40 static signed long min (void) { return LONG_MIN; } 41 static signed long max (void) { return LONG_MAX; } 42 }; 43 44 template<> 45 struct ACE_Export ACE_Numeric_Limits 46 { 47 #if defined (LLONG_MIN) 48 # define ACE_LLONG_MIN LLONG_MIN 49 #elif defined (LONG_LONG_MIN) 50 # define ACE_LLONG_MIN LONG_LONG_MIN 51 #elif defined (LONGLONG_MIN) 52 # define ACE_LLONG_MIN LONGLONG_MIN 53 #else 54 # error Unable to determine minimum signed long long value. 55 #endif /* LLONG_MIN */ 56 57 #if defined (LLONG_MAX) 58 # define ACE_LLONG_MAX LLONG_MAX 59 #elif defined (LONG_LONG_MAX) 60 # define ACE_LLONG_MAX LONG_LONG_MAX 61 #elif defined (LONGLONG_MAX) 62 # define ACE_LLONG_MAX LONGLONG_MAX 63 #else 64 # error Unable to determine maximum signed long long value. 65 #endif /* LLONG_MAX */ 66 67 static signed long long min (void) { return ACE_LLONG_MIN; } 68 static signed long long max (void) { return ACE_LLONG_MAX; } 69 }; 70 71 // ------------------------------------------ 72 // Unsigned integers 73 template<> 74 struct ACE_Export ACE_Numeric_Limits 75 { 76 static unsigned char min (void) { return 0; } 77 static unsigned char max (void) { return UCHAR_MAX; } 78 }; 79 80 template<> 81 struct ACE_Export ACE_Numeric_Limits 82 { 83 static unsigned short min (void) { return 0; } 84 static unsigned short max (void) { return USHRT_MAX; } 85 }; 86 87 template<> 88 struct ACE_Export ACE_Numeric_Limits 89 { 90 static unsigned int min (void) { return 0; } 91 static unsigned int max (void) { return UINT_MAX; } 92 }; 93 94 template<> 95 struct ACE_Export ACE_Numeric_Limits 96 { 97 static unsigned long min (void) { return 0; } 98 static unsigned long max (void) { return ULONG_MAX; } 99 };100 101 template<>102 struct ACE_Export ACE_Numeric_Limits 103 {104 static unsigned long long min (void) { return 0; }105 static unsigned long long max (void)106 {107 # if defined (ULLONG_MAX)108 return ULLONG_MAX;109 # elif defined (ULONGLONG_MAX)110 return ULONGLONG_MAX;111 # else112 # error Unable to determine maximum unsigned long long value.113 # endif /* ULLONG_MAX */114 }115 };116 117 // ------------------------------------------118 // Floating point types119 120 template<>121 struct ACE_Export ACE_Numeric_Limits 122 {123 static float min (void) { return FLT_MIN; }124 static float max (void) { return FLT_MAX; }125 };126 127 template<>128 struct ACE_Export ACE_Numeric_Limits 129 {130 static double min (void) { return DBL_MIN; }131 static double max (void) { return DBL_MAX; }132 };133 134 template<>135 struct ACE_Export ACE_Numeric_Limits 136 {137 static long double min (void) { return LDBL_MIN; }138 static long double max (void) { return LDBL_MAX; }139 };140 141 #else142 143 // std::numeric_limits<> has all of the necessary specializations.144 // Just wrap it.145 146 template 147 struct ACE_Numeric_Limits148 {149 static T min (void) { return std::numeric_limits ::min (); }150 static T max (void) { return std::numeric_limits ::max (); }151 };152 153 # if (defined (ACE_WIN64) && defined (_MSC_VER) && _MSC_VER <= 1310) \154 || defined (ACE_LACKS_NUMERIC_LIMITS_64_BIT_TYPES)155 // The Microsoft Platform SDK does not provide std::numeric_limits<>156 // specializations for 64 bit integers so we need to explicitly provide157 // ACE_Numeric_Limits<> specializations to compensate for this158 // deficiency.159 //160 // Unfortunately there is no way to tell if the platform SDK is being161 // used so we specialize for the ACE_WIN64 + MSVC++ 7.1 case, which is162 // the configuration that exhibits this problem. It also happens to163 // be a fairly isolated configuration since 64-bit support in MSVC++164 // 7.1 was not very good to begin with.165 template<>166 struct ACE_Numeric_Limits 167 {168 static LONGLONG min (void) { return _I64_MIN; }169 static LONGLONG max (void) { return _I64_MAX; }170 };171 172 template<>173 struct ACE_Numeric_Limits 174 {175 static ULONGLONG min (void) { return 0; }176 static ULONGLONG max (void) { return _UI64_MAX; }177 };178 # endif /* ACE_WIN64 && _MSC_VER <= 1310 */