dune-pdelab  2.5-dev
decorator.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 
4 #ifndef DUNE_PDELAB_ORDERING_DECORATOR_HH
5 #define DUNE_PDELAB_ORDERING_DECORATOR_HH
6 
7 #include <dune/typetree/typetree.hh>
8 
12 
13 namespace Dune {
14  namespace PDELab {
15 
18 
19  namespace ordering {
20 
21 #ifndef DOXYGEN
22 
23  // Forward declaration for is_decorated specialization
24  template<typename D, typename U>
25  struct decorated_ordering_tag;
26 
27  namespace impl {
28 
29  struct is_decorated
30  {};
31 
32  template<typename DecoratedOrderingTag, std::size_t level>
33  struct basetag_access_provider
34  {};
35 
36  // provide access to the base tag for disambiguation of member
37  // accesses in case those are overloaded by a decorator.
38  template<typename D, typename U>
39  struct basetag_access_provider<decorated_ordering_tag<D,U>,0>
40  : public is_decorated
41  {
42  typedef U BaseTag;
43 
44  const BaseTag& baseTag() const
45  {
46  return static_cast<decorated_ordering_tag<D,U>& >(*this);
47  }
48 
49  BaseTag& baseTag()
50  {
51  return static_cast<decorated_ordering_tag<D,U>& >(*this);
52  }
53 
54  };
55 
56  template<typename T, T v>
57  struct lazy_constant
58  {
59  typedef std::integral_constant<T,v> type;
60  };
61 
62  template<typename D>
63  struct lazy_level
64  {
65  typedef std::integral_constant<std::size_t,D::level> type;
66  };
67 
68  template<typename D>
69  struct decoration_level
70  : public std::conditional<
71  std::is_base_of<is_decorated, D>::value,
72  lazy_level<D>,
73  lazy_constant<std::size_t,0>
74  >::type::type
75  {};
76 
77  } // namespace impl
78 
79 #endif // DOXYGEN
80 
81  template<typename D, typename U>
83  : U
84  , impl::basetag_access_provider<decorated_ordering_tag<D,U>,impl::decoration_level<U>::value>
85  {
86 
87  typedef D Decorator;
88  typedef U Undecorated;
89 
90  static const std::size_t level = impl::decoration_level<U>::value + 1;
91 
93  {}
94 
95  decorated_ordering_tag(const Undecorated& u)
96  : Undecorated(u)
97  {}
98 
99  decorated_ordering_tag(Undecorated&& u)
100  : Undecorated(std::move(u))
101  {}
102 
103  };
104 
105 
106  namespace {
107 
108  // recursive helper for undecorated_ordering that traverses down the Ordering tree level times
109 
110  // end of recursion
111  template<typename Ordering>
112  const Ordering& _unwind_decorators(const Ordering& ordering, std::integral_constant<std::size_t,0>)
113  {
114  return ordering;
115  }
116 
117  // recursive implementation - this uses decltype to avoid implementing a separate meta function
118  // for calculating the return type
119  template<typename Ordering, std::size_t level>
120  auto _unwind_decorators(const Ordering& ordering, std::integral_constant<std::size_t,level>)
121  -> decltype(
122  _unwind_decorators(
123  ordering.template child<0>(),
124  std::integral_constant<std::size_t,level-1>()
125  )
126  )
127  {
128  return _unwind_decorators(
129  ordering.template child<0>(),
130  std::integral_constant<std::size_t,level-1>()
131  );
132  }
133 
134  }
135 
136 
138 
141  template<typename GFS>
142  auto undecorated_ordering(const GFS& gfs)
143  -> decltype(
144  _unwind_decorators(
145  gfs.ordering(),
146  impl::decoration_level<typename GFS::OrderingTag>()
147  )
148  )
149  {
150  return _unwind_decorators(
151  gfs.ordering(),
152  impl::decoration_level<typename GFS::OrderingTag>()
153  );
154  }
155 
156 
157  template<typename GFS,typename Transformation,typename Undecorated,typename GlueTag, typename Tag>
159  : public TypeTree::meta_function
160  {
161  typedef decltype(
163  TypeTree::declptr<GFS>(), // the source GridFunctionSpace
164  TypeTree::declptr<Transformation>(), // the full transformation descriptor
165  TypeTree::declptr<Undecorated>(), // the type of the undecorated Ordering to be wrapped in the decorator
166  TypeTree::declptr<GlueTag>(), // the decorated_ordering_tag for the current decoration nesting level
167  TypeTree::declptr<Tag>() // the decorator tag
168  )
169  ) type;
170  };
171 
172 
173  template<typename GFS, typename Transformation, typename OrderingTag>
175  {
176 
177  static const bool recursive = false;
178 
179  typedef typename leaf_gfs_to_ordering_descriptor<
180  GFS,
181  Transformation,
182  typename OrderingTag::Undecorated
184 
185  typedef typename undecorated_descriptor::transformed_type undecorated_type;
186 
187  typedef typename gfs_to_decorator_descriptor<
188  GFS,
189  Transformation,
190  undecorated_type,
191  OrderingTag,
192  typename OrderingTag::Decorator
194 
195  typedef typename decorator_descriptor::transformed_type transformed_type;
196  typedef typename decorator_descriptor::transformed_storage_type transformed_storage_type;
197 
198  static transformed_type transform(const GFS& gfs, const Transformation& t)
199  {
200  return decorator_descriptor::transform(gfs,t,std::make_shared<undecorated_type>(undecorated_descriptor::transform(gfs,t)));
201  }
202 
203  static transformed_storage_type transform(std::shared_ptr<const GFS>& gfs_pointer, const Transformation& t)
204  {
205  return decorator_descriptor::transform(gfs_pointer,t,undecorated_descriptor::transform(gfs_pointer,t));
206  }
207 
208  };
209 
210  template<typename GFS, typename Transformation, typename D, typename U>
213 
214 
215  template<typename GFS, typename Transformation, typename OrderingTag>
217  {
218 
219  static const bool recursive = true;
220 
221  template<typename TC>
222  struct result
223  {
224 
225  typedef typename power_gfs_to_ordering_descriptor<
226  GFS,
227  Transformation,
228  typename OrderingTag::Undecorated
230 
231  typedef typename undecorated_descriptor::template result<TC>::type undecorated_type;
232  typedef typename gfs_to_decorator_descriptor<
233  GFS,
234  Transformation,
235  undecorated_type,
236  OrderingTag,
237  typename OrderingTag::Decorator
239 
240  typedef typename decorator_descriptor::transformed_type type;
241  typedef typename decorator_descriptor::transformed_storage_type storage_type;
242 
243  };
244 
245  template<typename TC>
246  static typename result<TC>::type transform(const GFS& gfs, const Transformation& t, const array<std::shared_ptr<TC>,TypeTree::StaticDegree<GFS>::value>& children)
247  {
249  }
250 
251  template<typename TC>
252  static typename result<TC>::storage_type transform_storage(std::shared_ptr<const GFS> gfs_pointer, const Transformation& t, const array<std::shared_ptr<TC>,TypeTree::StaticDegree<GFS>::value>& children)
253  {
255  }
256 
257  };
258 
259 
260  template<typename GFS, typename Transformation, typename OrderingTag>
262  {
263 
264  static const bool recursive = false;
265 
266  typedef typename power_gfs_to_ordering_descriptor<
267  GFS,
268  Transformation,
269  typename OrderingTag::Undecorated
271 
272  typedef typename undecorated_descriptor::transformed_type undecorated_type;
273 
274  typedef typename gfs_to_decorator_descriptor<
275  GFS,
276  Transformation,
277  undecorated_type,
278  OrderingTag,
279  typename OrderingTag::Decorator
281 
282  typedef typename decorator_descriptor::transformed_type transformed_type;
283  typedef typename decorator_descriptor::transformed_storage_type transformed_storage_type;
284 
285  static transformed_type transform(const GFS& gfs, const Transformation& t)
286  {
287  return decorator_descriptor::transform(gfs,t,std::make_shared<undecorated_type>(undecorated_descriptor::transform(gfs,t)));
288  }
289 
290  static transformed_storage_type transform_storage(std::shared_ptr<const GFS>& gfs_pointer, const Transformation& t)
291  {
292  return decorator_descriptor::transform_storage(gfs_pointer,t,undecorated_descriptor::transform_storage(gfs_pointer,t));
293  }
294 
295  };
296 
297 
298  template<typename GFS, typename Transformation, typename OrderingTag>
300  : public std::conditional<
301  power_gfs_to_ordering_descriptor<
302  GFS,
303  Transformation,
304  typename OrderingTag::Undecorated
305  >::type::recursive,
306  recursive_power_gfs_to_decorated<
307  GFS,
308  Transformation,
309  OrderingTag
310  >,
311  nonrecursive_power_gfs_to_decorated<
312  GFS,
313  Transformation,
314  OrderingTag>
315  >::type
316  {};
317 
318  template<typename GFS, typename Transformation, typename D, typename U>
320  GFS,
321  Transformation,
323  >
325 
326 
327 
328 
329 
330 
331  template<typename GFS, typename Transformation, typename OrderingTag>
333  {
334 
335  static const bool recursive = true;
336 
337  template<typename... TC>
338  struct result
339  {
340 
341  typedef typename composite_gfs_to_ordering_descriptor<
342  GFS,
343  Transformation,
344  typename OrderingTag::Undecorated
346 
347  typedef typename undecorated_descriptor::template result<TC...>::type undecorated_type;
348  typedef typename gfs_to_decorator_descriptor<
349  GFS,
350  Transformation,
351  undecorated_type,
352  OrderingTag,
353  typename OrderingTag::Decorator
355 
356  typedef typename decorator_descriptor::transformed_type type;
357  typedef typename decorator_descriptor::transformed_storage_type storage_type;
358 
359  };
360 
361  template<typename... TC>
362  static typename result<TC...>::type transform(const GFS& gfs, const Transformation& t, std::shared_ptr<TC>... children)
363  {
365  }
366 
367  template<typename... TC>
368  static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const GFS> gfs_pointer, const Transformation& t, std::shared_ptr<TC>... children)
369  {
371  }
372 
373  };
374 
375 
376  template<typename GFS, typename Transformation, typename OrderingTag>
378  {
379 
380  static const bool recursive = false;
381 
382  typedef typename composite_gfs_to_ordering_descriptor<
383  GFS,
384  Transformation,
385  typename OrderingTag::Undecorated
387 
388  typedef typename undecorated_descriptor::transformed_type undecorated_type;
389 
390  typedef typename gfs_to_decorator_descriptor<
391  GFS,
392  Transformation,
393  undecorated_type,
394  OrderingTag,
395  typename OrderingTag::Decorator
397 
398  typedef typename decorator_descriptor::transformed_type transformed_type;
399  typedef typename decorator_descriptor::transformed_storage_type transformed_storage_type;
400 
401  static transformed_type transform(const GFS& gfs, const Transformation& t)
402  {
403  return decorator_descriptor::transform(gfs,t,std::make_shared<undecorated_type>(undecorated_descriptor::transform(gfs,t)));
404  }
405 
406  static transformed_storage_type transform_storage(std::shared_ptr<const GFS>& gfs_pointer, const Transformation& t)
407  {
408  return decorator_descriptor::transform_storage(gfs_pointer,t,undecorated_descriptor::transform(gfs_pointer,t));
409  }
410 
411  };
412 
413 
414  template<typename GFS, typename Transformation, typename OrderingTag>
416  : public std::conditional<
417  composite_gfs_to_ordering_descriptor<
418  GFS,
419  Transformation,
420  typename OrderingTag::Undecorated
421  >::type::recursive,
422  recursive_composite_gfs_to_decorated<
423  GFS,
424  Transformation,
425  OrderingTag
426  >,
427  nonrecursive_composite_gfs_to_decorated<
428  GFS,
429  Transformation,
430  OrderingTag>
431  >::type
432  {};
433 
434 
435  template<typename GFS, typename Transformation, typename D, typename U>
438 
439  } // namespace ordering
440 
442 
443  } // namespace PDELab
444 } // namespace Dune
445 
446 #endif // DUNE_PDELAB_ORDERING_DECORATOR_HH
static result< TC >::storage_type transform_storage(std::shared_ptr< const GFS > gfs_pointer, const Transformation &t, const array< std::shared_ptr< TC >, TypeTree::StaticDegree< GFS >::value > &children)
Definition: decorator.hh:252
decorator_descriptor::transformed_storage_type storage_type
Definition: decorator.hh:241
STL namespace.
auto undecorated_ordering(const GFS &gfs) -> decltype(_unwind_decorators(gfs.ordering(), impl::decoration_level< typename GFS::OrderingTag >()))
Unwinds the stack of decorators on top of the base ordering of gfs and returns the base ordering...
Definition: decorator.hh:142
undecorated_descriptor::transformed_type undecorated_type
Definition: decorator.hh:272
static const unsigned int value
Definition: gridfunctionspace/tags.hh:139
undecorated_descriptor::transformed_type undecorated_type
Definition: decorator.hh:388
power_gfs_to_ordering_descriptor< GFS, Transformation, typename OrderingTag::Undecorated >::type undecorated_descriptor
Definition: decorator.hh:229
decorator_descriptor::transformed_type transformed_type
Definition: decorator.hh:282
composite_gfs_to_decorated< GFS, Transformation, decorated_ordering_tag< D, U > > register_composite_gfs_to_ordering_descriptor(GFS *, Transformation *, decorated_ordering_tag< D, U > *)
gfs_to_chunked< GFS, Transformation, Undecorated, GlueTag > register_gfs_to_decorator_descriptor(GFS *, Transformation *, Undecorated *, GlueTag *, Chunked< UndecoratedTag > *)
decorated_ordering_tag(const Undecorated &u)
Definition: decorator.hh:95
gfs_to_decorator_descriptor< GFS, Transformation, undecorated_type, OrderingTag, typename OrderingTag::Decorator >::type decorator_descriptor
Definition: decorator.hh:354
gfs_to_decorator_descriptor< GFS, Transformation, undecorated_type, OrderingTag, typename OrderingTag::Decorator >::type decorator_descriptor
Definition: decorator.hh:280
leaf_gfs_to_decorated< GFS, Transformation, decorated_ordering_tag< D, U > > register_leaf_gfs_to_ordering_descriptor(GFS *, Transformation *, decorated_ordering_tag< D, U > *)
composite_gfs_to_ordering_descriptor< GFS, Transformation, typename OrderingTag::Undecorated >::type undecorated_descriptor
Definition: decorator.hh:386
decorated_ordering_tag(Undecorated &&u)
Definition: decorator.hh:99
static transformed_storage_type transform(std::shared_ptr< const GFS > &gfs_pointer, const Transformation &t)
Definition: decorator.hh:203
decorator_descriptor::transformed_storage_type transformed_storage_type
Definition: decorator.hh:283
static result< TC... >::storage_type transform_storage(std::shared_ptr< const GFS > gfs_pointer, const Transformation &t, std::shared_ptr< TC >... children)
Definition: decorator.hh:368
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: decorator.hh:198
decorated_ordering_tag()
Definition: decorator.hh:92
U Undecorated
Definition: decorator.hh:88
leaf_gfs_to_ordering_descriptor< GFS, Transformation, typename OrderingTag::Undecorated >::type undecorated_descriptor
Definition: decorator.hh:183
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: decorator.hh:285
decorator_descriptor::transformed_storage_type transformed_storage_type
Definition: decorator.hh:399
static result< TC... >::type transform(const GFS &gfs, const Transformation &t, std::shared_ptr< TC >... children)
Definition: decorator.hh:362
static result< TC >::type transform(const GFS &gfs, const Transformation &t, const array< std::shared_ptr< TC >, TypeTree::StaticDegree< GFS >::value > &children)
Definition: decorator.hh:246
gfs_to_decorator_descriptor< GFS, Transformation, undecorated_type, OrderingTag, typename OrderingTag::Decorator >::type decorator_descriptor
Definition: decorator.hh:238
decorator_descriptor::transformed_type transformed_type
Definition: decorator.hh:398
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: decorator.hh:401
undecorated_descriptor::template result< TC >::type undecorated_type
Definition: decorator.hh:231
gfs_to_decorator_descriptor< GFS, Transformation, undecorated_type, OrderingTag, typename OrderingTag::Decorator >::type decorator_descriptor
Definition: decorator.hh:396
power_gfs_to_decorated< GFS, Transformation, decorated_ordering_tag< D, U > > register_power_gfs_to_ordering_descriptor(GFS *, Transformation *, decorated_ordering_tag< D, U > *)
undecorated_descriptor::template result< TC... >::type undecorated_type
Definition: decorator.hh:347
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
undecorated_descriptor::transformed_type undecorated_type
Definition: decorator.hh:185
power_gfs_to_ordering_descriptor< GFS, Transformation, typename OrderingTag::Undecorated >::type undecorated_descriptor
Definition: decorator.hh:270
decorator_descriptor::transformed_type type
Definition: decorator.hh:356
gfs_to_decorator_descriptor< GFS, Transformation, undecorated_type, OrderingTag, typename OrderingTag::Decorator >::type decorator_descriptor
Definition: decorator.hh:193
decorator_descriptor::transformed_type type
Definition: decorator.hh:240
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > &gfs_pointer, const Transformation &t)
Definition: decorator.hh:290
decorator_descriptor::transformed_storage_type storage_type
Definition: decorator.hh:357
D Decorator
Definition: decorator.hh:87
decorator_descriptor::transformed_storage_type transformed_storage_type
Definition: decorator.hh:196
decorator_descriptor::transformed_type transformed_type
Definition: decorator.hh:195
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > &gfs_pointer, const Transformation &t)
Definition: decorator.hh:406
composite_gfs_to_ordering_descriptor< GFS, Transformation, typename OrderingTag::Undecorated >::type undecorated_descriptor
Definition: decorator.hh:345