|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// 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
|
|
|
|
// (for float and double: smallest normalized
|
|
|
|
// positive value)
|
|
|
|
//
|
|
|
|
// 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
|