![]() |
http://www.sim.no/ http://www.coin3d.org/ |
00001 #ifndef COIN_SBBASIC_H 00002 #define COIN_SBBASIC_H 00003 00004 /**************************************************************************\ 00005 * 00006 * This file is part of the Coin 3D visualization library. 00007 * Copyright (C) by Kongsberg Oil & Gas Technologies. 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU General Public License 00011 * ("GPL") version 2 as published by the Free Software Foundation. 00012 * See the file LICENSE.GPL at the root directory of this source 00013 * distribution for additional information about the GNU GPL. 00014 * 00015 * For using Coin with software that can not be combined with the GNU 00016 * GPL, and for taking advantage of the additional benefits of our 00017 * support services, please contact Kongsberg Oil & Gas Technologies 00018 * about acquiring a Coin Professional Edition License. 00019 * 00020 * See http://www.coin3d.org/ for more information. 00021 * 00022 * Kongsberg Oil & Gas Technologies, Bygdoy Alle 5, 0257 Oslo, NORWAY. 00023 * http://www.sim.no/ sales@sim.no coin-support@coin3d.org 00024 * 00025 \**************************************************************************/ 00026 00027 #include <Inventor/C/basic.h> 00028 #include <Inventor/C/errors/debugerror.h> 00029 00030 /* ********************************************************************** */ 00031 /* Trap people trying to use Inventor headers while compiling C source code. 00032 * (we get support mail about this from time to time) 00033 */ 00034 #ifndef __cplusplus 00035 #error You are not compiling C++ - maybe your source file is named <file>.c 00036 #endif 00037 00038 /* ********************************************************************** */ 00039 /* Include these for Open Inventor compatibility reasons (they are not 00040 * actually used in Coin.) 00041 */ 00042 #define SoEXTENDER 00043 #define SoINTERNAL 00044 00045 /* ********************************************************************** */ 00046 00047 /* Some useful inline template functions: 00048 * SbAbs(Val) - returns absolute value 00049 * SbMin(Val1, Val2) - returns minimum value 00050 * SbMax(Val1, Val2) - returns maximum value 00051 * SbClamp(Val, Min, Max) - returns clamped value 00052 * SbSwap(Val1, Val2) - swaps the two values (no return value) 00053 * SbSqr(val) - returns (val)² 00054 */ 00055 00056 template <class Type> 00057 inline Type SbAbs( Type Val ) { 00058 return (Val < 0) ? 0 - Val : Val; 00059 } 00060 00061 template <class Type> 00062 inline Type SbMax( const Type A, const Type B ) { 00063 return (A < B) ? B : A; 00064 } 00065 00066 template <class Type> 00067 inline Type SbMin( const Type A, const Type B ) { 00068 return (A < B) ? A : B; 00069 } 00070 00071 template <class Type> 00072 inline Type SbClamp( const Type Val, const Type Min, const Type Max ) { 00073 return (Val < Min) ? Min : (Val > Max) ? Max : Val; 00074 } 00075 00076 template <class Type> 00077 inline void SbSwap( Type & A, Type & B ) { 00078 Type T; T = A; A = B; B = T; 00079 } 00080 00081 template <class Type> 00082 inline Type SbSqr(const Type val) { 00083 return val * val; 00084 } 00085 00086 /* *********************************************************************** */ 00087 00088 // SbDividerChk() - checks if divide-by-zero is attempted, and emits a 00089 // warning if so for debug builds. inlined like this to not take much 00090 // screenspace in inline functions. 00091 00092 // cc_debugerror_post() is not attempted resolved before the template is 00093 // used, hence the missing Inventor/errors/SoDebugError.h #include. This 00094 // "trick" does only work *portably* for functions in the global namespace. 00095 00096 template <typename Type> 00097 inline void SbDividerChk(const char * funcname, Type divider) { 00098 #ifndef NDEBUG 00099 if (!(divider != static_cast<Type>(0))) 00100 cc_debugerror_post(funcname, "divide by zero error.", divider); 00101 #endif // !NDEBUG 00102 } 00103 00104 /* ********************************************************************** */ 00105 00106 /* COMPILER BUG WORKAROUND: 00107 00108 We've had reports that Sun CC v4.0 is (likely) buggy, and doesn't 00109 allow a statement like 00110 00111 SoType SoNode::classTypeId = SoType::badType(); 00112 00113 As a hack we can however get around this by instead writing it as 00114 00115 SoType SoNode::classTypeId; 00116 00117 ..as the SoType variable will then be initialized to bitpattern 00118 0x0000, which equals SoType::badType(). We can *however* not do 00119 this for the Intel C/C++ compiler, as that does *not* init to the 00120 0x0000 bitpattern (which may be a separate bug -- I haven't read 00121 the C++ spec closely enough to decide whether that relied on 00122 unspecified behavior or not). 00123 00124 The latest version of the Intel compiler has been tested to still 00125 have this problem, so I've decided to re-install the old code, but 00126 in this form: 00127 00128 SoType SoNode::classTypeId STATIC_SOTYPE_INIT; 00129 00130 ..so it is easy to revert if somebody complains that the code 00131 reversal breaks their old Sun CC 4.0 compiler -- see the #define of 00132 STATIC_SOTYPE_INIT below. 00133 00134 If that happens, we should work with the reporter, having access to 00135 the buggy compiler, to make a configure check which sets the 00136 SUN_CC_4_0_SOTYPE_INIT_BUG #define in include/Inventor/C/basic.h.in. 00137 00138 (Note that the Sun CC compiler has moved on, and a later version 00139 we've tested, 5.4, does not have the bug.) 00140 00141 20050105 mortene. 00142 */ 00143 00144 #define SUN_CC_4_0_SOTYPE_INIT_BUG 0 /* assume compiler is ok for now */ 00145 00146 #if SUN_CC_4_0_SOTYPE_INIT_BUG 00147 #define STATIC_SOTYPE_INIT 00148 #else 00149 #define STATIC_SOTYPE_INIT = SoType::badType() 00150 #endif 00151 00152 /* ********************************************************************** */ 00153 00154 #endif /* !COIN_SBBASIC_H */
Copyright © 1998-2010 by Kongsberg Oil & Gas Technologies. All rights reserved.
Generated on Fri Dec 11 2015 03:24:52 for Coin by Doxygen 1.7.6.1.