Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
WrapperAbstraction.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <memory>
9
10#include <ext/array>
11
14
15namespace abstraction {
16
18};
19
20template < size_t NumberOfParams >
22 std::shared_ptr < OperationAbstraction > m_abstraction;
24
25protected:
27 return m_params;
28 }
29
30 virtual std::shared_ptr < abstraction::OperationAbstraction > evalAbstractionFunction ( ) = 0;
31
32 std::shared_ptr < OperationAbstraction > & getAbstraction ( ) {
33 return m_abstraction;
34 }
35
36 const std::shared_ptr < OperationAbstraction > & getAbstraction ( ) const {
37 return m_abstraction;
38 }
39
41 for ( size_t index = 0; index < NumberOfParams; ++ index )
42 this->m_abstraction->attachInput ( m_params [ index ], index );
43 }
44
45public:
47 if constexpr ( NumberOfParams != 0 )
48 for ( size_t i = 0; i < NumberOfParams; ++ i ) {
49 m_params [ i ] = nullptr;
50 }
51 }
52
53private:
54 void attachInput ( const std::shared_ptr < abstraction::Value > & input, size_t index ) override {
55 if ( index >= m_params.size ( ) )
56 throw std::invalid_argument ( "Parameter index " + ext::to_string ( index ) + " out of bounds.");
57
58 m_params [ index ] = input;
59 }
60
61 void detachInput ( size_t index ) override {
62 if ( index >= m_params.size ( ) )
63 throw std::invalid_argument ( "Parameter index " + ext::to_string ( index ) + " out of bounds.");
64
65 m_params [ index ] = nullptr;
66 }
67
68public:
69 bool inputsAttached ( ) const override {
70 return std::all_of ( m_params.begin ( ), m_params.end ( ), [ ] ( const std::shared_ptr < abstraction::Value > & param ) { return static_cast < bool > ( param ); } );
71 }
72
73 std::shared_ptr < abstraction::Value > eval ( ) override {
74 if ( ! inputsAttached ( ) )
75 return nullptr;
76
77 m_abstraction = this->evalAbstractionFunction ( );
78
80
81 return this->getAbstraction ( )->eval ( );
82 }
83
84 size_t numberOfParams ( ) const override {
85 return NumberOfParams;
86 }
87
89 if ( this->m_abstraction )
90 return this->m_abstraction->getReturnTypeIndex ( );
91 else
92 throw std::domain_error ( "ReturnTypeIndex not available before evaluation." );
93 }
94
96 if ( this->m_abstraction )
97 return this->m_abstraction->getReturnTypeQualifiers ( );
98 else
99 throw std::domain_error ( "ReturnTypeQualifiers not available before evaluation." );
100 }
101
102 std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) override {
103 if ( this->m_abstraction )
104 return this->m_abstraction->getProxyAbstraction ( );
105 else
106 throw std::domain_error ( "Proxy abstraction not available before evaluation." );
107 }
108
109};
110
111} /* namespace abstraction */
112
116
117namespace abstraction {
118
119template < class ... ParamTypes >
120class WrapperAbstraction : public WrapperAbstractionImpl < sizeof ... ( ParamTypes ) > {
121 std::function < std::shared_ptr < abstraction::OperationAbstraction > ( ParamTypes ... ) > m_WrapperFinder;
122
123public:
124 explicit WrapperAbstraction ( std::function < std::shared_ptr < abstraction::OperationAbstraction > ( ParamTypes ... ) > wrapperFinder ) : m_WrapperFinder ( std::move ( wrapperFinder ) ) {
125 }
126
127 std::shared_ptr < abstraction::OperationAbstraction > evalAbstractionFunction ( ) override {
128 return abstraction::apply < ParamTypes ... > ( m_WrapperFinder, this->getParams ( ) );
129 }
130
131 ext::type_index getParamTypeIndex ( size_t index ) const override {
132 return abstraction::paramType < ParamTypes ... > ( index );
133 }
134
136 return abstraction::paramTypeQualifiers < ParamTypes ... > ( index );
137 }
138
139};
140
141} /* namespace abstraction */
142
Definition: OperationAbstraction.hpp:19
TypeQualifierSet
Definition: TypeQualifiers.hpp:15
Definition: WrapperAbstraction.hpp:17
Definition: WrapperAbstraction.hpp:21
bool inputsAttached() const override
Definition: WrapperAbstraction.hpp:69
const std::shared_ptr< OperationAbstraction > & getAbstraction() const
Definition: WrapperAbstraction.hpp:36
ext::array< std::shared_ptr< abstraction::Value >, NumberOfParams > & getParams()
Definition: WrapperAbstraction.hpp:26
std::shared_ptr< OperationAbstraction > & getAbstraction()
Definition: WrapperAbstraction.hpp:32
std::shared_ptr< abstraction::OperationAbstraction > getProxyAbstraction() override
Definition: WrapperAbstraction.hpp:102
WrapperAbstractionImpl()
Definition: WrapperAbstraction.hpp:46
size_t numberOfParams() const override
Definition: WrapperAbstraction.hpp:84
ext::type_index getReturnTypeIndex() const override
Definition: WrapperAbstraction.hpp:88
abstraction::TypeQualifiers::TypeQualifierSet getReturnTypeQualifiers() const override
Definition: WrapperAbstraction.hpp:95
void attachInputsToAbstraction()
Definition: WrapperAbstraction.hpp:40
virtual std::shared_ptr< abstraction::OperationAbstraction > evalAbstractionFunction()=0
std::shared_ptr< abstraction::Value > eval() override
Definition: WrapperAbstraction.hpp:73
Definition: WrapperAbstraction.hpp:120
std::shared_ptr< abstraction::OperationAbstraction > evalAbstractionFunction() override
Definition: WrapperAbstraction.hpp:127
abstraction::TypeQualifiers::TypeQualifierSet getParamTypeQualifiers(size_t index) const override
Definition: WrapperAbstraction.hpp:135
ext::type_index getParamTypeIndex(size_t index) const override
Definition: WrapperAbstraction.hpp:131
WrapperAbstraction(std::function< std::shared_ptr< abstraction::OperationAbstraction >(ParamTypes ...) > wrapperFinder)
Definition: WrapperAbstraction.hpp:124
Class extending the array class from the standard library. Original reason is to allow printing of th...
Definition: array.hpp:68
auto begin() &
Inherited behavior of begin for non-const instance.
Definition: array.hpp:123
auto end() &
Inherited behavior of end for non-const instance.
Definition: array.hpp:153
Definition: typeindex.h:37
Definition: AlgorithmAbstraction.hpp:11
constexpr decltype(auto) apply(F &&f, Tuple &&t)
Definition: AbstractionHelpers.hpp:27
abstraction::TypeQualifiers::TypeQualifierSet paramTypeQualifiers(unsigned index)
Definition: AbstractionHelpers.hpp:45
int i
Definition: AllEpsilonClosure.h:118
std::string to_string(const T &value)
To string method designated for objects that can be casted to string.
Definition: string.hpp:131
all_of(T &&...) -> all_of< T... >
Definition: FordFulkerson.hpp:16