Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/openexr/Imath/ImathLimits.h
16337 views
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
269