Blame Imath/ImathLimits.h

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