dune-common
2.2.0
|
00001 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 00002 // vi: set ts=8 sw=2 et sts=2: 00003 00004 #ifndef DUNE_COMMON_FORLOOP_HH 00005 #define DUNE_COMMON_FORLOOP_HH 00006 00011 #include <dune/common/static_assert.hh> 00012 00013 namespace Dune 00014 { 00015 00016 // GenericForLoop 00017 // -------------- 00018 00019 template< template< class, class > class Operation, template< int > class Value, int first, int last > 00020 class GenericForLoop 00021 : public Operation< Value< first >, GenericForLoop< Operation, Value, first+1, last > > 00022 { 00023 dune_static_assert( (first <= last), "GenericForLoop: first > last" ); 00024 }; 00025 00026 template< template< class, class > class Operation, template< int > class Value, int last > 00027 class GenericForLoop< Operation, Value, last, last > 00028 : public Value< last > 00029 {}; 00030 00031 00032 00033 // ForLoopHelper 00034 // ------------- 00035 00036 namespace ForLoopHelper 00037 { 00038 00039 template< class A, class B > 00040 struct Apply 00041 { 00042 static void apply () 00043 { 00044 A::apply(); 00045 B::apply(); 00046 } 00047 00048 template< class T1 > 00049 static void apply ( T1 &p1 ) 00050 { 00051 A::apply( p1 ); 00052 B::apply( p1 ); 00053 } 00054 00055 template< class T1, class T2 > 00056 static void apply ( T1 &p1, T2 &p2 ) 00057 { 00058 A::apply( p1, p2 ); 00059 B::apply( p1, p2 ); 00060 } 00061 00062 template< class T1, class T2, class T3 > 00063 static void apply ( T1 &p1, T2 &p2, T3 &p3 ) 00064 { 00065 A::apply( p1, p2, p3 ); 00066 B::apply( p1, p2, p3 ); 00067 } 00068 00069 template< class T1, class T2, class T3, class T4 > 00070 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4 ) 00071 { 00072 A::apply( p1, p2, p3, p4 ); 00073 B::apply( p1, p2, p3, p4 ); 00074 } 00075 00076 template< class T1, class T2, class T3, class T4, class T5 > 00077 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5 ) 00078 { 00079 A::apply( p1, p2, p3, p4, p5 ); 00080 B::apply( p1, p2, p3, p4, p5 ); 00081 } 00082 00083 template< class T1, class T2, class T3, class T4, class T5, class T6 > 00084 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6 ) 00085 { 00086 A::apply( p1, p2, p3, p4, p5, p6 ); 00087 B::apply( p1, p2, p3, p4, p5, p6 ); 00088 } 00089 00090 template< class T1, class T2, class T3, class T4, class T5, class T6, 00091 class T7 > 00092 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6, 00093 T7 &p7 ) 00094 { 00095 A::apply( p1, p2, p3, p4, p5, p6, p7 ); 00096 B::apply( p1, p2, p3, p4, p5, p6, p7 ); 00097 } 00098 00099 template< class T1, class T2, class T3, class T4, class T5, class T6, 00100 class T7, class T8 > 00101 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6, 00102 T7 &p7, T8 &p8 ) 00103 { 00104 A::apply( p1, p2, p3, p4, p5, p6, p7, p8 ); 00105 B::apply( p1, p2, p3, p4, p5, p6, p7, p8 ); 00106 } 00107 00108 template< class T1, class T2, class T3, class T4, class T5, class T6, 00109 class T7, class T8, class T9 > 00110 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6, 00111 T7 &p7, T8 &p8, T9 &p9 ) 00112 { 00113 A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); 00114 B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); 00115 } 00116 00117 template< class T1, class T2, class T3, class T4, class T5, class T6, 00118 class T7, class T8, class T9, class T10 > 00119 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6, 00120 T7 &p7, T8 &p8, T9 &p9, T10 &p10 ) 00121 { 00122 A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); 00123 B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); 00124 } 00125 00126 template< class T1, class T2, class T3, class T4, class T5, class T6, 00127 class T7, class T8, class T9, class T10, class T11 > 00128 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6, 00129 T7 &p7, T8 &p8, T9 &p9, T10 &p10, T11 &p11 ) 00130 { 00131 A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); 00132 B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); 00133 } 00134 00135 template< class T1, class T2, class T3, class T4, class T5, class T6, 00136 class T7, class T8, class T9, class T10, class T11, class T12 > 00137 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6, 00138 T7 &p7, T8 &p8, T9 &p9, T10 &p10, T11 &p11, 00139 T12 &p12 ) 00140 { 00141 A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); 00142 B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); 00143 } 00144 00145 template< class T1, class T2, class T3, class T4, class T5, class T6, 00146 class T7, class T8, class T9, class T10, class T11, class T12, 00147 class T13> 00148 static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6, 00149 T7 &p7, T8 &p8, T9 &p9, T10 &p10, T11 &p11, 00150 T12 &p12, T13 &p13 ) 00151 { 00152 A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); 00153 B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); 00154 } 00155 }; 00156 00157 } 00158 00159 00160 00220 template< template< int > class Operation, int first, int last > 00221 class ForLoop 00222 : public GenericForLoop< ForLoopHelper::Apply, Operation, first, last > 00223 { 00224 dune_static_assert( (first <= last), "ForLoop: first > last" ); 00225 }; 00226 00227 } 00228 00229 #endif // #ifndef DUNE_COMMON_FORLOOP_HH