📄 imathlimits.h
字号:
/////////////////////////////////////////////////////////////////////////////// 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#endifnamespace 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -