dune-common  2.2.0
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 
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