From 8207fa7505301acfc69e6fcfc12f8b3aa5e3ec27 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 21 Jun 2019 08:12:33 +0200 Subject: [PATCH] redesign value operation abstraction hierarchy --- .../src/abstraction/ValueInterface.hpp | 35 ++++ .../abstraction/ValueOperationAbstraction.hpp | 159 ++++-------------- 2 files changed, 66 insertions(+), 128 deletions(-) create mode 100644 alib2abstraction/src/abstraction/ValueInterface.hpp diff --git a/alib2abstraction/src/abstraction/ValueInterface.hpp b/alib2abstraction/src/abstraction/ValueInterface.hpp new file mode 100644 index 0000000000..998f5df3aa --- /dev/null +++ b/alib2abstraction/src/abstraction/ValueInterface.hpp @@ -0,0 +1,35 @@ +/* + * 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_ */ diff --git a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp index 7856945226..ef0522b42a 100644 --- a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp +++ b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp @@ -10,54 +10,17 @@ #include <alib/tuple> #include <alib/memory> -#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 { - return false; - } - - ext::type_index getReturnTypeIndex ( ) const override { - return ext::type_index ( typeid ( ReturnType ) ); - } - -}; - -} /* namespace abstraction */ - +#include <abstraction/ValueInterface.hpp> #include <common/ParamQualifiers.hpp> #include <common/AbstractionHelpers.hpp> namespace abstraction { template < class ReturnType > -class ValueOperationAbstraction : virtual public ValueInterface < ReturnType > { +class ValueOperationAbstractionImpl : virtual public ValueInterface < ReturnType > { mutable std::optional < ReturnType > m_data; protected: - bool isConst ( ) const override { - return false; - } - - bool isRvalueRef ( ) const override { - return false; - } - - bool isLvalueRef ( ) const override { - return false; - } - void setData ( ReturnType data ) { m_data = std::move ( data ); } @@ -73,32 +36,16 @@ public: setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); } - ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override { - return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( ); - } - bool evaluated ( ) const override { return ( bool ) m_data; } }; 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; protected: - bool isConst ( ) const override { - return true; - } - - bool isRvalueRef ( ) const override { - return false; - } - - bool isLvalueRef ( ) const override { - return false; - } - void setData ( ReturnType data ) { m_data = std::move ( data ); } @@ -114,32 +61,16 @@ public: setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); } - ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override { - return abstraction::ParamQualifiers::paramQualifiers < const ReturnType > ( ); - } - bool evaluated ( ) const override { return ( bool ) m_data; } }; 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; protected: - bool isConst ( ) const override { - return false; - } - - bool isRvalueRef ( ) const override { - return true; - } - - bool isLvalueRef ( ) const override { - return false; - } - void setData ( ReturnType & data ) { m_data = std::reference_wrapper < ReturnType > ( data ); } @@ -155,32 +86,16 @@ public: setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); } - ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override { - return abstraction::ParamQualifiers::paramQualifiers < ReturnType & > ( ); - } - bool evaluated ( ) const override { return ( bool ) m_data; } }; 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; protected: - bool isConst ( ) const override { - return true; - } - - bool isRvalueRef ( ) const override { - return true; - } - - bool isLvalueRef ( ) const override { - return false; - } - void setData ( const ReturnType & data ) { m_data = std::reference_wrapper < const ReturnType > ( data ); } @@ -196,32 +111,16 @@ public: setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); } - ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override { - return abstraction::ParamQualifiers::paramQualifiers < const ReturnType & > ( ); - } - bool evaluated ( ) const override { return ( bool ) m_data; } }; 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; protected: - bool isConst ( ) const override { - return false; - } - - bool isRvalueRef ( ) const override { - return false; - } - - bool isLvalueRef ( ) const override { - return true; - } - void setData ( ReturnType && data ) { m_data = std::reference_wrapper < ReturnType > ( data ); } @@ -237,32 +136,16 @@ public: setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); } - ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override { - return abstraction::ParamQualifiers::paramQualifiers < ReturnType && > ( ); - } - bool evaluated ( ) const override { return ( bool ) m_data; } }; 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; protected: - bool isConst ( ) const override { - return true; - } - - bool isRvalueRef ( ) const override { - return false; - } - - bool isLvalueRef ( ) const override { - return true; - } - void setData ( const ReturnType && data ) { m_data = std::reference_wrapper < const ReturnType > ( data ); } @@ -278,15 +161,35 @@ public: setData ( abstraction::apply < ParamTypes ... > ( callback, inputs ) ); } - ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override { - return abstraction::ParamQualifiers::paramQualifiers < const ReturnType && > ( ); - } - bool evaluated ( ) const override { 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 < > class ValueOperationAbstraction < void > : virtual public OperationAbstraction { public: -- GitLab