forloop.hh

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

Generated on Fri Apr 29 2011 with Doxygen (ver 1.7.1) [doxygen-log,error-log].