element.h

00001 #ifndef ELEMENT_H
00002 #define ELEMENT_H
00003 
00004 #include <sstream>
00005 
00006 #include "exc/aflexc.h"
00007 
00008 #define WRONG_CONSTRUCTOR(A) \
00009     checkFor4();\
00010     std::ostringstream oss;\
00011     oss << D;\
00012     throw exc::InvalidArgumentException("Can't construct a " + oss.str() + "D element with " + #A + " elements"); 
00013 
00014 namespace afl
00015 {
00023     template <size_t D>
00024     class Element
00025     {
00026         public:
00030             Element(  ) { checkFor4(); for (size_t i = 0 ; i < D+1 ; ++i) _indices[i] = 0; }
00031 
00036             Element( const Element<D>& toCopy ) { for (size_t i = 0 ; i <= D ; ++i) _indices[i] = toCopy._indices[i]; }
00037 
00043             Element<D>& operator=( const Element<D>& toCopy ) { for (size_t i = 0 ; i <= D ; ++i) _indices[i] = toCopy._indices[i]; return *this; }
00044 
00052             Element( size_t u1, size_t u2 );
00053 
00062             Element( size_t u1, size_t u2, size_t u3 );
00063 
00073             Element( size_t u1, size_t u2, size_t u3, size_t u4 );
00074 
00085             Element( size_t u1, size_t u2, size_t u3, size_t u4, size_t u5 );
00086 
00093             size_t& operator[]( size_t i ) { if (i <= D) return _indices[i]; throw exc::OutOfBoundsException("Element access outside the element dimensions"); }
00094 
00101             size_t operator[]( size_t i ) const { if (i <= D) return _indices[i]; throw exc::OutOfBoundsException("Element access outside the element dimensions"); }
00102 
00103         private:
00108             void checkFor4(  ) { if ( D > 4) throw exc::InvalidArgumentException("Elements can only be of 1, 2, 3, or 4 dimensions"); }
00112             size_t _indices[D+1]; 
00113     };
00114 
00115     template <size_t D>
00116     Element<D>::Element( size_t, size_t ) { WRONG_CONSTRUCTOR(2); }
00117 
00118     template <size_t D>
00119     Element<D>::Element( size_t, size_t, size_t ) { WRONG_CONSTRUCTOR(3); }
00120 
00121     template <size_t D>
00122     Element<D>::Element( size_t, size_t, size_t, size_t ) { WRONG_CONSTRUCTOR(4); }
00123 
00124     template <size_t D>
00125     Element<D>::Element( size_t, size_t, size_t, size_t, size_t) { WRONG_CONSTRUCTOR(5); }
00126 }
00127 
00128 #undef WRONG_CONSTRUCTOR
00129 #endif

Generated on Fri Dec 22 07:17:50 2006 for afl by  doxygen 1.4.6