FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
avail_functor.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
9#include <kernel/util/string.hpp>
10
11// includes, STL
12#include <set>
13#include <map>
14
15namespace FEAT
16{
17 namespace Cubature
18 {
20 namespace Intern
21 {
22 template<
23 typename Factory_,
24 typename Functor_,
25 bool variadic_ = Factory_::variadic>
26 class AvailFunctorHelper;
27
28 template<
29 typename Factory_,
30 typename Functor_>
31 class AvailFunctorHelper<Factory_, Functor_, false>
32 {
33 private:
34 Functor_& _functor;
35
36 public:
37 explicit AvailFunctorHelper(Functor_& functor) :
38 _functor(functor)
39 {
40 _functor.add_name(Factory_::name());
41 }
42
43 void alias(const String& name)
44 {
45 _functor.add_alias(name, Factory_::name());
46 }
47 };
48
49 template<
50 typename Factory_,
51 typename Functor_>
52 class AvailFunctorHelper<Factory_, Functor_, true>
53 {
54 private:
55 Functor_& _functor;
56
57 public:
58 explicit AvailFunctorHelper(Functor_& functor) :
59 _functor(functor)
60 {
61 _functor.add_name(Factory_::name() + ":<"
62 + stringify(int(Factory_::min_points)) + "-"
63 + stringify(int(Factory_::max_points)) + ">");
64 }
65
66 void alias(const String& name, int num_points)
67 {
68 _functor.add_alias(name, Factory_::name() + ":" + stringify(num_points));
69 }
70 };
71
72 class AvailSetFunctor
73 {
74 private:
75 std::set<String>& _names;
76 bool _aliases;
77
78 public:
79 explicit AvailSetFunctor(std::set<String>& names, bool aliases) :
80 _names(names),
81 _aliases(aliases)
82 {
83 }
84
85 template<typename Factory_>
86 void factory()
87 {
88 AvailFunctorHelper<Factory_, AvailSetFunctor> functor(*this);
89 if(_aliases)
90 Factory_::alias(functor);
91 }
92
93 void add_name(const String& name)
94 {
95 _names.insert(name);
96 }
97
98 void add_alias(const String& alias, const String& /*name*/)
99 {
100 if(_aliases)
101 _names.insert(alias);
102 }
103 };
104
105 class AvailMapFunctor
106 {
107 private:
108 std::map<String,String>& _names;
109
110 public:
111 explicit AvailMapFunctor(std::map<String,String>& names) :
112 _names(names)
113 {
114 }
115
116 template<typename Factory_>
117 void factory()
118 {
119 AvailFunctorHelper<Factory_, AvailMapFunctor> functor(*this);
120 Factory_::alias(functor);
121 }
122
123 void add_name(const String& name)
124 {
125 _names.insert(std::make_pair(name, String()));
126 }
127
128 void add_alias(const String& alias, const String& name)
129 {
130 _names.insert(std::make_pair(alias, name));
131 }
132 };
133 } // namespace internal
135 } // namespace Cubature
136} // namespace FEAT
FEAT namespace.
Definition: adjactor.hpp:12
String stringify(const T_ &item)
Converts an item into a String.
Definition: string.hpp:993