Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
CastRegistry.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <ext/memory>
9#include <ext/string>
10#include <ext/list>
11#include <ext/tuple>
12#include <ext/map>
13#include <ext/typeinfo>
14
16#include "BaseRegistryEntry.hpp"
17
18namespace abstraction {
19
21public:
22 class Entry : public BaseRegistryEntry {
23 bool m_isExplicit;
24
25 public:
26 explicit Entry ( bool p_isExplicit ) : m_isExplicit ( p_isExplicit ) {
27 }
28
29 bool isExplicit ( ) const {
30 return m_isExplicit;
31 }
32 };
33
34private:
35 template < class Return, class Param >
36 class DefaultEntryImpl : public Entry {
37 public:
38 explicit DefaultEntryImpl ( bool isExplicit ) : Entry ( isExplicit ) {
39 }
40
41 std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
42 };
43
44 template < class Return, class Param >
45 class AlgorithmEntryImpl : public Entry {
46 std::function < Return ( Param ) > m_callback;
47
48 public:
49 explicit AlgorithmEntryImpl ( std::function < Return ( Param ) > callback, bool isExplicit ) : Entry ( isExplicit ), m_callback ( std::move ( callback ) ) {
50 }
51
52 std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
53 };
54
55 static ext::map < ext::pair < std::string, std::string >, std::unique_ptr < Entry > > & getEntries ( );
56
57public:
58 static void unregisterCast ( const std::string & target, const std::string & param );
59
60 template < class TargetType, class ParamType >
61 static void unregisterCast ( ) {
62 std::string target = ext::to_string < TargetType > ( );
63 std::string param = ext::to_string < ParamType > ( );
64
65 unregisterCast ( target, param );
66 }
67
68 static void registerCast ( std::string target, std::string param, std::unique_ptr < Entry > entry );
69
70 template < class TargetType, class ParamType >
71 static void registerCast ( std::string target, std::string param, bool isExplicit = false ) {
72 registerCast ( std::move ( target ), std::move ( param ), std::unique_ptr < Entry > ( new DefaultEntryImpl < TargetType, ParamType > ( isExplicit ) ) );
73 }
74
75 template < class TargetType, class ParamType >
76 static void registerCast ( bool isExplicit = false ) {
77 std::string target = ext::to_string < TargetType > ( );
78 std::string param = ext::to_string < ParamType > ( );
79
80 registerCast < TargetType, ParamType > ( std::move ( target ), std::move ( param ), isExplicit );
81 }
82
83 template < class TargetType, class ParamType >
84 static void registerCastAlgorithm ( std::string target, std::string param, TargetType ( * callback ) ( const ParamType & ), bool isExplicit = false ) {
85 registerCast ( std::move ( target ), std::move ( param ), std::unique_ptr < Entry > ( new AlgorithmEntryImpl < TargetType, const ParamType & > ( callback, isExplicit ) ) );
86 }
87
88 template < class TargetType, class ParamType >
89 static void registerCastAlgorithm ( TargetType ( * callback ) ( const ParamType & ), bool isExplicit = false ) {
90 std::string target = ext::to_string < TargetType > ( );
91 std::string param = ext::to_string < ParamType > ( );
92
93 registerCastAlgorithm < TargetType, ParamType > ( std::move ( target ), std::move ( param ), callback, isExplicit );
94 }
95
96 template < class TargetType, class ParamType >
97 static void registerCastAlgorithm ( std::string target, std::string param, TargetType ( * callback ) ( ParamType ), bool isExplicit = false ) {
98 registerCast ( std::move ( target ), std::move ( param ), std::unique_ptr < Entry > ( new AlgorithmEntryImpl < TargetType, ParamType > ( callback, isExplicit ) ) );
99 }
100
101 template < class TargetType, class ParamType >
102 static void registerCastAlgorithm ( TargetType ( * callback ) ( ParamType ), bool isExplicit = false ) {
103 std::string target = ext::to_string < TargetType > ( );
104 std::string param = ext::to_string < ParamType > ( );
105
106 registerCastAlgorithm < TargetType, ParamType > ( std::move ( target ), std::move ( param ), callback, isExplicit );
107 }
108
109 static bool isNoOp ( const std::string & target, const std::string & param );
110
111 static bool castAvailable ( const std::string & target, const std::string & param, bool implicitOnly );
112
113 static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & target, const std::string & param );
114
115 static ext::list < ext::pair < std::string, bool > > listFrom ( const std::string & type );
116
117 static ext::list < ext::pair < std::string, bool > > listTo ( const std::string & type );
118
120};
121
122} /* namespace abstraction */
123
126
127namespace abstraction {
128
129template < class Return, class Param >
130std::shared_ptr < abstraction::OperationAbstraction > CastRegistry::DefaultEntryImpl < Return, Param >::getAbstraction ( ) const {
131 return std::make_shared < abstraction::CastAbstraction < Return, const Param & > > ( );
132}
133
134template < class Return, class Param >
135std::shared_ptr < abstraction::OperationAbstraction > CastRegistry::AlgorithmEntryImpl < Return, Param >::getAbstraction ( ) const {
136 return std::make_shared < abstraction::AlgorithmAbstraction < Return, const Param & > > ( m_callback );
137}
138
139} /* namespace abstraction */
140
Definition: BaseRegistryEntry.hpp:12
Definition: CastRegistry.hpp:22
bool isExplicit() const
Definition: CastRegistry.hpp:29
Entry(bool p_isExplicit)
Definition: CastRegistry.hpp:26
Definition: CastRegistry.hpp:20
static ext::list< ext::tuple< std::string, std::string, bool > > list()
Definition: CastRegistry.cpp:76
static void registerCastAlgorithm(TargetType(*callback)(ParamType), bool isExplicit=false)
Definition: CastRegistry.hpp:102
static void registerCast(bool isExplicit=false)
Definition: CastRegistry.hpp:76
static void registerCastAlgorithm(TargetType(*callback)(const ParamType &), bool isExplicit=false)
Definition: CastRegistry.hpp:89
static void registerCastAlgorithm(std::string target, std::string param, TargetType(*callback)(ParamType), bool isExplicit=false)
Definition: CastRegistry.hpp:97
static void registerCast(std::string target, std::string param, bool isExplicit=false)
Definition: CastRegistry.hpp:71
static ext::list< ext::pair< std::string, bool > > listTo(const std::string &type)
Definition: CastRegistry.cpp:66
static void unregisterCast()
Definition: CastRegistry.hpp:61
static bool isNoOp(const std::string &target, const std::string &param)
Definition: CastRegistry.cpp:45
static void registerCastAlgorithm(std::string target, std::string param, TargetType(*callback)(const ParamType &), bool isExplicit=false)
Definition: CastRegistry.hpp:84
static void registerCast(std::string target, std::string param, std::unique_ptr< Entry > entry)
Definition: CastRegistry.cpp:23
static std::shared_ptr< abstraction::OperationAbstraction > getAbstraction(const std::string &target, const std::string &param)
Definition: CastRegistry.cpp:29
static ext::list< ext::pair< std::string, bool > > listFrom(const std::string &type)
Definition: CastRegistry.cpp:56
static bool castAvailable(const std::string &target, const std::string &param, bool implicitOnly)
Definition: CastRegistry.cpp:49
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
Definition: AlgorithmAbstraction.hpp:11
int callback(struct dl_phdr_info *info, size_t, void *data)
Definition: simpleStacktrace.cpp:25
Definition: FordFulkerson.hpp:16