Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
AlgoRegistration.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <ext/registration>
9
11
13
14namespace registration {
15
17public:
18 template < size_t ParameterTypesNumber, class ... ParamNames >
19 static std::array < std::string, ParameterTypesNumber > generateNames ( ParamNames ... paramNames ) {
20 if constexpr ( sizeof ... ( ParamNames ) > ParameterTypesNumber ) {
21 static_assert ( "Too many parameter names" );
22 } else if constexpr ( ParameterTypesNumber == 0 ) {
23 return std::array < std::string, ParameterTypesNumber > {};
24 } else {
25 std::array < std::string, ParameterTypesNumber > parameterNames = { { paramNames ... } };
26 for ( size_t i = sizeof ... ( ParamNames ); i < ParameterTypesNumber; ++ i )
27 parameterNames [ i ] = "arg" + ext::to_string ( i );
28
29 return parameterNames;
30 }
31 }
32};
33
34template < class Algorithm, class ReturnType, class ... ParameterTypes >
35class AbstractRegister : public ext::Register < void > {
37
39
40public:
41 template < class ... ParamNames >
42 explicit AbstractRegister ( ReturnType ( * callback ) ( ParameterTypes ... ), abstraction::AlgorithmCategories::AlgorithmCategory category, ParamNames ... paramNames ) : ext::Register < void > ( [=] ( ) {
43 std::array < std::string, sizeof ... ( ParameterTypes ) > parameterNames = AlgoRegisterHelper::generateNames < sizeof ... ( ParameterTypes ) > ( paramNames ... );
44
45 abstraction::AlgorithmRegistry::registerAlgorithm < Algorithm, ReturnType, ParameterTypes ... > ( callback, category, std::move ( parameterNames ) );
46 }, [=] ( ) {
47 abstraction::AlgorithmRegistry::unregisterAlgorithm < Algorithm, ParameterTypes ... > ( category );
48 } ), m_category ( category ) {
49 }
50
51 template < class ... ParamNames >
52 explicit AbstractRegister ( ReturnType ( * callback ) ( ParameterTypes ... ), ParamNames ... paramNames ) : AbstractRegister ( callback, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, paramNames ... ) {
53 }
54
55 AbstractRegister ( AbstractRegister && ) noexcept = default;
56
57 AbstractRegister && setDocumentation ( std::string documentation ) && {
58 abstraction::AlgorithmRegistry::setDocumentationOfAlgorithm < Algorithm, ParameterTypes ... > ( m_category, std::move ( documentation ) );
59 return std::move ( * this );
60 }
61};
62
63template < class Algorithm, class ReturnType, class ... ParameterTypes >
64class WrapperRegister : public ext::Register < void > {
65public:
66 template < class ... ParamNames >
67 explicit WrapperRegister ( std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( ParameterTypes ... ), ParamNames ... paramNames ) : ext::Register < void > ( [=] ( ) {
68 std::array < std::string, sizeof ... ( ParameterTypes ) > parameterNames = AlgoRegisterHelper::generateNames < sizeof ... ( ParameterTypes ) > ( paramNames ... );
69
70 abstraction::AlgorithmRegistry::registerWrapper < Algorithm, ReturnType, ParameterTypes ... > ( callback, std::move ( parameterNames ) );
71 }, [=] ( ) {
72 abstraction::AlgorithmRegistry::unregisterWrapper < Algorithm, ParameterTypes ... > ( );
73 } ) {
74 }
75
76 WrapperRegister ( WrapperRegister && ) noexcept = default;
77
78 WrapperRegister && setDocumentation ( std::string documentation ) && {
79 abstraction::AlgorithmRegistry::setDocumentationOfWrapper < Algorithm, ParameterTypes ... > ( std::move ( documentation ) );
80 return std::move ( * this );
81 }
82};
83
84template < class Algorithm, class ReturnType, class ObjectType, class ... ParameterTypes >
85class MethodRegister : public ext::Register < void > {
87
88 std::string m_methodName;
89
90public:
91 template < class ... ParamNames >
92 explicit MethodRegister ( ReturnType ( ObjectType::* callback ) ( ParameterTypes ... ), std::string methodName, ParamNames ... paramNames ) : ext::Register < void > ( [=] ( ) {
93 std::array < std::string, sizeof ... ( ParameterTypes ) > parameterNames = AlgoRegisterHelper::generateNames < sizeof ... ( ParameterTypes ) > ( paramNames ... );
94
95 abstraction::AlgorithmRegistry::registerMethod < Algorithm > ( callback, methodName, std::move ( parameterNames ) );
96 }, [=] ( ) {
97 abstraction::AlgorithmRegistry::unregisterMethod < Algorithm, ObjectType, ParameterTypes ... > ( methodName );
98 } ), m_methodName ( methodName ) {
99 }
100
101 MethodRegister ( MethodRegister && ) noexcept = default;
102
103 MethodRegister && setDocumentation ( std::string documentation ) && {
104 abstraction::AlgorithmRegistry::setDocumentationOfMethod < Algorithm, ObjectType, ParameterTypes ... > ( m_methodName, std::move ( documentation ) );
105 return std::move ( * this );
106 }
107
108};
109
110template < class Algorithm, class ReturnType, class ObjectType, class ... ParameterTypes >
111class MethodRegister < Algorithm, ReturnType, const ObjectType, ParameterTypes ... > : public ext::Register < void > {
113
114 std::string m_methodName;
115
116public:
117 template < class ... ParamNames >
118 explicit MethodRegister ( ReturnType ( ObjectType::* callback ) ( ParameterTypes ... ) const, std::string methodName, ParamNames ... paramNames ) : ext::Register < void > ( [=] ( ) {
119 std::array < std::string, sizeof ... ( ParameterTypes ) > parameterNames = AlgoRegisterHelper::generateNames < sizeof ... ( ParameterTypes ) > ( paramNames ... );
120
121 abstraction::AlgorithmRegistry::registerMethod < Algorithm > ( callback, methodName, std::move ( parameterNames ) );
122 }, [=] ( ) {
123 abstraction::AlgorithmRegistry::unregisterMethod < Algorithm, const ObjectType, ParameterTypes ... > ( methodName );
124 } ), m_methodName ( methodName ) {
125 }
126
127 MethodRegister ( MethodRegister && ) noexcept = default;
128
129 MethodRegister && setDocumentation ( std::string documentation ) && {
130 abstraction::AlgorithmRegistry::setDocumentationOfMethod < Algorithm, const ObjectType, ParameterTypes ... > ( m_methodName, std::move ( documentation ) );
131 return std::move ( * this );
132 }
133
134};
135
136} /* namespace registration */
137
AlgorithmCategory
Definition: AlgorithmCategories.hpp:14
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 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 registerAlgorithm(ReturnType(*callback)(ParamTypes ...), AlgorithmCategories::AlgorithmCategory category, std::array< std::string, sizeof ...(ParamTypes) > paramNames)
Definition: AlgorithmRegistry.hpp:188
static void setDocumentationOfMethod(const std::string &methodName, const std::string &documentation)
Definition: AlgorithmRegistry.hpp:111
Register(InitCallback init, FinalizeCallback finish)
Definition: registration.hpp:64
Definition: registration.hpp:31
Definition: AlgoRegistration.hpp:35
AbstractRegister && setDocumentation(std::string documentation) &&
Definition: AlgoRegistration.hpp:57
AbstractRegister(ReturnType(*callback)(ParameterTypes ...), ParamNames ... paramNames)
Definition: AlgoRegistration.hpp:52
AbstractRegister(AbstractRegister &&) noexcept=default
AbstractRegister(ReturnType(*callback)(ParameterTypes ...), abstraction::AlgorithmCategories::AlgorithmCategory category, ParamNames ... paramNames)
Definition: AlgoRegistration.hpp:42
Definition: AlgoRegistration.hpp:16
static std::array< std::string, ParameterTypesNumber > generateNames(ParamNames ... paramNames)
Definition: AlgoRegistration.hpp:19
MethodRegister(ReturnType(ObjectType::*callback)(ParameterTypes ...) const, std::string methodName, ParamNames ... paramNames)
Definition: AlgoRegistration.hpp:118
Definition: AlgoRegistration.hpp:85
MethodRegister(ReturnType(ObjectType::*callback)(ParameterTypes ...), std::string methodName, ParamNames ... paramNames)
Definition: AlgoRegistration.hpp:92
MethodRegister(MethodRegister &&) noexcept=default
MethodRegister && setDocumentation(std::string documentation) &&
Definition: AlgoRegistration.hpp:103
Definition: AlgoRegistration.hpp:64
WrapperRegister && setDocumentation(std::string documentation) &&
Definition: AlgoRegistration.hpp:78
WrapperRegister(WrapperRegister &&) noexcept=default
WrapperRegister(std::shared_ptr< abstraction::OperationAbstraction >(*callback)(ParameterTypes ...), ParamNames ... paramNames)
Definition: AlgoRegistration.hpp:67
Definition: AlgorithmAbstraction.hpp:11
int i
Definition: AllEpsilonClosure.h:118
Definition: sigHandler.cpp:20
int callback(struct dl_phdr_info *info, size_t, void *data)
Definition: simpleStacktrace.cpp:25
std::string to_string(const T &value)
To string method designated for objects that can be casted to string.
Definition: string.hpp:131
Definition: AlgoRegistration.hpp:14
std::conditional_t< core::has_eval< core::normalize< ReturnType > >::value, NormalizationRegisterImpl< ReturnType >, NormalizationRegisterEmpty > NormalizationRegister
Definition: NormalizationRegistration.hpp:39
Definition: FordFulkerson.hpp:16