00001 #ifndef DUNE_COMMON_FORLOOP_HH 00002 #define DUNE_COMMON_FORLOOP_HH 00003 00004 #include <dune/common/static_assert.hh> 00005 00006 namespace Dune 00007 { 00046 template< template< int > class Operation, int first, int last > 00047 struct ForLoop 00048 { 00049 static void apply () 00050 { 00051 Operation< first >::apply(); 00052 ForLoop< Operation, first+1, last >::apply(); 00053 } 00054 00055 template< class T1 > 00056 static void apply ( T1 &p1 ) 00057 { 00058 Operation< first >::apply( p1 ); 00059 ForLoop< Operation, first+1, last >::apply( p1 ); 00060 } 00061 00062 template< class T1, class T2 > 00063 static void apply ( T1 &p1, T2 &p2 ) 00064 { 00065 Operation< first >::apply( p1, p2 ); 00066 ForLoop< Operation, first+1, last >::apply( p1, p2 ); 00067 } 00068 00069 template< class T1, class T2, class T3 > 00070 static void apply ( T1 &p1, T2 &p2, T3 &p3 ) 00071 { 00072 Operation< first >::apply( p1, p2, p3 ); 00073 ForLoop< Operation, first+1, last >::apply( p1, p2, p3 ); 00074 } 00075 00076 template< class T1, class T2, class T3, class T4 > 00077 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4 ) 00078 { 00079 Operation< first >::apply( p1, p2, p3, p4 ); 00080 ForLoop< Operation, first+1, last >::apply( p1, p2, p3, p4 ); 00081 } 00082 00083 template< class T1, class T2, class T3, class T4, class T5 > 00084 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5 ) 00085 { 00086 Operation< first >::apply( p1, p2, p3, p4, p5 ); 00087 ForLoop< Operation, first+1, last >::apply( p1, p2, p3, p4, p5 ); 00088 } 00089 00090 private: 00091 dune_static_assert( (first <= last), "ForLoop: first > last" ); 00092 }; 00093 00094 template< template< int > class Operation, int last > 00095 struct ForLoop< Operation, last, last > 00096 { 00097 static void apply () 00098 { 00099 Operation< last >::apply(); 00100 } 00101 00102 template< class T1 > 00103 static void apply ( T1 &p1 ) 00104 { 00105 Operation< last >::apply( p1 ); 00106 } 00107 00108 template< class T1, class T2 > 00109 static void apply ( T1 &p1, T2 &p2 ) 00110 { 00111 Operation< last >::apply( p1, p2 ); 00112 } 00113 00114 template< class T1, class T2, class T3 > 00115 static void apply ( T1 &p1, T2 &p2, T3 &p3 ) 00116 { 00117 Operation< last >::apply( p1, p2, p3 ); 00118 } 00119 00120 template< class T1, class T2, class T3, class T4 > 00121 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4 ) 00122 { 00123 Operation< last >::apply( p1, p2, p3, p4 ); 00124 } 00125 00126 template< class T1, class T2, class T3, class T4, class T5 > 00127 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5 ) 00128 { 00129 Operation< last >::apply( p1, p2, p3, p4, p5 ); 00130 } 00131 }; 00132 00133 } 00134 00135 #endif