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

introspection of algorithms

parent 0216bf68
No related branches found
No related tags found
No related merge requests found
EXECUTABLE:=aintrospection2
LINK_PATHS=../alib2str/ ../alib2data_experimental/ ../alib2data/ ../alib2common/ ../alib2std/
LINK_LIBRARIES=alib2str alib2data_experimental alib2data alib2common alib2std xml2
INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2str/src/ \$$(SOURCES_BASE_DIR)/../../alib2data_experimental/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
LINK_PATHS=../alib2elgo/ ../alib2algo_experimental/ ../alib2algo/ ../alib2raw/ ../alib2str_experimental/ ../alib2str/ ../alib2data_experimental/ ../alib2data/ ../alib2common/ ../alib2std/
LINK_LIBRARIES=alib2elgo alib2algo_experimental alib2algo alib2raw alib2str_experimental alib2str alib2data_experimental alib2data alib2common alib2std xml2
INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2elgo/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo_experimental/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo/src/ \$$(SOURCES_BASE_DIR)/../../alib2raw/src/ \$$(SOURCES_BASE_DIR)/../../alib2str_experimental/src/ \$$(SOURCES_BASE_DIR)/../../alib2str/src/ \$$(SOURCES_BASE_DIR)/../../alib2data_experimental/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
......@@ -11,6 +11,9 @@
#include <factory/XmlDataFactory.hpp>
#include <exception/CommonException.h>
 
#include <introspection/DataTypes.hpp>
#include <introspection/Algorithms.hpp>
int main ( int argc, char * argv[] ) {
try {
common::GlobalData::argc = argc;
......@@ -24,6 +27,15 @@ int main ( int argc, char * argv[] ) {
TCLAP::ValueArg < std::string > dataTypesInGroup ( "d", "datatypes_in_group", "Data type Groups", false, "", "string" );
cmd.add ( dataTypesInGroup );
 
TCLAP::SwitchArg algorithms ( "", "algorithms", "Algorithms", false );
cmd.add ( algorithms );
TCLAP::ValueArg < std::string > algorithmInterface ( "", "algorithm_interface", "Algorithm Interface", false, "", "string" );
cmd.add ( algorithmInterface );
TCLAP::ValueArg < std::string > algorithmCallbacks ( "a", "algorithm_callbacks", "Algorithm Callbacks", false, "", "string" );
cmd.add ( algorithmCallbacks );
TCLAP::SwitchArg measure ( "m", "measure", "Measure times", false );
cmd.add ( measure );
 
......@@ -52,6 +64,26 @@ int main ( int argc, char * argv[] ) {
else
for ( const std::string & group : groupIter->second )
std::cout << group << std::endl;
} else if ( algorithms.getValue ( ) ) {
for ( const std::string & algorithm : introspection::Algorithms::getAlgorithms ( ) )
std::cout << algorithm << std::endl;
} else if ( algorithmInterface.isSet ( ) ) {
auto algorithmInterfaceIter = introspection::Algorithms::getAlgorithmInterfaces ( ).find ( algorithmInterface.getValue ( ) );
if ( algorithmInterfaceIter == introspection::Algorithms::getAlgorithmInterfaces ( ).end ( ) )
std::cout << "No such algorithm as " << algorithmInterface.getValue ( ) << std::endl;
else
std::cout << * algorithmInterfaceIter << std::endl;
} else if ( algorithmCallbacks.isSet ( ) ) {
auto algorithmCallbacksIter = introspection::Algorithms::getAlgorithmCallbacks ( ).find ( algorithmCallbacks.getValue ( ) );
if ( algorithmCallbacksIter == introspection::Algorithms::getAlgorithmCallbacks ( ).end ( ) )
std::cout << "No such algorithm as " << algorithmCallbacks.getValue ( ) << std::endl;
else
for ( const auto & callback : algorithmCallbacksIter->second )
std::cout << callback << std::endl;
}
 
measurements::end ( );
......
......@@ -17,6 +17,7 @@
 
#include "castApi.hpp"
#include "../exception/CommonException.h"
#include <introspection/Algorithms.hpp>
 
namespace std {
 
......@@ -60,6 +61,10 @@ public:
 
throw::exception::CommonException ( "Callback for " + ss.str ( ) + " already registered on " + classType + "." );
}
introspection::Algorithms::registerDispatchInAlgorithm < std::tuple < RealParameterTypeBases ... >, Algorithm, RealReturnType > ( );
introspection::Algorithms::registerAlgorithmInterface < Algorithm, ReturnType, std::tuple < FrontStaticParamTypes ... >, std::tuple < DispatchedParameterTypes ... >, std::tuple < BackStaticParamTypes ... > > ( );
introspection::Algorithms::registerAlgorithm < Algorithm > ( );
}
 
};
......
......@@ -8,11 +8,23 @@
#ifndef _ALGORITHMS_HPP_
#define _ALGORITHMS_HPP_
 
#include <string>
#include <set>
#include <map>
#include <tuple>
#include <vector>
#include <typeinfo>
namespace introspection {
 
class Algorithms {
static std::map < std::string, std::set < std::tuple < std::string, std::vector < std::string >, std::vector < std::string >, std::vector < std::string > > > > & algorithmCallbacks ( ) {
static std::map < std::string, std::set < std::tuple < std::string, std::vector < std::string >, std::vector < std::string >, std::vector < std::string > > > > res;
static std::map < std::string, std::tuple < std::string, std::vector < std::string >, std::vector < std::string >, std::vector < std::string > > > & algorithmInterfaces ( ) {
static std::map < std::string, std::tuple < std::string, std::vector < std::string >, std::vector < std::string >, std::vector < std::string > > > res;
return res;
}
static std::map < std::string, std::set < std::tuple < std::string, std::vector < std::string > > > > & algorithmCallbacks ( ) {
static std::map < std::string, std::set < std::tuple < std::string, std::vector < std::string > > > > res;
return res;
}
 
......@@ -21,15 +33,58 @@ class Algorithms {
return res;
}
 
template < class ... Types >
class TypesToString;
template < class ... Types >
class TypesToString < std::tuple < Types ... > > {
public:
static const std::vector < std::string > & getTypes ( ) {
static std::vector < std::string > res { std::type_name < Types > ( ) ... };
return res;
}
};
public:
const std::map < std::string, std::set < std::tuple < std::string, std::vector < std::string >, std::vector < std::string >, std::vector < std::string > > > > & getTypesInGroup ( ) {
return typesInGroup ( );
static const std::map < std::string, std::tuple < std::string, std::vector < std::string >, std::vector < std::string >, std::vector < std::string > > > & getAlgorithmInterfaces ( ) {
return algorithmInterfaces ( );
}
static const std::map < std::string, std::set < std::tuple < std::string, std::vector < std::string > > > > & getAlgorithmCallbacks ( ) {
return algorithmCallbacks ( );
}
 
const std::set < std::string > & getGroups ( ) {
return groups ( );
static const std::set < std::string > & getAlgorithms ( ) {
return algorithms ( );
}
 
template < class RealParameterTypes, class Algorithm, class RealReturnType >
static void registerDispatchInAlgorithm ( ) {
std::vector < std::string > realParameterTypeNames = TypesToString < RealParameterTypes >::getTypes ( );
std::string algorithm = std::type_name < Algorithm > ( );
std::string realReturnType = std::type_name < RealReturnType > ( );
Algorithms::algorithmCallbacks ( ) [ std::move ( algorithm ) ].insert ( std::make_tuple ( std::move ( realReturnType ), std::move ( realParameterTypeNames ) ) );
}
template < class Algorithm, class ReturnType, class FrontStaticParamTypes, class DispatchedParameterTypes, class BackStaticParamTypes >
static void registerAlgorithmInterface ( ) {
std::string algorithm = std::type_name < Algorithm > ( );
std::string returnType = std::type_name < ReturnType > ( );
std::vector < std::string > frontStaticParamTypeNames = TypesToString < FrontStaticParamTypes >::getTypes ( );
std::vector < std::string > dispatchedParameterTypeNames = TypesToString < DispatchedParameterTypes >::getTypes ( );
std::vector < std::string > backStaticParamTypeNames = TypesToString < BackStaticParamTypes >::getTypes ( );
Algorithms::algorithmInterfaces ( ) [ std::move ( algorithm ) ] = std::make_tuple ( std::move ( returnType ), std::move ( frontStaticParamTypeNames ), std::move ( dispatchedParameterTypeNames ), std::move ( backStaticParamTypeNames ) );
}
template < class Algorithm >
static void registerAlgorithm ( ) {
std::string algorithm = std::type_name < Algorithm > ( );
Algorithms::algorithms ( ).insert ( std::move ( algorithm ) );
}
};
 
} /* namespace introspection */
......
THREADS=${1:-5}
USE_RAMDISK=1 CXX=clang++ make debug -j${THREADS}
USE_RAMDISK=1 CXX=clang++ make install-debug -j${THREADS}
USE_RAMDISK=1 CXX=clang++ make test-debug -j${THREADS}
USE_RAMDISK=1 CXX=clang++ make debug -j${THREADS} || exit 1
USE_RAMDISK=1 CXX=clang++ make install-debug -j${THREADS} || exit 1
USE_RAMDISK=1 CXX=clang++ make test-debug -j${THREADS} || exit 1
THREADS=${1:-5}
USE_RAMDISK=1 CXX=g++-6 make release -j${THREADS}
USE_RAMDISK=1 CXX=g++-6 make install-release -j${THREADS}
USE_RAMDISK=1 CXX=g++-6 make test-release -j${THREADS}
USE_RAMDISK=1 CXX=g++-6 make release -j${THREADS} || exit 1
USE_RAMDISK=1 CXX=g++-6 make install-release -j${THREADS} || exit 1
USE_RAMDISK=1 CXX=g++-6 make test-release -j${THREADS} || exit 1
THREADS=${1:-5}
USE_RAMDISK=1 CXX=clang++ make build-code-debug -j${THREADS}
USE_RAMDISK=1 CXX=clang++ make install-debug -j${THREADS}
USE_RAMDISK=1 CXX=clang++ make build-code-debug -j${THREADS} || exit 1
USE_RAMDISK=1 CXX=clang++ make install-debug -j${THREADS} || exit 1
THREADS=${1:-5}
USE_RAMDISK=1 CXX=g++-6 make build-code-release -j${THREADS}
USE_RAMDISK=1 CXX=g++-6 make install-release -j${THREADS}
USE_RAMDISK=1 CXX=g++-6 make build-code-release -j${THREADS} || exit 1
USE_RAMDISK=1 CXX=g++-6 make install-release -j${THREADS} || exit 1
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