Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
AlgorithmRegistry.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <optional>
9
10#include <ext/functional>
11#include <ext/memory>
12#include <ext/typeinfo>
13#include <ext/vector>
14#include <ext/list>
15#include <ext/string>
16#include <ext/set>
17#include <ext/map>
18#include <ext/tuple>
19
22#include "BaseRegistryEntry.hpp"
23
26
27namespace abstraction {
28
30public:
31 class Entry : public BaseRegistryEntry {
32 AlgorithmFullInfo m_entryInfo;
33
34 std::optional<std::string> m_documentation;
35
36 public:
37 explicit Entry ( AlgorithmFullInfo entryInfo ) : m_entryInfo ( std::move ( entryInfo ) ) {
38 }
39
40 const AlgorithmFullInfo & getEntryInfo ( ) const {
41 return m_entryInfo;
42 }
43
44 const std::optional < std::string > & getDocumentation ( ) {
45 return m_documentation;
46 }
47
48 void setDocumentation ( std::string doc ) {
49 m_documentation = std::move ( doc );
50 }
51 };
52
53private:
54 template < class ObjectType, class Return, class ... Params >
55 class MemberImpl : public Entry {
56 std::function < Return ( typename std::remove_reference < ObjectType >::type *, Params ... ) > m_callback;
57
58 public:
59 explicit MemberImpl ( std::array < std::string, sizeof ... ( Params ) > paramNames, std::function < Return ( typename std::remove_reference < ObjectType >::type *, Params ... ) > callback ) : Entry ( AlgorithmFullInfo::methodEntryInfo < ObjectType, Return, Params ... > ( std::move ( paramNames ) ) ), m_callback ( std::move ( callback ) ) {
60 }
61
62 std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
63 };
64
65 template < class Return, class ... Params >
66 class EntryImpl : public Entry {
67 std::function < Return ( Params ... ) > m_callback;
68
69 public:
70 explicit EntryImpl ( AlgorithmCategories::AlgorithmCategory category, std::array < std::string, sizeof ... ( Params ) > paramNames, std::function < Return ( Params ... ) > callback ) : Entry ( AlgorithmFullInfo::algorithmEntryInfo < Return, Params ... > ( category, std::move ( paramNames ) ) ), m_callback ( std::move ( callback ) ) {
71 }
72
73 std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
74 };
75
76 template < class Return, class ... Params >
77 class WrapperImpl : public Entry {
78 std::function < std::shared_ptr < abstraction::OperationAbstraction > ( Params ... ) > m_wrapperFinder;
79
80 public:
81 explicit WrapperImpl ( std::array < std::string, sizeof ... ( Params ) > paramNames, std::function < std::shared_ptr < abstraction::OperationAbstraction > ( Params ... ) > wrapperFinder ) : Entry ( AlgorithmFullInfo::wrapperEntryInfo < Return, Params ... > ( std::move ( paramNames ) ) ), m_wrapperFinder ( std::move ( wrapperFinder ) ) {
82 }
83
84 std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
85 };
86
87 class RawImpl : public Entry {
88 std::function < std::shared_ptr < abstraction::Value > ( const std::vector < std::shared_ptr < abstraction::Value > > & ) > m_rawCallback;
89
90 public:
91 explicit RawImpl ( ext::pair < std::string, abstraction::TypeQualifiers::TypeQualifierSet > result, ext::vector < ext::tuple < std::string, abstraction::TypeQualifiers::TypeQualifierSet, std::string > > paramSpecs, std::function < std::shared_ptr < abstraction::Value > ( std::vector < std::shared_ptr < abstraction::Value > > ) > rawCallback ) : Entry ( AlgorithmFullInfo::rawEntryInfo ( std::move ( result ), std::move ( paramSpecs ) ) ), m_rawCallback ( std::move ( rawCallback ) ) {
92 }
93
94 std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
95 };
96
98
99 static bool isRegistered ( const std::string & algorithm, const ext::vector < std::string > & templateParams, const AlgorithmBaseInfo & entryInfo );
100
101 static void registerInternal ( std::string algorithm, ext::vector < std::string > templateParams, std::unique_ptr < Entry > value );
102
103 static void unregisterInternal ( const std::string & algorithm, const ext::vector < std::string > & templateParams, const AlgorithmBaseInfo & entryInfo );
104
105 static void setDocumentation ( const std::string & algorithm, const ext::vector < std::string > & templateParams, const AlgorithmBaseInfo & entryInfo, std::string documentation );
106
107 static ext::list < std::unique_ptr < Entry > > & findAbstractionGroup ( const std::string & name, const ext::vector < std::string > & templateParams );
108
109public:
110 template < class Algo, class ObjectType, class ... ParamTypes >
111 static void setDocumentationOfMethod ( const std::string & methodName, const std::string & documentation ) {
112 std::string algorithm = ext::to_string < Algo > ( ) + "::" + methodName;
113 ext::vector < std::string > templateParams;
114
115 setDocumentation ( algorithm, templateParams, AlgorithmBaseInfo::methodEntryInfo < ObjectType &, ParamTypes ... > ( ), documentation );
116 }
117
118 template < class Algo, class ... ParamTypes >
119 static void setDocumentationOfAlgorithm ( AlgorithmCategories::AlgorithmCategory category, const std::string & documentation ) {
120 std::string algorithm = ext::to_string < Algo > ( );
121 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
122 algorithm = ext::erase_template_info ( algorithm );
123
124 setDocumentation ( algorithm, templateParams, AlgorithmBaseInfo::algorithmEntryInfo < ParamTypes ... > ( category ), documentation );
125 }
126
127 template < class Algo, class ... ParamTypes >
128 static void setDocumentationOfWrapper ( const std::string & documentation ) {
129 std::string algorithm = ext::to_string < Algo > ( );
130 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
131 algorithm = ext::erase_template_info ( algorithm );
132
133 setDocumentation ( algorithm, templateParams, AlgorithmBaseInfo::wrapperEntryInfo < ParamTypes ... > ( ), documentation );
134 }
135
136 template < class Algo, class ObjectType, class ... ParamTypes >
137 static void unregisterMethod ( const std::string & methodName ) {
138 std::string algorithm = ext::to_string < Algo > ( ) + "::" + methodName;
139 ext::vector < std::string > templateParams;
140
141 unregisterInternal ( algorithm, templateParams, AlgorithmBaseInfo::methodEntryInfo < ObjectType &, ParamTypes ... > ( ) );
142 }
143
144 template < class Algo, class ... ParamTypes >
146 std::string algorithm = ext::to_string < Algo > ( );
147 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
148 algorithm = ext::erase_template_info ( algorithm );
149
150 unregisterInternal ( algorithm, templateParams, AlgorithmBaseInfo::algorithmEntryInfo < ParamTypes ... > ( category ) );
151 }
152
153 template < class Algo, class ... ParamTypes >
154 static void unregisterWrapper ( ) {
155 std::string algorithm = ext::to_string < Algo > ( );
156 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
157 algorithm = ext::erase_template_info ( algorithm );
158
159 unregisterInternal ( algorithm, templateParams, AlgorithmBaseInfo::wrapperEntryInfo < ParamTypes ... > ( ) );
160 }
161
162 template < class Algo >
164 std::string algorithm = ext::to_string < Algo > ( );
165 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
166 algorithm = ext::erase_template_info ( algorithm );
167
168 unregisterInternal ( algorithm, templateParams, AlgorithmBaseInfo::rawEntryInfo ( std::move ( parameterSpecs ) ) );
169 }
170
171 template < class Algo, class ObjectType, class ReturnType, class ... ParamTypes >
172 static void registerMethod ( ReturnType ( ObjectType:: * callback ) ( ParamTypes ... ), const std::string & methodName, std::array < std::string, sizeof ... ( ParamTypes ) > paramNames ) {
173 std::string algorithm = ext::to_string < Algo > ( ) + "::" + methodName;
174 ext::vector < std::string > templateParams;
175
176 registerInternal ( std::move ( algorithm ), std::move ( templateParams ), std::make_unique < MemberImpl < ObjectType &, ReturnType, ParamTypes ... > > ( std::move ( paramNames ), callback ) );
177 }
178
179 template < class Algo, class ObjectType, class ReturnType, class ... ParamTypes >
180 static void registerMethod ( ReturnType ( ObjectType:: * callback ) ( ParamTypes ... ) const, const std::string & methodName, std::array < std::string, sizeof ... ( ParamTypes ) > paramNames ) {
181 std::string algorithm = ext::to_string < Algo > ( ) + "::" + methodName;
182 ext::vector < std::string > templateParams;
183
184 registerInternal ( std::move ( algorithm ), std::move ( templateParams ), std::make_unique < MemberImpl < const ObjectType &, ReturnType, ParamTypes ... > > ( std::move ( paramNames ), callback ) );
185 }
186
187 template < class Algo, class ReturnType, class ... ParamTypes >
188 static void registerAlgorithm ( ReturnType ( * callback ) ( ParamTypes ... ), AlgorithmCategories::AlgorithmCategory category, std::array < std::string, sizeof ... ( ParamTypes ) > paramNames ) {
189 std::string algorithm = ext::to_string < Algo > ( );
190 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
191 algorithm = ext::erase_template_info ( algorithm );
192
193 registerInternal ( std::move ( algorithm ), std::move ( templateParams ), std::make_unique < EntryImpl < ReturnType, ParamTypes ... > > ( category, std::move ( paramNames ), callback ) );
194 }
195
196 template < class Algo, class ReturnType, class ... ParamTypes >
197 static void registerWrapper ( std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( ParamTypes ... ), std::array < std::string, sizeof ... ( ParamTypes ) > paramNames ) {
198 std::string algorithm = ext::to_string < Algo > ( );
199 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
200 algorithm = ext::erase_template_info ( algorithm );
201
202 registerInternal ( std::move ( algorithm ), std::move ( templateParams ), std::make_unique < WrapperImpl < ReturnType, ParamTypes ... > > ( std::move ( paramNames ), callback ) );
203 }
204
205 template < class Algo >
206 static void registerRaw ( std::shared_ptr < abstraction::Value > ( * callback ) ( const std::vector < std::shared_ptr < abstraction::Value > > & ), ext::pair < std::string, abstraction::TypeQualifiers::TypeQualifierSet > result, ext::vector < ext::tuple < std::string, abstraction::TypeQualifiers::TypeQualifierSet, std::string > > paramSpecs ) {
207 std::string algorithm = ext::to_string < Algo > ( );
208 registerRaw ( algorithm, callback, std::move ( result ), std::move ( paramSpecs ) );
209 }
210
211 static void registerRaw ( std::string algorithm, std::function < std::shared_ptr < abstraction::Value > ( const std::vector < std::shared_ptr < abstraction::Value > > & ) > callback, ext::pair < std::string, abstraction::TypeQualifiers::TypeQualifierSet > result, ext::vector < ext::tuple < std::string, abstraction::TypeQualifiers::TypeQualifierSet, std::string > > paramSpecs ) {
212 ext::vector < std::string > templateParams = ext::get_template_info ( algorithm );
213 algorithm = ext::erase_template_info ( algorithm );
214
215 registerInternal ( std::move ( algorithm ), std::move ( templateParams ), std::make_unique < RawImpl > ( std::move ( result ), std::move ( paramSpecs ), std::move ( callback ) ) );
216 }
217
218 static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < abstraction::TypeQualifiers::TypeQualifierSet > & typeQualifiers, AlgorithmCategories::AlgorithmCategory category );
219
220 static ext::set < ext::pair < std::string, ext::vector < std::string > > > listGroup ( const std::string & group );
221
222 static ext::list < ext::tuple < AlgorithmFullInfo, std::optional < std::string > > > listOverloads ( const std::string & algorithm, const ext::vector < std::string > & templateParams );
223
225};
226
227} /* namespace abstraction */
228
232
233namespace abstraction {
234
235template < class Object, class Return, class ... Params >
236std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::MemberImpl < Object, Return, Params ... >::getAbstraction ( ) const {
237 return std::make_shared < abstraction::MemberAbstraction < Object, Return, Params ... > > ( m_callback );
238}
239
240template < class Return, class ... Params >
241std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::EntryImpl < Return, Params ... >::getAbstraction ( ) const {
242 return std::make_shared < abstraction::AlgorithmAbstraction < Return, Params ... > > ( m_callback );
243}
244
245template < class Return, class ... Params >
246std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::WrapperImpl < Return, Params ... >::getAbstraction ( ) const {
247 return std::make_shared < abstraction::WrapperAbstraction < Params ... > > ( m_wrapperFinder );
248}
249
250} /* namespace abstraction */
251
Definition: AlgorithmAbstraction.hpp:14
static AlgorithmBaseInfo rawEntryInfo(ext::vector< ext::pair< std::string, abstraction::TypeQualifiers::TypeQualifierSet > > paramSpec)
Definition: AlgorithmRegistryInfo.hpp:73
AlgorithmCategory
Definition: AlgorithmCategories.hpp:14
Definition: AlgorithmRegistryInfo.hpp:89
Definition: AlgorithmRegistry.hpp:31
Entry(AlgorithmFullInfo entryInfo)
Definition: AlgorithmRegistry.hpp:37
void setDocumentation(std::string doc)
Definition: AlgorithmRegistry.hpp:48
const std::optional< std::string > & getDocumentation()
Definition: AlgorithmRegistry.hpp:44
const AlgorithmFullInfo & getEntryInfo() const
Definition: AlgorithmRegistry.hpp:40
Definition: AlgorithmRegistry.hpp:29
static void registerMethod(ReturnType(ObjectType::*callback)(ParamTypes ...), const std::string &methodName, std::array< std::string, sizeof ...(ParamTypes) > paramNames)
Definition: AlgorithmRegistry.hpp:172
static ext::set< ext::pair< std::string, ext::vector< std::string > > > list()
Definition: AlgorithmRegistry.cpp:132
static void unregisterWrapper()
Definition: AlgorithmRegistry.hpp:154
static void setDocumentationOfWrapper(const std::string &documentation)
Definition: AlgorithmRegistry.hpp:128
static void setDocumentationOfAlgorithm(AlgorithmCategories::AlgorithmCategory category, const std::string &documentation)
Definition: AlgorithmRegistry.hpp:119
static void registerRaw(std::shared_ptr< abstraction::Value >(*callback)(const std::vector< std::shared_ptr< abstraction::Value > > &), ext::pair< std::string, abstraction::TypeQualifiers::TypeQualifierSet > result, ext::vector< ext::tuple< std::string, abstraction::TypeQualifiers::TypeQualifierSet, std::string > > paramSpecs)
Definition: AlgorithmRegistry.hpp:206
static void unregisterRaw(ext::vector< ext::pair< std::string, abstraction::TypeQualifiers::TypeQualifierSet > > parameterSpecs)
Definition: AlgorithmRegistry.hpp:163
static void unregisterAlgorithm(AlgorithmCategories::AlgorithmCategory category)
Definition: AlgorithmRegistry.hpp:145
static void unregisterMethod(const std::string &methodName)
Definition: AlgorithmRegistry.hpp:137
static void registerWrapper(std::shared_ptr< abstraction::OperationAbstraction >(*callback)(ParamTypes ...), std::array< std::string, sizeof ...(ParamTypes) > paramNames)
Definition: AlgorithmRegistry.hpp:197
static void registerMethod(ReturnType(ObjectType::*callback)(ParamTypes ...) const, const std::string &methodName, std::array< std::string, sizeof ...(ParamTypes) > paramNames)
Definition: AlgorithmRegistry.hpp:180
static void registerRaw(std::string algorithm, std::function< std::shared_ptr< abstraction::Value >(const std::vector< std::shared_ptr< abstraction::Value > > &) > callback, ext::pair< std::string, abstraction::TypeQualifiers::TypeQualifierSet > result, ext::vector< ext::tuple< std::string, abstraction::TypeQualifiers::TypeQualifierSet, std::string > > paramSpecs)
Definition: AlgorithmRegistry.hpp:211
static void registerAlgorithm(ReturnType(*callback)(ParamTypes ...), AlgorithmCategories::AlgorithmCategory category, std::array< std::string, sizeof ...(ParamTypes) > paramNames)
Definition: AlgorithmRegistry.hpp:188
static ext::list< ext::tuple< AlgorithmFullInfo, std::optional< std::string > > > listOverloads(const std::string &algorithm, const ext::vector< std::string > &templateParams)
Definition: AlgorithmRegistry.cpp:120
static std::shared_ptr< abstraction::OperationAbstraction > getAbstraction(const std::string &name, const ext::vector< std::string > &templateParams, const ext::vector< std::string > &paramTypes, const ext::vector< abstraction::TypeQualifiers::TypeQualifierSet > &typeQualifiers, AlgorithmCategories::AlgorithmCategory category)
Definition: AlgorithmRegistry.cpp:97
static void setDocumentationOfMethod(const std::string &methodName, const std::string &documentation)
Definition: AlgorithmRegistry.hpp:111
static ext::set< ext::pair< std::string, ext::vector< std::string > > > listGroup(const std::string &group)
Definition: AlgorithmRegistry.cpp:110
Definition: BaseRegistryEntry.hpp:12
Definition: MemberAbstraction.hpp:17
Definition: WrapperAbstraction.hpp:120
Class extending the list class from the standard library. Original reason is to allow printing of the...
Definition: list.hpp:44
Class extending the map class from the standard library. Original reason is to allow printing of the ...
Definition: map.hpp:48
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Definition: set.hpp:44
Class extending the tuple class from the standard library. Original reason is to allow printing of th...
Definition: tuple.hpp:42
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
Definition: AlgorithmAbstraction.hpp:11
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
ext::vector< std::string > get_template_info(const std::string &str)
Definition: typeinfo.cpp:25
int callback(struct dl_phdr_info *info, size_t, void *data)
Definition: simpleStacktrace.cpp:25
std::string erase_template_info(std::string str)
Definition: typeinfo.cpp:12
Definition: FordFulkerson.hpp:16