diff --git a/alib2cli/src/command/NamesIntrospectionCommand.h b/alib2cli/src/command/NamesIntrospectionCommand.h new file mode 100644 index 0000000000000000000000000000000000000000..4812a6d6a09a3bfbf0bcd2919435e843703c51f0 --- /dev/null +++ b/alib2cli/src/command/NamesIntrospectionCommand.h @@ -0,0 +1,35 @@ +#ifndef _CLI_NAME_INTROSPECTION_COMMAND_H_ +#define _CLI_NAME_INTROSPECTION_COMMAND_H_ + +#include <command/Command.h> +#include <environment/Environment.h> + +namespace cli { + +class NamesIntrospectionCommand : public Command { +public: + void printNames ( const std::set < std::pair < std::string, std::set < std::string > > > & names ) const { + for ( const std::pair < std::string, std::set < std::string > > & entry : names ) { + std::cout << entry.first << " : "; + bool first = true; + for ( const std::string & name : entry.second ) { + if ( first ) + first = false; + else + std::cout << ", "; + + std::cout << name; + } + std::cout << std::endl; + } + } + + virtual Command::Result run ( Environment & ) const override { + printNames ( abstraction::Registry::listNames ( ) ); + return Command::Result::OK; + } +}; + +} /* namespace cli */ + +#endif /* _CLI_NAME_INTROSPECTION_COMMAND_H_ */ diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp index bec2d8c6d7624ab8f74bcbce3b717c8874310965..b5544c541d5782d248d50f6e15847762b5436c6a 100644 --- a/alib2cli/src/parser/Parser.cpp +++ b/alib2cli/src/parser/Parser.cpp @@ -26,6 +26,7 @@ #include <command/AlgorithmsIntrospectionCommand.h> #include <command/OverloadsIntrospectionCommand.h> #include <command/DataTypesIntrospectionCommand.h> +#include <command/NamesIntrospectionCommand.h> #include <command/CastsIntrospectionCommand.h> #include <command/SetCommand.h> @@ -268,6 +269,10 @@ std::unique_ptr < Command > Parser::introspect_command ( ) { std::unique_ptr < cli::Arg > param = optional_arg ( ); match ( cli::Lexer::TokenType::END ); return std::make_unique < DataTypesIntrospectionCommand > ( std::move ( param ) ); + } else if ( check_nonreserved_kw ( "names" ) ) { + match_nonreserved_kw ( "names" ); + match ( cli::Lexer::TokenType::END ); + return std::make_unique < NamesIntrospectionCommand > ( ); } else if ( check_nonreserved_kw ( "casts" ) ) { match_nonreserved_kw ( "casts" ); std::pair < bool, bool > from_to = introspect_cast_from_to ( ); diff --git a/alib2common/src/abstraction/AlgorithmRegistry.hpp b/alib2common/src/abstraction/AlgorithmRegistry.hpp index f77a6bf690f21c3e9405a0252cc75bfd7fdf8c66..6b319e9ad113a3856f48ee095f00889e83f4d689 100644 --- a/alib2common/src/abstraction/AlgorithmRegistry.hpp +++ b/alib2common/src/abstraction/AlgorithmRegistry.hpp @@ -65,6 +65,9 @@ class AlgorithmRegistry { public: template < class Algo, class ReturnType, class ... ParamTypes > static void registerAlgorithm ( ReturnType ( * callback ) ( ParamTypes ... ), bool downcast, bool normalize, std::array < std::string, sizeof ... ( ParamTypes ) > paramNames ) { + /* make unused parameter warning go away in case of sizeof ... ( ParamTypes ) == 0 */ + ( void ) paramNames; + std::string algorithm = ext::to_string < Algo > ( ); ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > params; diff --git a/alib2common/src/abstraction/Registry.cpp b/alib2common/src/abstraction/Registry.cpp index cc49d21f4feb0fe9b838832cab9e39453102b516..aaf0cd8e7afcada78d13697bcd8060561c98e8e6 100644 --- a/alib2common/src/abstraction/Registry.cpp +++ b/alib2common/src/abstraction/Registry.cpp @@ -16,6 +16,8 @@ #include <abstraction/NormalizeRegistry.hpp> #include <abstraction/DowncastRegistry.hpp> +#include <core/namingApi.hpp> + namespace abstraction { std::set < std::string > Registry::listAlgorithmGroup ( const std::string & group ) { @@ -46,6 +48,10 @@ std::set < std::pair < std::string, std::string > > Registry::listCasts ( ) { return CastRegistry::list ( ); } +std::set < std::pair < std::string, std::set < std::string > > > Registry::listNames ( ) { + return alib::namingApi::list ( ); +} + std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > Registry::listOverloads ( const std::string & algorithm ) { return AlgorithmRegistry::listOverloads ( algorithm ); } diff --git a/alib2common/src/abstraction/Registry.h b/alib2common/src/abstraction/Registry.h index 9cd1e71cb399053f26f8ea74532ce80110eaecf3..acd0ec78fc5fc537d496e637dde34693e6ad78e9 100644 --- a/alib2common/src/abstraction/Registry.h +++ b/alib2common/src/abstraction/Registry.h @@ -27,6 +27,8 @@ public: static std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > listOverloads ( const std::string & algorithm ); + static std::set < std::pair < std::string, std::set < std::string > > > listNames ( ); + static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes ); static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes, bool & unwrap, bool & normalize ); static std::shared_ptr < abstraction::OperationAbstraction > getCastAbstraction ( const std::string & target, const std::string & param, bool & normalize ); diff --git a/alib2common/src/core/namingApi.hpp b/alib2common/src/core/namingApi.hpp index 19658b45ad036cdf751e563dcb7cbd45fcbbc7ad..a9c7d1a3afa8be5a48e041fbe3f5f89242661c2a 100644 --- a/alib2common/src/core/namingApi.hpp +++ b/alib2common/src/core/namingApi.hpp @@ -45,6 +45,20 @@ public: return name != getNames ( ).end ( ); } + static std::set < std::pair < std::string, std::set < std::string > > > list ( ) { + std::set < std::pair < std::string, std::set < std::string > > > res; + + for ( const std::pair < const std::string, ext::set < ext::type_index > > & entry : getNames ( ) ) { + std::set < std::string > names; + for ( const ext::type_index & name : entry.second ) + names.insert ( ext::to_string ( name ) ); + + res.insert ( std::make_pair ( entry.first, names ) ); + } + + return res; + } + }; } /* namespace alib */