Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
DeclareRunnableCommand.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <ext/foreach>
9
10#include <ast/Command.h>
12#include <ast/Statement.h>
13#include <common/CastHelper.h>
15
16namespace cli {
17
19 std::string m_name;
20 std::vector < std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr < Arg > > > m_params;
21 std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr < Arg > > m_result;
22 std::shared_ptr < Command > m_body;
23
24public:
25 DeclareRunnableCommand ( std::string name, std::vector < std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr < Arg > > > params, std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr < Arg > > result, std::shared_ptr < Command > body ) : m_name ( std::move ( name ) ), m_params ( std::move ( params ) ), m_result ( std::move ( result ) ), m_body ( std::move ( body ) ) {
26 }
27
28 DeclareRunnableCommand ( std::string name, std::vector < std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr < Arg > > > params, std::shared_ptr < Command > body ) : m_name ( std::move ( name ) ), m_params ( std::move ( params ) ), m_result ( std::make_pair ( abstraction::TypeQualifiers::TypeQualifierSet::NONE, std::make_unique < ImmediateArg > ( "void" ) ) ), m_body ( std::move ( body ) ) {
29 }
30
31 CommandResult run ( Environment & environment ) const override {
32 std::vector < std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::string > > params;
34
35 for ( const std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr < Arg > > & param : m_params ) {
36 params.emplace_back ( param.first, param.second->eval ( environment ) );
37 paramSpecs.emplace_back ( std::string ( "auto" ), param.first, param.second->eval ( environment ) );
38 }
39
40 ext::pair < std::string, abstraction::TypeQualifiers::TypeQualifierSet > resultSpec = ext::make_pair ( m_result.second->eval ( environment ), m_result.first );
41 std::shared_ptr < Command > body = m_body;
42
43 std::function < std::shared_ptr < abstraction::Value > ( const std::vector < std::shared_ptr < abstraction::Value > > & ) > callback = [ = ] ( const std::vector < std::shared_ptr < abstraction::Value > > & actualParams ) {
44 Environment newEnvironment;
45 newEnvironment.setResult ( std::make_shared < abstraction::Void > ( ) );
46 for ( const ext::tuple < const std::shared_ptr < abstraction::Value > &, const std::pair < abstraction::TypeQualifiers::TypeQualifierSet, std::string > & > & params_bind : ext::make_tuple_foreach ( actualParams, params ) ) {
47 std::shared_ptr < abstraction::Value > res = std::get < 0 > ( params_bind )->clone ( std::get < 1 > ( params_bind ).first, false );
48 newEnvironment.setVariable ( std::get < 1 > ( params_bind ).second, res );
49 }
50
51 body->run ( newEnvironment );
52 std::shared_ptr < abstraction::Value > result = newEnvironment.getResult ( );
53
54 if ( resultSpec.first == "void" && result->getType ( ) != "void" )
55 throw std::logic_error ( "Non void type returned from void routine" );
56
57 if ( result->getType ( ) != "void" ) {
58 bool isResultLvalueRef = abstraction::TypeQualifiers::isLvalueRef ( result->getTypeQualifiers ( ) );
59 result = result->clone ( resultSpec.second, ! isResultLvalueRef );
60 }
61
62 return result;
63 };
64
65 abstraction::AlgorithmRegistry::registerRaw ( m_name, callback, resultSpec, paramSpecs );
66 return CommandResult::OK;
67 }
68};
69
70} /* namespace cli */
71
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
TypeQualifierSet
Definition: TypeQualifiers.hpp:15
static constexpr bool isLvalueRef(TypeQualifierSet arg)
Definition: TypeQualifiers.hpp:47
Definition: Command.h:14
Definition: DeclareRunnableCommand.h:18
DeclareRunnableCommand(std::string name, std::vector< std::pair< abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr< Arg > > > params, std::shared_ptr< Command > body)
Definition: DeclareRunnableCommand.h:28
DeclareRunnableCommand(std::string name, std::vector< std::pair< abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr< Arg > > > params, std::pair< abstraction::TypeQualifiers::TypeQualifierSet, std::unique_ptr< Arg > > result, std::shared_ptr< Command > body)
Definition: DeclareRunnableCommand.h:25
CommandResult run(Environment &environment) const override
Definition: DeclareRunnableCommand.h:31
Definition: Environment.h:29
void setVariable(std::string name, std::shared_ptr< abstraction::Value > value)
Definition: Environment.h:87
std::shared_ptr< abstraction::Value > getResult() const
Definition: Environment.h:105
void setResult(std::shared_ptr< abstraction::Value > value)
Definition: Environment.h:101
Definition: ImmediateArg.h:13
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
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
p second
Definition: ToRegExpAlgebraic.h:126
return res
Definition: MinimizeByPartitioning.h:145
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
Definition: Arg.h:11
CommandResult
Definition: CommandResult.h:10
int callback(struct dl_phdr_info *info, size_t, void *data)
Definition: simpleStacktrace.cpp:25
const_tuple_foreach< Types ... > make_tuple_foreach(const Types &... args)
Function construction of foreach tuple pack helper.
Definition: foreach.hpp:280
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
Definition: FordFulkerson.hpp:16