Skip to content
Snippets Groups Projects
Commit f35507a3 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

workout passing parameter qualifiers to overload resolution algo

parent f9474fdd
No related branches found
No related tags found
No related merge requests found
Showing
with 101 additions and 14 deletions
......@@ -81,6 +81,10 @@ public:
return ext::type_index ( typeid ( ParamType ) );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ParamType > ( );
}
};
 
} /* namespace abstraction */
......
......@@ -88,6 +88,10 @@ public:
return abstraction::ParamType < ParamTypes ... >::paramType ( index );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const override {
return abstraction::ParamType < ParamTypes ... >::paramTypeQualifiers ( index );
}
};
 
} /* namespace abstraction */
......
......@@ -11,6 +11,9 @@
#include <alib/memory>
#include <alib/string>
#include <alib/typeindex>
#include <alib/set>
#include <common/ParamQualifiers.hpp>
 
namespace abstraction {
 
......@@ -38,10 +41,14 @@ public:
return ext::to_string ( getParamTypeIndex ( index ) );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const = 0;
std::string getReturnType ( ) const {
return ext::to_string ( getReturnTypeIndex ( ) );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const = 0;
virtual std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) {
return shared_from_this();
}
......
......@@ -105,10 +105,18 @@ public:
return m_abstractions [ m_connections.at ( index ) [ 0 ].targetId ]->getParamTypeIndex ( m_connections.at ( index ) [ 0 ].paramPosition );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const override {
return m_abstractions [ m_connections.at ( index ) [ 0 ].targetId ]->getParamTypeQualifiers ( m_connections.at ( index ) [ 0 ].paramPosition );
}
virtual ext::type_index getReturnTypeIndex ( ) const override {
return m_abstractions [ m_resultId ]->getReturnTypeIndex ( );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return m_abstractions [ m_resultId ]->getReturnTypeQualifiers ( );
}
virtual std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) override {
return m_abstractions [ m_resultId ]->getProxyAbstraction ( );
}
......
......@@ -15,6 +15,7 @@
#include <abstraction/OperationAbstraction.hpp>
#include <abstraction/ValueProvider.hpp>
 
#include <common/ParamQualifiers.hpp>
#include <common/AbstractionHelpers.hpp>
 
namespace abstraction {
......@@ -58,6 +59,10 @@ public:
return ext::type_index ( typeid ( ReturnType ) );
}
 
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( );
}
virtual bool cached ( ) const override {
return ( bool ) m_data;
}
......@@ -103,6 +108,10 @@ public:
return ext::type_index ( typeid ( ReturnType ) );
}
 
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < const ReturnType > ( );
}
virtual bool cached ( ) const override {
return ( bool ) m_data;
}
......@@ -148,6 +157,10 @@ public:
return ext::type_index ( typeid ( ReturnType ) );
}
 
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType & > ( );
}
virtual bool cached ( ) const override {
return ( bool ) m_data;
}
......@@ -193,6 +206,10 @@ public:
return ext::type_index ( typeid ( ReturnType ) );
}
 
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < const ReturnType & > ( );
}
virtual bool cached ( ) const override {
return ( bool ) m_data;
}
......@@ -240,6 +257,10 @@ public:
return ext::type_index ( typeid ( ReturnType ) );
}
 
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType && > ( );
}
virtual bool cached ( ) const override {
return ( bool ) m_data;
}
......@@ -287,6 +308,10 @@ public:
return ext::type_index ( typeid ( ReturnType ) );
}
 
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < const ReturnType && > ( );
}
virtual bool cached ( ) const override {
return ( bool ) m_data;
}
......@@ -308,6 +333,10 @@ public:
return ext::type_index ( typeid ( void ) );
}
 
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < void > ( );
}
virtual bool cached ( ) const override {
return false;
}
......
......@@ -96,6 +96,10 @@ public:
return ParamType < ParamTypes ... >::paramType ( index );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const override {
return ParamType < ParamTypes ... >::paramTypeQualifiers ( index );
}
virtual std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) override {
if ( this->cached ( ) )
return this->m_abstraction->getProxyAbstraction ( );
......@@ -133,6 +137,10 @@ public:
return ext::type_index ( typeid ( ReturnType ) );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( );
}
};
 
template < class ... ParamTypes >
......@@ -156,6 +164,13 @@ public:
throw std::domain_error ( "Return type unknown before evaluation." );
}
 
virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
if ( this->cached ( ) )
return this->m_abstraction->getProxyAbstraction ( )->getReturnTypeQualifiers ( );
else
throw std::domain_error ( "Return type qualifiers unknown before evaluation." );
}
};
 
} /* namespace abstraction */
......
......@@ -62,6 +62,10 @@ struct ParamType < > {
static ext::type_index paramType ( unsigned ) {
throw std::logic_error ( "Out of types to check" );
}
static ext::set < abstraction::ParamQualifiers::ParamQualifier > paramTypeQualifiers ( unsigned ) {
throw std::logic_error ( "Out of types to check" );
}
};
 
template < class Param, class ... Params >
......@@ -70,7 +74,14 @@ struct ParamType < Param, Params ... > {
if ( index == 0 )
return ext::type_index ( typeid ( Param ) );
else
return ParamType < Params ... >::paramType ( index - 1);
return ParamType < Params ... >::paramType ( index - 1 );
}
static ext::set < abstraction::ParamQualifiers::ParamQualifier > paramTypeQualifiers ( unsigned index ) {
if ( index == 0 )
return abstraction::ParamQualifiers::paramQualifiers < Param > ( );
else
return ParamType < Params ... >::paramTypeQualifiers ( index - 1 );
}
};
 
......
......@@ -14,10 +14,13 @@ namespace abstraction {
 
std::shared_ptr < abstraction::OperationAbstraction > AlgorithmHelper::eval ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > & params, std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) {
ext::vector < std::string > paramTypes;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params )
ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params ) {
paramTypes.push_back ( param->getReturnType ( ) );
paramTypeQualifiers.push_back ( param->getReturnTypeQualifiers ( ) );
}
 
std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, category );
std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, paramTypeQualifiers, category );
 
unsigned i = 0;
ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > casted_params;
......
......@@ -86,7 +86,7 @@ ext::map < ext::pair < std::string, ext::vector < std::string > >, ext::list < s
return group;
}
 
std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory ) {
std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > &, AlgorithmCategories::AlgorithmCategory ) {
auto group = findAbstractionGroup ( name, templateParams );
 
auto incompatibleLambda = [ ] ( MatchType compatibility ) {
......
......@@ -302,7 +302,7 @@ public:
registerInternal ( std::move ( algorithm ), std::move ( templateParams ), std::make_shared < WrapperImpl < ReturnType, ParamTypes ... > > ( category, std::move ( params ), std::move ( parameterNames ), std::move ( result ), callback ) );
}
 
static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory category );
static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > & paramQualifiers, AlgorithmCategories::AlgorithmCategory category );
 
static ext::set < ext::pair < std::string, ext::vector < std::string > > > listGroup ( const std::string & group );
 
......
......@@ -44,8 +44,8 @@ std::shared_ptr < abstraction::OperationAbstraction > Registry::getContainerAbst
return ContainerRegistry::getAbstraction ( container, type );
}
 
std::shared_ptr < abstraction::OperationAbstraction > Registry::getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory category ) {
return AlgorithmRegistry::getAbstraction ( name, templateParams, paramTypes, category );
std::shared_ptr < abstraction::OperationAbstraction > Registry::getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > & paramQualifiers, AlgorithmCategories::AlgorithmCategory category ) {
return AlgorithmRegistry::getAbstraction ( name, templateParams, paramTypes, paramQualifiers, category );
}
 
std::shared_ptr < abstraction::OperationAbstraction > Registry::getCastAbstraction ( const std::string & target, const std::string & param ) {
......
......@@ -29,7 +29,7 @@ public:
static ext::set < ext::tuple < AlgorithmCategories::AlgorithmCategory, ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > >, ext::vector < std::string >, std::string > > listOverloads ( const std::string & algorithm, const ext::vector < std::string > & templateParams );
 
static std::shared_ptr < abstraction::OperationAbstraction > getContainerAbstraction ( const std::string & container, const std::string & type );
static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory );
static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > & paramQualifiers, AlgorithmCategories::AlgorithmCategory );
static std::shared_ptr < abstraction::OperationAbstraction > getCastAbstraction ( const std::string & target, const std::string & param );
static bool isCastNoOp ( const std::string & target, const std::string & param );
static std::shared_ptr < abstraction::OperationAbstraction > getImmediateAbstraction ( const std::string & result, std::string value );
......
......@@ -51,8 +51,9 @@ namespace {
ext::vector < std::string > templateParams;
ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) };
abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category );
return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, paramTypeQualifiers, category );
}
 
auto xmlInputFileHandler = registration::InputFileRegister ( "xml", dummy );
......
......@@ -31,8 +31,9 @@ namespace {
ext::vector < std::string > templateParams;
ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) };
abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ), abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category );
return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, paramTypeQualifiers, category );
}
 
auto xmlOutputFileHandler = registration::OutputFileRegister ( "xml", dummy );
......
......@@ -15,8 +15,9 @@ namespace {
ext::vector < std::string > templateParams;
ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) };
abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) );
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
auto rawParserAbstractionFinder = [ = ] ( const std::string & ) {
return abstraction::RawReaderRegistry::getAbstraction ( typehint );
......
......@@ -18,8 +18,9 @@ namespace {
ext::vector < std::string > templateParams;
ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) };
abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ), abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) );
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 );
res->setInnerConnection ( 0, 1, 1, true );
......
......@@ -15,8 +15,9 @@ namespace {
ext::vector < std::string > templateParams;
ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) };
abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) );
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
auto stringParserAbstractionFinder = [ = ] ( const std::string & data ) {
return abstraction::StringReaderRegistry::getAbstraction ( typehint, data );
......
......@@ -18,8 +18,9 @@ namespace {
ext::vector < std::string > templateParams;
ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) };
abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ), abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) );
abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 );
res->setInnerConnection ( 0, 1, 1, true );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment