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