summaryrefslogtreecommitdiff
path: root/Source/OpenEXR/Imath/ImathLimits.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/OpenEXR/Imath/ImathLimits.h')
-rw-r--r--Source/OpenEXR/Imath/ImathLimits.h265
1 files changed, 265 insertions, 0 deletions
diff --git a/Source/OpenEXR/Imath/ImathLimits.h b/Source/OpenEXR/Imath/ImathLimits.h
new file mode 100644
index 0000000..0a67e5b
--- /dev/null
+++ b/Source/OpenEXR/Imath/ImathLimits.h
@@ -0,0 +1,265 @@
+///////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
+// Digital Ltd. LLC
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Industrial Light & Magic nor the names of
+// its contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef INCLUDED_IMATHLIMITS_H
+#define INCLUDED_IMATHLIMITS_H
+
+//----------------------------------------------------------------
+//
+// Limitations of the basic C++ numerical data types
+//
+//----------------------------------------------------------------
+
+#include <float.h>
+#include <limits.h>
+
+//------------------------------------------
+// In Windows, min and max are macros. Yay.
+//------------------------------------------
+
+#if defined _WIN32 || defined _WIN64
+ #ifdef min
+ #undef min
+ #endif
+ #ifdef max
+ #undef max
+ #endif
+#endif
+
+namespace Imath {
+
+
+//-----------------------------------------------------------------
+//
+// Template class limits<T> returns information about the limits
+// of numerical data type T:
+//
+// min() largest possible negative value of type T
+//
+// max() largest possible positive value of type T
+//
+// smallest() smallest possible positive value of type T
+//
+// epsilon() smallest possible e of type T, for which
+// 1 + e != 1
+//
+// isIntegral() returns true if T is an integral type
+//
+// isSigned() returns true if T is signed
+//
+// Class limits<T> is useful to implement template classes or
+// functions which depend on the limits of a numerical type
+// which is not known in advance; for example:
+//
+// template <class T> max (T x[], int n)
+// {
+// T m = limits<T>::min();
+//
+// for (int i = 0; i < n; i++)
+// if (m < x[i])
+// m = x[i];
+//
+// return m;
+// }
+//
+// Class limits<T> has been implemented for the following types:
+//
+// char, signed char, unsigned char
+// short, unsigned short
+// int, unsigned int
+// long, unsigned long
+// float
+// double
+// long double
+//
+// Class limits<T> has only static member functions, all of which
+// are implemented as inlines. No objects of type limits<T> are
+// ever created.
+//
+//-----------------------------------------------------------------
+
+
+template <class T> struct limits
+{
+ static T min();
+ static T max();
+ static T smallest();
+ static T epsilon();
+ static bool isIntegral();
+ static bool isSigned();
+};
+
+
+//---------------
+// Implementation
+//---------------
+
+template <>
+struct limits <char>
+{
+ static char min() {return CHAR_MIN;}
+ static char max() {return CHAR_MAX;}
+ static char smallest() {return 1;}
+ static char epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return (char) ~0 < 0;}
+};
+
+template <>
+struct limits <signed char>
+{
+ static signed char min() {return SCHAR_MIN;}
+ static signed char max() {return SCHAR_MAX;}
+ static signed char smallest() {return 1;}
+ static signed char epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return true;}
+};
+
+template <>
+struct limits <unsigned char>
+{
+ static unsigned char min() {return 0;}
+ static unsigned char max() {return UCHAR_MAX;}
+ static unsigned char smallest() {return 1;}
+ static unsigned char epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return false;}
+};
+
+template <>
+struct limits <short>
+{
+ static short min() {return SHRT_MIN;}
+ static short max() {return SHRT_MAX;}
+ static short smallest() {return 1;}
+ static short epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return true;}
+};
+
+template <>
+struct limits <unsigned short>
+{
+ static unsigned short min() {return 0;}
+ static unsigned short max() {return USHRT_MAX;}
+ static unsigned short smallest() {return 1;}
+ static unsigned short epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return false;}
+};
+
+template <>
+struct limits <int>
+{
+ static int min() {return INT_MIN;}
+ static int max() {return INT_MAX;}
+ static int smallest() {return 1;}
+ static int epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return true;}
+};
+
+template <>
+struct limits <unsigned int>
+{
+ static unsigned int min() {return 0;}
+ static unsigned int max() {return UINT_MAX;}
+ static unsigned int smallest() {return 1;}
+ static unsigned int epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return false;}
+};
+
+template <>
+struct limits <long>
+{
+ static long min() {return LONG_MIN;}
+ static long max() {return LONG_MAX;}
+ static long smallest() {return 1;}
+ static long epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return true;}
+};
+
+template <>
+struct limits <unsigned long>
+{
+ static unsigned long min() {return 0;}
+ static unsigned long max() {return ULONG_MAX;}
+ static unsigned long smallest() {return 1;}
+ static unsigned long epsilon() {return 1;}
+ static bool isIntegral() {return true;}
+ static bool isSigned() {return false;}
+};
+
+template <>
+struct limits <float>
+{
+ static float min() {return -FLT_MAX;}
+ static float max() {return FLT_MAX;}
+ static float smallest() {return FLT_MIN;}
+ static float epsilon() {return FLT_EPSILON;}
+ static bool isIntegral() {return false;}
+ static bool isSigned() {return true;}
+};
+
+template <>
+struct limits <double>
+{
+ static double min() {return -DBL_MAX;}
+ static double max() {return DBL_MAX;}
+ static double smallest() {return DBL_MIN;}
+ static double epsilon() {return DBL_EPSILON;}
+ static bool isIntegral() {return false;}
+ static bool isSigned() {return true;}
+};
+
+template <>
+struct limits <long double>
+{
+ static long double min() {return -LDBL_MAX;}
+ static long double max() {return LDBL_MAX;}
+ static long double smallest() {return LDBL_MIN;}
+ static long double epsilon() {return LDBL_EPSILON;}
+ static bool isIntegral() {return false;}
+ static bool isSigned() {return true;}
+};
+
+
+} // namespace Imath
+
+#endif