From e771a946b687eae1c997c06e1a14b13c276bfb66 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 14 Jun 2019 16:40:42 +0200
Subject: [PATCH] try virtual inheritance

---
 .../src/abstraction/NaryOperationAbstraction.hpp   |  6 +++---
 .../src/abstraction/ValueOperationAbstraction.hpp  | 14 +++++++-------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp b/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp
index 4cc47a94d8..a77e943929 100644
--- a/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp
@@ -18,8 +18,8 @@
 
 namespace abstraction {
 
-template < class ReturnType, size_t N >
-class NaryOperationAbstractionImpl : public ValueOperationAbstraction < ReturnType > {
+template < size_t N >
+class NaryOperationAbstractionImpl : virtual public OperationAbstraction {
 	ext::array < std::pair < std::shared_ptr < OperationAbstraction >, bool >, N > m_params;
 
 protected:
@@ -91,7 +91,7 @@ public:
 };
 
 template < class ReturnType, class ... ParamTypes >
-class NaryOperationAbstraction : public NaryOperationAbstractionImpl < ReturnType, sizeof ... ( ParamTypes ) > {
+class NaryOperationAbstraction : virtual public NaryOperationAbstractionImpl < sizeof ... ( ParamTypes ) >, virtual public ValueOperationAbstraction < ReturnType > {
 	bool checkInput ( const std::shared_ptr < OperationAbstraction > & input, size_t index ) const override {
 		return abstraction::checkInput < ValueProvider < ParamTypes > ... > ( input, index );
 	}
diff --git a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
index a6d17f47f1..8e95282b80 100644
--- a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
@@ -24,7 +24,7 @@ class UnspecifiedType {
 };
 
 template < class ReturnType >
-class ValueOperationAbstraction : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
+class ValueOperationAbstraction : virtual public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
 	mutable std::optional < ReturnType > m_data;
 
 protected:
@@ -77,7 +77,7 @@ public:
 };
 
 template < class ReturnType >
-class ValueOperationAbstraction < const ReturnType > : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
+class ValueOperationAbstraction < const ReturnType > : virtual public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
 	mutable std::optional < ReturnType > m_data;
 
 protected:
@@ -130,7 +130,7 @@ public:
 };
 
 template < class ReturnType >
-class ValueOperationAbstraction < ReturnType & > : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
+class ValueOperationAbstraction < ReturnType & > : virtual public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < ReturnType & >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
 	mutable std::optional < std::reference_wrapper < ReturnType > > m_data;
 
 protected:
@@ -183,7 +183,7 @@ public:
 };
 
 template < class ReturnType >
-class ValueOperationAbstraction < const ReturnType & > : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
+class ValueOperationAbstraction < const ReturnType & > : virtual public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
 	mutable std::optional < std::reference_wrapper < const ReturnType > > m_data;
 
 protected:
@@ -236,7 +236,7 @@ public:
 };
 
 template < class ReturnType >
-class ValueOperationAbstraction < ReturnType && > : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
+class ValueOperationAbstraction < ReturnType && > : virtual public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < ReturnType && >, public ValueProvider < const ReturnType && > {
 	mutable std::optional < std::reference_wrapper < ReturnType > > m_data;
 
 protected:
@@ -289,7 +289,7 @@ public:
 };
 
 template < class ReturnType >
-class ValueOperationAbstraction < const ReturnType && > : public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
+class ValueOperationAbstraction < const ReturnType && > : virtual public OperationAbstraction, public ValueProvider < ReturnType >, public ValueProvider < const ReturnType & >, public ValueProvider < const ReturnType && > {
 	mutable std::optional < std::reference_wrapper < const ReturnType > > m_data;
 
 protected:
@@ -342,7 +342,7 @@ public:
 };
 
 template < >
-class ValueOperationAbstraction < void > : public OperationAbstraction {
+class ValueOperationAbstraction < void > : virtual public OperationAbstraction {
 public:
 	template < typename ... ParamTypes, typename Callable >
 	inline void run_helper ( Callable callback, const ext::array < std::pair < std::shared_ptr < OperationAbstraction >, bool >, sizeof ... ( ParamTypes ) > & inputs ) {
-- 
GitLab