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

+remaining ValueOperation, ValueProvider overloads

parent 577ddad0
No related branches found
No related tags found
No related merge requests found
Pipeline #
......@@ -86,24 +86,20 @@ void CliTest::testCreateUnique ( ) {
// execute automaton::RandomAutomaton DFA 2 2 2 // nahodny automat DFA s danymi vlastnostmi, vypis na konzoli
// execute string::Normalize < str.xml | string::PatternMatch - < pattern.xml > match_result.xml // - je predchozi vysledek
 
try {
cli::Environment environment;
environment.setBinding ( "1", "1" );
cli::Parser parser ( cli::Lexer ( "execute One | Add <( Add (int) #1 <(One) ) - | Neg - > local/xxx.xml" ) );
parser.parse ( )->run ( environment );
cli::Environment environment;
environment.setBinding ( "1", "1" );
cli::Parser parser ( cli::Lexer ( "execute One | Add <( Add (int) #1 <(One) ) - | Neg - > local/xxx.xml" ) );
parser.parse ( )->run ( environment );
 
environment.setBinding ( "2", "local/xxx.xml" );
parser = cli::Parser ( cli::Lexer ( "execute One | Add <( Add (int) <#2 <(One) ) - | Neg (double) - | Divide (double) - <(One | (double) Add <(One) - )" ) );
parser.parse ( )->run ( environment );
environment.setBinding ( "2", "local/xxx.xml" );
parser = cli::Parser ( cli::Lexer ( "execute One | Add <( Add (int) <#2 <(One) ) - | Neg (double) - | Divide (double) - <(One | (double) Add <(One) - )" ) );
parser.parse ( )->run ( environment );
 
parser = cli::Parser ( cli::Lexer ( "execute One > $res" ) );
parser.parse ( )->run ( environment );
parser = cli::Parser ( cli::Lexer ( "execute One > $res" ) );
parser.parse ( )->run ( environment );
 
parser = cli::Parser ( cli::Lexer ( "execute $res" ) );
parser.parse ( )->run ( environment );
} catch ( const char * ex ) {
std::cout << ex << std::endl;
}
parser = cli::Parser ( cli::Lexer ( "execute $res" ) );
parser.parse ( )->run ( environment );
 
}
 
......@@ -125,13 +121,120 @@ void CliTest::testMove ( ) {
abstraction::AlgorithmRegistry::registerAlgorithm < Source > ( Source::source, false, false );
abstraction::AlgorithmRegistry::registerAlgorithm < Sink > ( Sink::sink, false, false );
 
cli::Environment environment;
cli::Parser parser ( cli::Lexer ( "execute Source | Sink ^ - >" ) );
parser.parse ( )->run ( environment );
}
static std::unique_ptr < int > source;
static std::unique_ptr < int > target;
class RvalueReferenceProvider {
public:
static std::unique_ptr < int > && foo ( ) {
return std::move ( source );
}
};
class RvalueReferenceAcceptor {
public:
static void bar ( std::unique_ptr < int > && out ) {
target = std::move ( out );
}
};
void CliTest::testRvalueReferencePassing ( ) {
abstraction::AlgorithmRegistry::registerAlgorithm < RvalueReferenceProvider > ( RvalueReferenceProvider::foo, false, false );
abstraction::AlgorithmRegistry::registerAlgorithm < RvalueReferenceAcceptor > ( RvalueReferenceAcceptor::bar, false, false );
try {
source = std::make_unique < int > ( 1 );
cli::Environment environment;
cli::Parser parser ( cli::Lexer ( "execute Source | Sink ^ - >" ) );
cli::Parser parser ( cli::Lexer ( "execute RvalueReferenceProvider | RvalueReferenceAcceptor - >" ) );
parser.parse ( )->run ( environment );
} catch ( const char * ex ) {
std::cout << ex << std::endl;
CPPUNIT_ASSERT ( false );
} catch ( ... ) {
CPPUNIT_ASSERT ( true );
}
source = std::make_unique < int > ( 1 );
cli::Environment environment;
cli::Parser parser ( cli::Lexer ( "execute RvalueReferenceProvider | RvalueReferenceAcceptor ^ - >" ) );
parser.parse ( )->run ( environment );
CPPUNIT_ASSERT ( * target == 1 );
CPPUNIT_ASSERT ( source == nullptr ); /* implementation specific */
}
class ConstReferenceProvider {
public:
static const std::string & foo ( ) {
static std::string dummy = "dummy";
return dummy;
}
};
class ConstReferenceAcceptor {
public:
static void bar ( const std::string & str ) {
std::cout << str << std::endl;
}
};
void CliTest::testConstReferencePassing ( ) {
abstraction::AlgorithmRegistry::registerAlgorithm < ConstReferenceProvider > ( ConstReferenceProvider::foo, false, false );
abstraction::AlgorithmRegistry::registerAlgorithm < ConstReferenceAcceptor > ( ConstReferenceAcceptor::bar, false, false );
cli::Environment environment;
cli::Parser parser ( cli::Lexer ( "execute ConstReferenceProvider | ConstReferenceAcceptor - >" ) );
parser.parse ( )->run ( environment );
}
class ReferenceProvider {
public:
static std::ostream & foo ( ) {
return std::cout;
}
};
class ReferenceAcceptor {
public:
static void bar ( std::ostream & out ) {
out << "yay" << std::endl;
}
};
void CliTest::testReferencePassing ( ) {
abstraction::AlgorithmRegistry::registerAlgorithm < ReferenceProvider > ( ReferenceProvider::foo, false, false );
abstraction::AlgorithmRegistry::registerAlgorithm < ReferenceAcceptor > ( ReferenceAcceptor::bar, false, false );
cli::Environment environment;
cli::Parser parser ( cli::Lexer ( "execute ReferenceProvider | ReferenceAcceptor - >" ) );
parser.parse ( )->run ( environment );
}
class ConstRvalueReferenceProvider {
public:
static const std::string && foo ( ) {
static std::string dummy = "dummy";
return std::move ( dummy );
}
};
class ConstRvalueReferenceAcceptor {
public:
static void bar ( const std::string && str ) {
std::cout << str << std::endl;
}
};
void CliTest::testConstRvalueReferencePassing ( ) {
abstraction::AlgorithmRegistry::registerAlgorithm < ConstRvalueReferenceProvider > ( ConstRvalueReferenceProvider::foo, false, false );
abstraction::AlgorithmRegistry::registerAlgorithm < ConstRvalueReferenceAcceptor > ( ConstRvalueReferenceAcceptor::bar, false, false );
 
cli::Environment environment;
cli::Parser parser ( cli::Lexer ( "execute ConstRvalueReferenceProvider | ConstRvalueReferenceAcceptor ^ - >" ) );
parser.parse ( )->run ( environment );
}
 
......@@ -7,6 +7,10 @@ class CliTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE ( CliTest );
CPPUNIT_TEST ( testCreateUnique );
CPPUNIT_TEST ( testMove );
CPPUNIT_TEST ( testRvalueReferencePassing );
CPPUNIT_TEST ( testConstReferencePassing );
CPPUNIT_TEST ( testReferencePassing );
CPPUNIT_TEST ( testConstRvalueReferencePassing );
CPPUNIT_TEST_SUITE_END ( );
 
public:
......@@ -15,6 +19,10 @@ public:
 
void testCreateUnique ( );
void testMove ( );
void testRvalueReferencePassing ( );
void testConstReferencePassing ( );
void testReferencePassing ( );
void testConstRvalueReferencePassing ( );
};
 
#endif // CLI_TEST_H_
......@@ -19,7 +19,7 @@
namespace abstraction {
 
template < class ReturnType >
class ValueOperationAbstraction : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & > {
class ValueOperationAbstraction : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
protected:
virtual ReturnType & getData ( ) const override {
return m_data.template get < ReturnType > ( );
......@@ -63,7 +63,7 @@ public:
};
 
template < class ReturnType >
class ValueOperationAbstraction < ReturnType & > : public OperationAbstraction, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & > {
class ValueOperationAbstraction < ReturnType & > : public OperationAbstraction, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
protected:
virtual ReturnType & getData ( ) const override {
return m_data.template get < std::reference_wrapper < ReturnType > > ( ).get ( );
......@@ -107,7 +107,7 @@ public:
};
 
template < class ReturnType >
class ValueOperationAbstraction < const ReturnType & > : public OperationAbstraction, public ValueProvider < const ReturnType & > {
class ValueOperationAbstraction < const ReturnType & > : public OperationAbstraction, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
protected:
virtual const ReturnType & getConstData ( ) const override {
return m_data.template get < std::reference_wrapper < const ReturnType > > ( ).get ( );
......@@ -146,6 +146,94 @@ public:
}
};
 
template < class ReturnType >
class ValueOperationAbstraction < ReturnType && > : public OperationAbstraction, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
protected:
virtual ReturnType & getData ( ) const override {
return m_data.template get < std::reference_wrapper < ReturnType > > ( ).get ( );
}
virtual const ReturnType & getConstData ( ) const override {
return m_data.template get < std::reference_wrapper < ReturnType > > ( ).get ( );
}
mutable ext::variant < void, std::reference_wrapper < ReturnType > > m_data;
public:
template < typename Callable, typename ... Ts, size_t ... Indexes >
inline void run_helper ( Callable callback, const ext::tuple < Ts ... > & inputs, const std::array < bool, sizeof ... ( Indexes ) > moves, std::index_sequence < Indexes ... > ) {
/* make unused parameter warning go away in case of sizeof ... ( Ts ) == 0 */
( void ) inputs;
( void ) moves;
if ( ! isReady ( ) ) {
ReturnType && res = callback ( std::get < Indexes > ( inputs )->getValue ( std::get < Indexes > ( moves ) ) ... );
m_data = std::reference_wrapper < ReturnType > ( res );
}
}
virtual bool isReady ( ) const override {
return m_data.template is < std::reference_wrapper < ReturnType > > ( );
}
virtual ext::type_index getReturnTypeIndex ( ) const override {
return ext::type_index ( typeid ( ReturnType ) );
}
virtual ext::type_index getRuntimeReturnTypeIndex ( ) const override {
if ( isReady ( ) )
return ext::type_index ( typeid ( getData ( ) ) );
else
throw exception::CommonException ( "Runtime type unknown before evaluation." );
}
virtual bool cached ( ) const override {
return isReady ( );
}
};
template < class ReturnType >
class ValueOperationAbstraction < const ReturnType && > : public OperationAbstraction, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
protected:
virtual const ReturnType & getConstData ( ) const override {
return m_data.template get < std::reference_wrapper < const ReturnType > > ( ).get ( );
}
mutable ext::variant < void, std::reference_wrapper < const ReturnType > > m_data;
public:
template < typename Callable, typename ... Ts, size_t ... Indexes >
inline void run_helper ( Callable callback, const ext::tuple < Ts ... > & inputs, const std::array < bool, sizeof ... ( Indexes ) > moves, std::index_sequence < Indexes ... > ) {
/* make unused parameter warning go away in case of sizeof ... ( Ts ) == 0 */
( void ) inputs;
( void ) moves;
if ( ! isReady ( ) ) {
const ReturnType && res = callback ( std::get < Indexes > ( inputs )->getValue ( std::get < Indexes > ( moves ) ) ... );
m_data = std::reference_wrapper < const ReturnType > ( res );
}
}
virtual bool isReady ( ) const override {
return m_data.template is < std::reference_wrapper < const ReturnType > > ( );
}
virtual ext::type_index getReturnTypeIndex ( ) const override {
return ext::type_index ( typeid ( ReturnType ) );
}
virtual ext::type_index getRuntimeReturnTypeIndex ( ) const override {
if ( isReady ( ) )
return ext::type_index ( typeid ( getConstData ( ) ) );
else
throw exception::CommonException ( "Runtime type unknown before evaluation." );
}
virtual bool cached ( ) const override {
return isReady ( );
}
};
template < class ReturnType >
class ValueOperationAbstraction < ReturnType * > : public OperationAbstraction, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & > {
protected:
......
......@@ -91,7 +91,7 @@ public:
return getConstData ( );
}
 
const Type & getValue ( bool ) const{
const Type & getValue ( bool ) const {
return getConstData ( );
}
 
......@@ -100,6 +100,54 @@ public:
virtual bool isReady ( ) const = 0;
};
 
template < class Type >
class ValueProvider < Type && > {
protected:
virtual Type & getData ( ) const = 0;
public:
typedef Type return_type;
Type && getRValueReference ( ) const {
return std::move ( getData ( ) );
}
Type && getValue ( bool move ) const {
if ( move )
return std::move ( getData ( ) );
else
throw exception::CommonException ( "Value not copy constructible" );
}
virtual bool eval ( ) = 0;
virtual bool isReady ( ) const = 0;
};
template < class Type >
class ValueProvider < const Type && > {
protected:
virtual const Type & getConstData ( ) const = 0;
public:
typedef Type return_type;
const Type && getConstRValueReference ( ) const {
return std::move ( getConstData ( ) );
}
const Type && getValue ( bool move ) const {
if ( move )
return std::move ( getConstData ( ) );
else
throw exception::CommonException ( "Value not copy constructible" );
}
virtual bool eval ( ) = 0;
virtual bool isReady ( ) const = 0;
};
} /* namespace abstraction */
 
#endif /* _VALUE_PROVIDER_HPP_ */
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