00001 namespace TooN {
00002
00003 namespace Internal
00004 {
00005
00006
00007
00008 #if defined TOON_CHECK_BOUNDS || defined TOON_TEST_INTERNALS
00009 static inline void check_index(int s, int i)
00010 {
00011 if(i<0 || i >= s)
00012 {
00013 #ifdef TOON_TEST_INTERNALS
00014 throw Internal::BadIndex();
00015 #else
00016 std::cerr << "Toon index out of range" << std::endl;
00017 std::abort();
00018 #endif
00019 }
00020 }
00021 #else
00022
00023
00024
00025 static inline void check_index(int, int){}
00026 #endif
00027
00028 #if defined TOON_INITIALIZE_SNAN
00029 template<class P> static void debug_initialize(P* data, int n)
00030 {
00031 using std::numeric_limits;
00032 for(int i=0; i < n; i++)
00033 data[i] = numeric_limits<P>::signaling_NaN();
00034 }
00035 #elif defined TOON_INITIALIZE_QNAN || defined TOON_INITIALIZE_NAN
00036 template<class P> static void debug_initialize(P* data, int n)
00037 {
00038 using std::numeric_limits;
00039 for(int i=0; i < n; i++)
00040 data[i] = numeric_limits<P>::quiet_NaN();
00041 }
00042 #elif defined TOON_INITIALIZE_VAL
00043 template<class P> static void debug_initialize(P* data, int n)
00044 {
00045 for(int i=0; i < n; i++)
00046 data[i] = TOON_INITIALIZE_VAL;
00047 }
00048 #elif defined TOON_INITIALIZE_RANDOM
00049 union intbits
00050 {
00051 unsigned long i;
00052 char c[4];
00053 };
00054
00055 template<class P> union datafail
00056 {
00057 int i;
00058 P p;
00059 };
00060
00061
00062 template<class P> static void debug_initialize(P* data, int n)
00063 {
00064
00065 static intbits random = { ((std::time(NULL) & 0xffffffff) *1664525L + 1013904223L)& 0xffffffff};
00066 unsigned char* cdata = reinterpret_cast<unsigned char*>(data);
00067
00068 size_t bytes = sizeof(P)*n, i=0;
00069
00070
00071 datafail<P> d={0};
00072 bytes+=d.i;
00073
00074 switch(bytes & 0x3 )
00075 {
00076 for(i=0; i < bytes;)
00077 {
00078
00079
00080
00081
00082
00083
00084 case 0:
00085 cdata[i++] = random.c[0];
00086 case 3:
00087 cdata[i++] = random.c[1];
00088 case 2:
00089 cdata[i++] = random.c[2];
00090 case 1:
00091 cdata[i++] = random.c[3];
00092 random.i = (1664525L * random.i + 1013904223L) & 0xffffffff;
00093 }
00094 }
00095 }
00096 #else
00097
00098
00099
00100 template<class P> static void debug_initialize(P*, int)
00101 {
00102 }
00103 #endif
00104
00105
00106 }
00107
00108 }