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

redesign value operation abstraction hierarchy

parent 47cdb9a2
No related branches found
No related tags found
No related merge requests found
/*
* ValueInterface.hpp
*
* Created on: 20. 6. 2019
* Author: Jan Travnicek
*/
#ifndef _VALUE_INTERFACE_HPP_
#define _VALUE_INTERFACE_HPP_
#include <alib/typeindex>
#include <abstraction/OperationAbstraction.hpp>
namespace abstraction {
template < class ReturnType >
class ValueInterface : public virtual OperationAbstraction {
public:
virtual ReturnType && getValue ( ) const = 0;
virtual bool isConst ( ) const = 0;
virtual bool isRvalueRef ( ) const = 0;
virtual bool isLvalueRef ( ) const = 0;
virtual bool isAutoMove ( ) const = 0;
ext::type_index getReturnTypeIndex ( ) const override {
return ext::type_index ( typeid ( ReturnType ) );
}
};
} /* namespace abstraction */
#endif /* _VALUE_INTERFACE_HPP_ */
...@@ -10,54 +10,17 @@ ...@@ -10,54 +10,17 @@
   
#include <alib/tuple> #include <alib/tuple>
#include <alib/memory> #include <alib/memory>
#include <alib/typeindex> #include <abstraction/ValueInterface.hpp>
#include <abstraction/OperationAbstraction.hpp>
namespace abstraction {
template < class ReturnType >
class ValueInterface : public virtual OperationAbstraction {
public:
virtual ReturnType && getValue ( ) const = 0;
virtual bool isConst ( ) const = 0;
virtual bool isRvalueRef ( ) const = 0;
virtual bool isLvalueRef ( ) const = 0;
virtual bool isAutoMove ( ) const {
return false;
}
ext::type_index getReturnTypeIndex ( ) const override {
return ext::type_index ( typeid ( ReturnType ) );
}
};
} /* namespace abstraction */
#include <common/ParamQualifiers.hpp> #include <common/ParamQualifiers.hpp>
#include <common/AbstractionHelpers.hpp> #include <common/AbstractionHelpers.hpp>
   
namespace abstraction { namespace abstraction {
   
template < class ReturnType > template < class ReturnType >
class ValueOperationAbstraction : virtual public ValueInterface < ReturnType > { class ValueOperationAbstractionImpl : virtual public ValueInterface < ReturnType > {
mutable std::optional < ReturnType > m_data; mutable std::optional < ReturnType > m_data;
   
protected: protected:
bool isConst ( ) const override {
return false;
}
bool isRvalueRef ( ) const override {
return false;
}
bool isLvalueRef ( ) const override {
return false;
}
void setData ( ReturnType data ) { void setData ( ReturnType data ) {
m_data = std::move ( data ); m_data = std::move ( data );
} }
...@@ -73,32 +36,16 @@ public: ...@@ -73,32 +36,16 @@ public:
setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) );
} }
   
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( );
}
bool evaluated ( ) const override { bool evaluated ( ) const override {
return ( bool ) m_data; return ( bool ) m_data;
} }
}; };
   
template < class ReturnType > template < class ReturnType >
class ValueOperationAbstraction < const ReturnType > : virtual public ValueInterface < ReturnType > { class ValueOperationAbstractionImpl < const ReturnType > : virtual public ValueInterface < ReturnType > {
mutable std::optional < ReturnType > m_data; mutable std::optional < ReturnType > m_data;
   
protected: protected:
bool isConst ( ) const override {
return true;
}
bool isRvalueRef ( ) const override {
return false;
}
bool isLvalueRef ( ) const override {
return false;
}
void setData ( ReturnType data ) { void setData ( ReturnType data ) {
m_data = std::move ( data ); m_data = std::move ( data );
} }
...@@ -114,32 +61,16 @@ public: ...@@ -114,32 +61,16 @@ public:
setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) );
} }
   
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < const ReturnType > ( );
}
bool evaluated ( ) const override { bool evaluated ( ) const override {
return ( bool ) m_data; return ( bool ) m_data;
} }
}; };
   
template < class ReturnType > template < class ReturnType >
class ValueOperationAbstraction < ReturnType & > : virtual public ValueInterface < ReturnType > { class ValueOperationAbstractionImpl < ReturnType & > : virtual public ValueInterface < ReturnType > {
mutable std::optional < std::reference_wrapper < ReturnType > > m_data; mutable std::optional < std::reference_wrapper < ReturnType > > m_data;
   
protected: protected:
bool isConst ( ) const override {
return false;
}
bool isRvalueRef ( ) const override {
return true;
}
bool isLvalueRef ( ) const override {
return false;
}
void setData ( ReturnType & data ) { void setData ( ReturnType & data ) {
m_data = std::reference_wrapper < ReturnType > ( data ); m_data = std::reference_wrapper < ReturnType > ( data );
} }
...@@ -155,32 +86,16 @@ public: ...@@ -155,32 +86,16 @@ public:
setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) );
} }
   
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType & > ( );
}
bool evaluated ( ) const override { bool evaluated ( ) const override {
return ( bool ) m_data; return ( bool ) m_data;
} }
}; };
   
template < class ReturnType > template < class ReturnType >
class ValueOperationAbstraction < const ReturnType & > : virtual public ValueInterface < ReturnType > { class ValueOperationAbstractionImpl < const ReturnType & > : virtual public ValueInterface < ReturnType > {
mutable std::optional < std::reference_wrapper < const ReturnType > > m_data; mutable std::optional < std::reference_wrapper < const ReturnType > > m_data;
   
protected: protected:
bool isConst ( ) const override {
return true;
}
bool isRvalueRef ( ) const override {
return true;
}
bool isLvalueRef ( ) const override {
return false;
}
void setData ( const ReturnType & data ) { void setData ( const ReturnType & data ) {
m_data = std::reference_wrapper < const ReturnType > ( data ); m_data = std::reference_wrapper < const ReturnType > ( data );
} }
...@@ -196,32 +111,16 @@ public: ...@@ -196,32 +111,16 @@ public:
setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) );
} }
   
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < const ReturnType & > ( );
}
bool evaluated ( ) const override { bool evaluated ( ) const override {
return ( bool ) m_data; return ( bool ) m_data;
} }
}; };
   
template < class ReturnType > template < class ReturnType >
class ValueOperationAbstraction < ReturnType && > : virtual public ValueInterface < ReturnType > { class ValueOperationAbstractionImpl < ReturnType && > : virtual public ValueInterface < ReturnType > {
mutable std::optional < std::reference_wrapper < ReturnType > > m_data; mutable std::optional < std::reference_wrapper < ReturnType > > m_data;
   
protected: protected:
bool isConst ( ) const override {
return false;
}
bool isRvalueRef ( ) const override {
return false;
}
bool isLvalueRef ( ) const override {
return true;
}
void setData ( ReturnType && data ) { void setData ( ReturnType && data ) {
m_data = std::reference_wrapper < ReturnType > ( data ); m_data = std::reference_wrapper < ReturnType > ( data );
} }
...@@ -237,32 +136,16 @@ public: ...@@ -237,32 +136,16 @@ public:
setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) );
} }
   
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType && > ( );
}
bool evaluated ( ) const override { bool evaluated ( ) const override {
return ( bool ) m_data; return ( bool ) m_data;
} }
}; };
   
template < class ReturnType > template < class ReturnType >
class ValueOperationAbstraction < const ReturnType && > : virtual public ValueInterface < ReturnType > { class ValueOperationAbstractionImpl < const ReturnType && > : virtual public ValueInterface < ReturnType > {
mutable std::optional < std::reference_wrapper < const ReturnType > > m_data; mutable std::optional < std::reference_wrapper < const ReturnType > > m_data;
   
protected: protected:
bool isConst ( ) const override {
return true;
}
bool isRvalueRef ( ) const override {
return false;
}
bool isLvalueRef ( ) const override {
return true;
}
void setData ( const ReturnType && data ) { void setData ( const ReturnType && data ) {
m_data = std::reference_wrapper < const ReturnType > ( data ); m_data = std::reference_wrapper < const ReturnType > ( data );
} }
...@@ -278,15 +161,35 @@ public: ...@@ -278,15 +161,35 @@ public:
setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) );
} }
   
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < const ReturnType && > ( );
}
bool evaluated ( ) const override { bool evaluated ( ) const override {
return ( bool ) m_data; return ( bool ) m_data;
} }
}; };
   
template < class ReturnType >
class ValueOperationAbstraction : virtual public ValueOperationAbstractionImpl < ReturnType > {
bool isConst ( ) const override {
return std::is_const_v < std::remove_reference_t < ReturnType > >;
}
bool isRvalueRef ( ) const override {
return std::is_rvalue_reference_v < ReturnType >;
}
bool isLvalueRef ( ) const override {
return std::is_lvalue_reference_v < ReturnType >;
}
bool isAutoMove ( ) const override {
return false;
}
public:
ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( );
}
};
template < > template < >
class ValueOperationAbstraction < void > : virtual public OperationAbstraction { class ValueOperationAbstraction < void > : virtual public OperationAbstraction {
public: public:
......
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