00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 namespace TooN {
00031
00032 namespace Internal
00033 {
00034 template<bool StaticBad>
00035 struct BadSlice;
00036
00037 template<>
00038 struct BadSlice<0>{
00039 static void check(){}
00040 };
00041
00042 template<int Size, int Start, int Length>
00043 struct CheckStaticSlice
00044 {
00045 static void check(int)
00046 {
00047 BadSlice<(Start < 0) || (Length < 1) || (Start+Length>Size)>::check();
00048 }
00049 };
00050
00051 template<int Start, int Length> struct CheckStaticSlice<-1, Start, Length>{
00052 static void check(int size)
00053 {
00054 BadSlice<(Start < 0) || (Length < 1)>::check();
00055 if(Start + Length > size)
00056 {
00057 #ifdef TOON_TEST_INTERNALS
00058 throw Internal::SliceError();
00059 #elif !defined TOON_NDEBUG_SLICE
00060 std::cerr << "TooN slice out of range" << std::endl;
00061 std::abort();
00062 #endif
00063 }
00064 }
00065 };
00066
00067 struct CheckDynamicSlice{
00068 static void check(int size, int start, int length){
00069 if(start < 0 || start + length > size)
00070 {
00071 #ifdef TOON_TEST_INTERNALS
00072 throw Internal::SliceError();
00073 #elif !defined TOON_NDEBUG_SLICE
00074 std::cerr << "TooN slice out of range" << std::endl;
00075 std::abort();
00076 #endif
00077 }
00078 }
00079 };
00080
00081 #ifdef TOON_TEST_INTERNALS
00082 template<bool StaticBad>
00083 struct BadSlice{
00084 static void check(){
00085 throw Internal::StaticSliceError();
00086 }
00087 };
00088 #endif
00089
00090
00091
00092 }
00093
00094 }