dune-common  2.2.1
forloop.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set ts=8 sw=2 et sts=2:
3 
4 #ifndef DUNE_COMMON_FORLOOP_HH
5 #define DUNE_COMMON_FORLOOP_HH
6 
12 
13 namespace Dune
14 {
15 
16  // GenericForLoop
17  // --------------
18 
19  template< template< class, class > class Operation, template< int > class Value, int first, int last >
21  : public Operation< Value< first >, GenericForLoop< Operation, Value, first+1, last > >
22  {
23  dune_static_assert( (first <= last), "GenericForLoop: first > last" );
24  };
25 
26  template< template< class, class > class Operation, template< int > class Value, int last >
27  class GenericForLoop< Operation, Value, last, last >
28  : public Value< last >
29  {};
30 
31 
32 
33  // ForLoopHelper
34  // -------------
35 
36  namespace ForLoopHelper
37  {
38 
39  template< class A, class B >
40  struct Apply
41  {
42  static void apply ()
43  {
44  A::apply();
45  B::apply();
46  }
47 
48  template< class T1 >
49  static void apply ( T1 &p1 )
50  {
51  A::apply( p1 );
52  B::apply( p1 );
53  }
54 
55  template< class T1, class T2 >
56  static void apply ( T1 &p1, T2 &p2 )
57  {
58  A::apply( p1, p2 );
59  B::apply( p1, p2 );
60  }
61 
62  template< class T1, class T2, class T3 >
63  static void apply ( T1 &p1, T2 &p2, T3 &p3 )
64  {
65  A::apply( p1, p2, p3 );
66  B::apply( p1, p2, p3 );
67  }
68 
69  template< class T1, class T2, class T3, class T4 >
70  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4 )
71  {
72  A::apply( p1, p2, p3, p4 );
73  B::apply( p1, p2, p3, p4 );
74  }
75 
76  template< class T1, class T2, class T3, class T4, class T5 >
77  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5 )
78  {
79  A::apply( p1, p2, p3, p4, p5 );
80  B::apply( p1, p2, p3, p4, p5 );
81  }
82 
83  template< class T1, class T2, class T3, class T4, class T5, class T6 >
84  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6 )
85  {
86  A::apply( p1, p2, p3, p4, p5, p6 );
87  B::apply( p1, p2, p3, p4, p5, p6 );
88  }
89 
90  template< class T1, class T2, class T3, class T4, class T5, class T6,
91  class T7 >
92  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6,
93  T7 &p7 )
94  {
95  A::apply( p1, p2, p3, p4, p5, p6, p7 );
96  B::apply( p1, p2, p3, p4, p5, p6, p7 );
97  }
98 
99  template< class T1, class T2, class T3, class T4, class T5, class T6,
100  class T7, class T8 >
101  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6,
102  T7 &p7, T8 &p8 )
103  {
104  A::apply( p1, p2, p3, p4, p5, p6, p7, p8 );
105  B::apply( p1, p2, p3, p4, p5, p6, p7, p8 );
106  }
107 
108  template< class T1, class T2, class T3, class T4, class T5, class T6,
109  class T7, class T8, class T9 >
110  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6,
111  T7 &p7, T8 &p8, T9 &p9 )
112  {
113  A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
114  B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
115  }
116 
117  template< class T1, class T2, class T3, class T4, class T5, class T6,
118  class T7, class T8, class T9, class T10 >
119  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6,
120  T7 &p7, T8 &p8, T9 &p9, T10 &p10 )
121  {
122  A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
123  B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
124  }
125 
126  template< class T1, class T2, class T3, class T4, class T5, class T6,
127  class T7, class T8, class T9, class T10, class T11 >
128  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6,
129  T7 &p7, T8 &p8, T9 &p9, T10 &p10, T11 &p11 )
130  {
131  A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 );
132  B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 );
133  }
134 
135  template< class T1, class T2, class T3, class T4, class T5, class T6,
136  class T7, class T8, class T9, class T10, class T11, class T12 >
137  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6,
138  T7 &p7, T8 &p8, T9 &p9, T10 &p10, T11 &p11,
139  T12 &p12 )
140  {
141  A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 );
142  B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 );
143  }
144 
145  template< class T1, class T2, class T3, class T4, class T5, class T6,
146  class T7, class T8, class T9, class T10, class T11, class T12,
147  class T13>
148  static void apply ( T1 &p1, T2 &p2, T3 &p3, T4 &p4, T5 &p5, T6 &p6,
149  T7 &p7, T8 &p8, T9 &p9, T10 &p10, T11 &p11,
150  T12 &p12, T13 &p13 )
151  {
152  A::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 );
153  B::apply( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 );
154  }
155  };
156 
157  }
158 
159 
160 
220  template< template< int > class Operation, int first, int last >
221  class ForLoop
222  : public GenericForLoop< ForLoopHelper::Apply, Operation, first, last >
223  {
224  dune_static_assert( (first <= last), "ForLoop: first > last" );
225  };
226 
227 }
228 
229 #endif // #ifndef DUNE_COMMON_FORLOOP_HH