Rumba C++ SDK
ImathLimits.h
Go to the documentation of this file.
1 //
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 //
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
static unsigned short epsilon()
Definition: ImathLimits.h:182
static bool isSigned()
Definition: ImathLimits.h:140
static unsigned char epsilon()
Definition: ImathLimits.h:160
static bool isSigned()
Definition: ImathLimits.h:195
static bool isIntegral()
Definition: ImathLimits.h:150
static int min()
Definition: ImathLimits.h:190
static bool isSigned()
Definition: ImathLimits.h:151
static bool isIntegral()
Definition: ImathLimits.h:249
static bool isSigned()
Definition: ImathLimits.h:217
static float epsilon()
Definition: ImathLimits.h:237
static unsigned int max()
Definition: ImathLimits.h:202
static unsigned char smallest()
Definition: ImathLimits.h:159
static char min()
Definition: ImathLimits.h:135
static bool isIntegral()
Definition: ImathLimits.h:238
static unsigned char min()
Definition: ImathLimits.h:157
static unsigned int min()
Definition: ImathLimits.h:201
static bool isIntegral()
Definition: ImathLimits.h:205
static signed char epsilon()
Definition: ImathLimits.h:149
static T min()
static signed char max()
Definition: ImathLimits.h:147
static signed char min()
Definition: ImathLimits.h:146
static bool isSigned()
Definition: ImathLimits.h:173
static bool isSigned()
static double epsilon()
Definition: ImathLimits.h:248
static int smallest()
Definition: ImathLimits.h:192
static double smallest()
Definition: ImathLimits.h:247
static unsigned long max()
Definition: ImathLimits.h:224
static bool isSigned()
Definition: ImathLimits.h:239
Definition: ImathLimits.h:117
static long min()
Definition: ImathLimits.h:212
static long double smallest()
Definition: ImathLimits.h:258
static long double min()
Definition: ImathLimits.h:256
static long double max()
Definition: ImathLimits.h:257
static unsigned long min()
Definition: ImathLimits.h:223
static short smallest()
Definition: ImathLimits.h:170
static long double epsilon()
Definition: ImathLimits.h:259
static float smallest()
Definition: ImathLimits.h:236
static bool isIntegral()
Definition: ImathLimits.h:183
static unsigned short smallest()
Definition: ImathLimits.h:181
static bool isIntegral()
Definition: ImathLimits.h:216
static long epsilon()
Definition: ImathLimits.h:215
static float min()
Definition: ImathLimits.h:234
static bool isSigned()
Definition: ImathLimits.h:162
static T smallest()
static double max()
Definition: ImathLimits.h:246
static unsigned int smallest()
Definition: ImathLimits.h:203
static unsigned char max()
Definition: ImathLimits.h:158
static bool isIntegral()
Definition: ImathLimits.h:139
static unsigned long smallest()
Definition: ImathLimits.h:225
static bool isIntegral()
Definition: ImathLimits.h:172
static long max()
Definition: ImathLimits.h:213
static bool isSigned()
Definition: ImathLimits.h:228
static bool isIntegral()
Definition: ImathLimits.h:227
static bool isIntegral()
Definition: ImathLimits.h:260
static unsigned short min()
Definition: ImathLimits.h:179
static long smallest()
Definition: ImathLimits.h:214
static bool isSigned()
Definition: ImathLimits.h:206
static T max()
static short epsilon()
Definition: ImathLimits.h:171
static bool isSigned()
Definition: ImathLimits.h:250
static bool isIntegral()
static short min()
Definition: ImathLimits.h:168
static char smallest()
Definition: ImathLimits.h:137
static int epsilon()
Definition: ImathLimits.h:193
Definition: ImathBox.h:67
static double min()
Definition: ImathLimits.h:245
static T epsilon()
static bool isIntegral()
Definition: ImathLimits.h:194
static bool isIntegral()
Definition: ImathLimits.h:161
static short max()
Definition: ImathLimits.h:169
static float max()
Definition: ImathLimits.h:235
static signed char smallest()
Definition: ImathLimits.h:148
static unsigned long epsilon()
Definition: ImathLimits.h:226
static unsigned short max()
Definition: ImathLimits.h:180
static bool isSigned()
Definition: ImathLimits.h:261
static char max()
Definition: ImathLimits.h:136
static int max()
Definition: ImathLimits.h:191
static char epsilon()
Definition: ImathLimits.h:138
static unsigned int epsilon()
Definition: ImathLimits.h:204
static bool isSigned()
Definition: ImathLimits.h:184