1 /////////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas 4 // Digital Ltd. LLC 5 // 6 // All rights reserved. 7 // 8 // Redistribution and use in source and binary forms, with or without 9 // modification, are permitted provided that the following conditions are 10 // met: 11 // * Redistributions of source code must retain the above copyright 12 // notice, this list of conditions and the following disclaimer. 13 // * Redistributions in binary form must reproduce the above 14 // copyright notice, this list of conditions and the following disclaimer 15 // in the documentation and/or other materials provided with the 16 // distribution. 17 // * Neither the name of Industrial Light & Magic nor the names of 18 // its contributors may be used to endorse or promote products derived 19 // from this software without specific prior written permission. 20 // 21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 // 33 /////////////////////////////////////////////////////////////////////////// 34 35 36 37 #ifndef INCLUDED_IMATHLIMITS_H 38 #define INCLUDED_IMATHLIMITS_H 39 40 //---------------------------------------------------------------- 41 // 42 // Limitations of the basic C++ numerical data types 43 // 44 //---------------------------------------------------------------- 45 46 #include <float.h> 47 #include <limits.h> 48 49 //------------------------------------------ 50 // In Windows, min and max are macros. Yay. 51 //------------------------------------------ 52 53 #if defined _WIN32 || defined _WIN64 54 #ifdef min 55 #undef min 56 #endif 57 #ifdef max 58 #undef max 59 #endif 60 #endif 61 62 namespace Imath { 63 64 65 //----------------------------------------------------------------- 66 // 67 // Template class limits<T> returns information about the limits 68 // of numerical data type T: 69 // 70 // min() largest possible negative value of type T 71 // 72 // max() largest possible positive value of type T 73 // 74 // smallest() smallest possible positive value of type T 75 // (for float and double: smallest normalized 76 // positive value) 77 // 78 // epsilon() smallest possible e of type T, for which 79 // 1 + e != 1 80 // 81 // isIntegral() returns true if T is an integral type 82 // 83 // isSigned() returns true if T is signed 84 // 85 // Class limits<T> is useful to implement template classes or 86 // functions which depend on the limits of a numerical type 87 // which is not known in advance; for example: 88 // 89 // template <class T> max (T x[], int n) 90 // { 91 // T m = limits<T>::min(); 92 // 93 // for (int i = 0; i < n; i++) 94 // if (m < x[i]) 95 // m = x[i]; 96 // 97 // return m; 98 // } 99 // 100 // Class limits<T> has been implemented for the following types: 101 // 102 // char, signed char, unsigned char 103 // short, unsigned short 104 // int, unsigned int 105 // long, unsigned long 106 // float 107 // double 108 // long double 109 // 110 // Class limits<T> has only static member functions, all of which 111 // are implemented as inlines. No objects of type limits<T> are 112 // ever created. 113 // 114 //----------------------------------------------------------------- 115 116 117 template <class T> struct limits 118 { 119 static T min(); 120 static T max(); 121 static T smallest(); 122 static T epsilon(); 123 static bool isIntegral(); 124 static bool isSigned(); 125 }; 126 127 128 //--------------- 129 // Implementation 130 //--------------- 131 132 template <> 133 struct limits <char> 134 { 135 static char min() {return CHAR_MIN;} 136 static char max() {return CHAR_MAX;} 137 static char smallest() {return 1;} 138 static char epsilon() {return 1;} 139 static bool isIntegral() {return true;} 140 static bool isSigned() {return (char) ~0 < 0;} 141 }; 142 143 template <> 144 struct limits <signed char> 145 { 146 static signed char min() {return SCHAR_MIN;} 147 static signed char max() {return SCHAR_MAX;} 148 static signed char smallest() {return 1;} 149 static signed char epsilon() {return 1;} 150 static bool isIntegral() {return true;} 151 static bool isSigned() {return true;} 152 }; 153 154 template <> 155 struct limits <unsigned char> 156 { 157 static unsigned char min() {return 0;} 158 static unsigned char max() {return UCHAR_MAX;} 159 static unsigned char smallest() {return 1;} 160 static unsigned char epsilon() {return 1;} 161 static bool isIntegral() {return true;} 162 static bool isSigned() {return false;} 163 }; 164 165 template <> 166 struct limits <short> 167 { 168 static short min() {return SHRT_MIN;} 169 static short max() {return SHRT_MAX;} 170 static short smallest() {return 1;} 171 static short epsilon() {return 1;} 172 static bool isIntegral() {return true;} 173 static bool isSigned() {return true;} 174 }; 175 176 template <> 177 struct limits <unsigned short> 178 { 179 static unsigned short min() {return 0;} 180 static unsigned short max() {return USHRT_MAX;} 181 static unsigned short smallest() {return 1;} 182 static unsigned short epsilon() {return 1;} 183 static bool isIntegral() {return true;} 184 static bool isSigned() {return false;} 185 }; 186 187 template <> 188 struct limits <int> 189 { 190 static int min() {return INT_MIN;} 191 static int max() {return INT_MAX;} 192 static int smallest() {return 1;} 193 static int epsilon() {return 1;} 194 static bool isIntegral() {return true;} 195 static bool isSigned() {return true;} 196 }; 197 198 template <> 199 struct limits <unsigned int> 200 { 201 static unsigned int min() {return 0;} 202 static unsigned int max() {return UINT_MAX;} 203 static unsigned int smallest() {return 1;} 204 static unsigned int epsilon() {return 1;} 205 static bool isIntegral() {return true;} 206 static bool isSigned() {return false;} 207 }; 208 209 template <> 210 struct limits <long> 211 { 212 static long min() {return LONG_MIN;} 213 static long max() {return LONG_MAX;} 214 static long smallest() {return 1;} 215 static long epsilon() {return 1;} 216 static bool isIntegral() {return true;} 217 static bool isSigned() {return true;} 218 }; 219 220 template <> 221 struct limits <unsigned long> 222 { 223 static unsigned long min() {return 0;} 224 static unsigned long max() {return ULONG_MAX;} 225 static unsigned long smallest() {return 1;} 226 static unsigned long epsilon() {return 1;} 227 static bool isIntegral() {return true;} 228 static bool isSigned() {return false;} 229 }; 230 231 template <> 232 struct limits <float> 233 { 234 static float min() {return -FLT_MAX;} 235 static float max() {return FLT_MAX;} 236 static float smallest() {return FLT_MIN;} 237 static float epsilon() {return FLT_EPSILON;} 238 static bool isIntegral() {return false;} 239 static bool isSigned() {return true;} 240 }; 241 242 template <> 243 struct limits <double> 244 { 245 static double min() {return -DBL_MAX;} 246 static double max() {return DBL_MAX;} 247 static double smallest() {return DBL_MIN;} 248 static double epsilon() {return DBL_EPSILON;} 249 static bool isIntegral() {return false;} 250 static bool isSigned() {return true;} 251 }; 252 253 template <> 254 struct limits <long double> 255 { 256 static long double min() {return -LDBL_MAX;} 257 static long double max() {return LDBL_MAX;} 258 static long double smallest() {return LDBL_MIN;} 259 static long double epsilon() {return LDBL_EPSILON;} 260 static bool isIntegral() {return false;} 261 static bool isSigned() {return true;} 262 }; 263 264 265 } // namespace Imath 266 267 #endif 268