Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
PackingAbstraction.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <ext/memory>
9#include <ext/array>
10
12#include <abstraction/Value.hpp>
13
14namespace abstraction {
15
17protected:
18 class LazyValue : public Value {
19 std::shared_ptr < Value > cache;
20 std::shared_ptr < abstraction::OperationAbstraction > m_lifeReference;
21
22 public:
23 explicit LazyValue ( const std::shared_ptr < abstraction::OperationAbstraction > & ref );
24
25 std::shared_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) override;
26
27 ext::type_index getTypeIndex ( ) const override;
28
30
31 std::shared_ptr < abstraction::Value > getProxyAbstraction ( ) override;
32
33 const std::shared_ptr < abstraction::OperationAbstraction > & getLifeReference ( ) const;
34
35 bool isTemporary ( ) const override;
36 };
37
39 size_t targetId;
41 };
42
43private:
45
46public:
47 explicit PackingAbstractionImpl ( const ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > & abstractions ) {
48 std::transform ( abstractions.begin ( ), abstractions.end ( ), std::back_inserter ( m_abstractions ), [ ] ( const std::shared_ptr < abstraction::OperationAbstraction > & abstraction ) { return std::make_shared < LazyValue > ( abstraction ); } );
49 }
50
51 void setInnerConnection ( size_t sourceId, size_t targetId, size_t paramPosition ) {
52 m_abstractions [ targetId ]->getLifeReference ( )->attachInput ( m_abstractions [ sourceId ], paramPosition );
53 }
54
55 void clearInnerConnection ( size_t targetId, size_t paramPosition ) {
56 m_abstractions [ targetId ]->getLifeReference ( )->detachInput ( paramPosition );
57 }
58
59 bool inputsAttached ( ) const override {
60 return std::all_of ( m_abstractions.begin ( ), m_abstractions.end ( ), [ ] ( const std::shared_ptr < LazyValue > & operation ) { return operation->getLifeReference ( )->inputsAttached ( ); } );
61 }
62
63protected:
65 return m_abstractions;
66 }
67
68};
69
70template < size_t NumberOfParams >
72 ext::array < ext::vector < ConnectionTarget >, NumberOfParams > m_connections;
73 size_t m_resultId;
74
75public:
76 void setOuterConnection ( size_t sourceId, size_t targetId, size_t paramPosition ) {
77 m_connections [ sourceId ].push_back ( ConnectionTarget { targetId, paramPosition } );
78 }
79
80 PackingAbstraction ( const ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > & abstractions, size_t resultId ) : PackingAbstractionImpl ( abstractions ), m_resultId ( resultId ) {
81 }
82
83private:
84 void attachInput ( const std::shared_ptr < abstraction::Value > & input, size_t index ) override {
85 try {
86 for ( const ConnectionTarget & target : m_connections [ index ] )
87 getAbstractions ( ) [ target.targetId ]->getLifeReference ( )->attachInput ( input, target.paramPosition );
88 } catch ( ... ) {
89 this->detachInput ( index );
90 throw;
91 }
92 }
93
94 void detachInput ( size_t index ) override {
95 for ( const ConnectionTarget & target : m_connections [ index ] )
96 getAbstractions ( ) [ target.targetId ]->getLifeReference ( )->detachInput ( target.paramPosition );
97 }
98
99public:
100 std::shared_ptr < abstraction::Value > eval ( ) override {
101 if ( ! inputsAttached ( ) )
102 return nullptr;
103
104 return getAbstractions ( ) [ m_resultId ]->getProxyAbstraction ( );
105 }
106
107 size_t numberOfParams ( ) const override {
108 return NumberOfParams;
109 }
110
111 ext::type_index getParamTypeIndex ( size_t index ) const override {
112 return getAbstractions ( ) [ m_connections.at ( index ) [ 0 ].targetId ]->getLifeReference ( )->getParamTypeIndex ( m_connections.at ( index ) [ 0 ].paramPosition );
113 }
114
116 return getAbstractions ( ) [ m_connections.at ( index ) [ 0 ].targetId ]->getLifeReference ( )->getParamTypeQualifiers ( m_connections.at ( index ) [ 0 ].paramPosition );
117 }
118
120 return getAbstractions ( ) [ m_resultId ]->getLifeReference ( )->getReturnTypeIndex ( );
121 }
122
124 return getAbstractions ( ) [ m_resultId ]->getLifeReference ( )->getReturnTypeQualifiers ( );
125 }
126
127 std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) override {
128 return getAbstractions ( ) [ m_resultId ]->getLifeReference ( )->getProxyAbstraction ( );
129 }
130
131};
132
133} /* namespace abstraction */
134
135extern template class abstraction::PackingAbstraction < 2 >;
136extern template class abstraction::PackingAbstraction < 3 >;
137
Definition: OperationAbstraction.hpp:19
Definition: PackingAbstraction.hpp:18
abstraction::TypeQualifiers::TypeQualifierSet getTypeQualifiers() const override
Definition: PackingAbstraction.cpp:24
const std::shared_ptr< abstraction::OperationAbstraction > & getLifeReference() const
Definition: PackingAbstraction.cpp:34
bool isTemporary() const override
Definition: PackingAbstraction.cpp:38
std::shared_ptr< abstraction::Value > asValue(bool move, bool isTemporary) override
Definition: PackingAbstraction.cpp:16
ext::type_index getTypeIndex() const override
Definition: PackingAbstraction.cpp:20
LazyValue(const std::shared_ptr< abstraction::OperationAbstraction > &ref)
Definition: PackingAbstraction.cpp:13
std::shared_ptr< abstraction::Value > getProxyAbstraction() override
Definition: PackingAbstraction.cpp:28
Definition: PackingAbstraction.hpp:16
void setInnerConnection(size_t sourceId, size_t targetId, size_t paramPosition)
Definition: PackingAbstraction.hpp:51
PackingAbstractionImpl(const ext::vector< std::shared_ptr< abstraction::OperationAbstraction > > &abstractions)
Definition: PackingAbstraction.hpp:47
const ext::vector< std::shared_ptr< LazyValue > > & getAbstractions() const
Definition: PackingAbstraction.hpp:64
void clearInnerConnection(size_t targetId, size_t paramPosition)
Definition: PackingAbstraction.hpp:55
bool inputsAttached() const override
Definition: PackingAbstraction.hpp:59
Definition: PackingAbstraction.hpp:71
std::shared_ptr< abstraction::OperationAbstraction > getProxyAbstraction() override
Definition: PackingAbstraction.hpp:127
abstraction::TypeQualifiers::TypeQualifierSet getReturnTypeQualifiers() const override
Definition: PackingAbstraction.hpp:123
size_t numberOfParams() const override
Definition: PackingAbstraction.hpp:107
ext::type_index getParamTypeIndex(size_t index) const override
Definition: PackingAbstraction.hpp:111
void setOuterConnection(size_t sourceId, size_t targetId, size_t paramPosition)
Definition: PackingAbstraction.hpp:76
abstraction::TypeQualifiers::TypeQualifierSet getParamTypeQualifiers(size_t index) const override
Definition: PackingAbstraction.hpp:115
ext::type_index getReturnTypeIndex() const override
Definition: PackingAbstraction.hpp:119
PackingAbstraction(const ext::vector< std::shared_ptr< abstraction::OperationAbstraction > > &abstractions, size_t resultId)
Definition: PackingAbstraction.hpp:80
std::shared_ptr< abstraction::Value > eval() override
Definition: PackingAbstraction.hpp:100
TypeQualifierSet
Definition: TypeQualifiers.hpp:15
Definition: Value.hpp:19
Class extending the array class from the standard library. Original reason is to allow printing of th...
Definition: array.hpp:68
Definition: typeindex.h:37
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
auto begin() &
Inherited behavior of begin for non-const instance.
Definition: vector.hpp:125
auto end() &
Inherited behavior of end for non-const instance.
Definition: vector.hpp:155
Definition: AlgorithmAbstraction.hpp:11
ContainerType< ResType > transform(const ContainerType< InType, Ts ... > &in, Callback transform)
In container tranformation of all elements according to the tranform.
Definition: algorithm.hpp:150
all_of(T &&...) -> all_of< T... >
Definition: PackingAbstraction.hpp:38
size_t targetId
Definition: PackingAbstraction.hpp:39
size_t paramPosition
Definition: PackingAbstraction.hpp:40