From ddea58da1ef75fdd7dd9791ff3eae50a74184fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Thu, 29 Apr 2021 17:04:37 +0200 Subject: [PATCH] Move misplaced code --- .../BinaryExpressionProcessor.hpp | 112 +++++++++++++++++ .../utils/BinaryOperatorProcessorBuilder.hpp | 114 ------------------ 2 files changed, 112 insertions(+), 114 deletions(-) diff --git a/src/language/node_processor/BinaryExpressionProcessor.hpp b/src/language/node_processor/BinaryExpressionProcessor.hpp index cfbff7261..3af45c387 100644 --- a/src/language/node_processor/BinaryExpressionProcessor.hpp +++ b/src/language/node_processor/BinaryExpressionProcessor.hpp @@ -8,6 +8,9 @@ #include <type_traits> +template <typename DataType> +class DataHandler; + template <typename Op> struct BinOp; @@ -201,4 +204,113 @@ struct BinaryExpressionProcessor final : public INodeProcessor BinaryExpressionProcessor(ASTNode& node) : m_node{node} {} }; +template <typename BinaryOpT, typename ValueT, typename A_DataT, typename B_DataT> +struct BinaryExpressionProcessor<BinaryOpT, std::shared_ptr<ValueT>, std::shared_ptr<A_DataT>, std::shared_ptr<B_DataT>> + final : public INodeProcessor +{ + private: + ASTNode& m_node; + + PUGS_INLINE DataVariant + _eval(const DataVariant& a, const DataVariant& b) + { + const auto& embedded_a = std::get<EmbeddedData>(a); + const auto& embedded_b = std::get<EmbeddedData>(b); + + std::shared_ptr a_ptr = dynamic_cast<const DataHandler<A_DataT>&>(embedded_a.get()).data_ptr(); + + std::shared_ptr b_ptr = dynamic_cast<const DataHandler<B_DataT>&>(embedded_b.get()).data_ptr(); + + return EmbeddedData(std::make_shared<DataHandler<ValueT>>(BinOp<BinaryOpT>().eval(a_ptr, b_ptr))); + } + + public: + DataVariant + execute(ExecutionPolicy& exec_policy) + { + try { + return this->_eval(m_node.children[0]->execute(exec_policy), m_node.children[1]->execute(exec_policy)); + } + catch (const NormalError& error) { + throw ParseError(error.what(), m_node.begin()); + } + } + + BinaryExpressionProcessor(ASTNode& node) : m_node{node} {} +}; + +template <typename BinaryOpT, typename ValueT, typename A_DataT, typename B_DataT> +struct BinaryExpressionProcessor<BinaryOpT, std::shared_ptr<ValueT>, A_DataT, std::shared_ptr<B_DataT>> final + : public INodeProcessor +{ + private: + ASTNode& m_node; + + PUGS_INLINE DataVariant + _eval(const DataVariant& a, const DataVariant& b) + { + if constexpr ((std::is_arithmetic_v<A_DataT>) or (is_tiny_vector_v<A_DataT>) or (is_tiny_matrix_v<A_DataT>)) { + const auto& a_value = std::get<A_DataT>(a); + const auto& embedded_b = std::get<EmbeddedData>(b); + + std::shared_ptr b_ptr = dynamic_cast<const DataHandler<B_DataT>&>(embedded_b.get()).data_ptr(); + + return EmbeddedData(std::make_shared<DataHandler<ValueT>>(BinOp<BinaryOpT>().eval(a_value, b_ptr))); + } else { + static_assert(std::is_arithmetic_v<A_DataT>, "invalid left hand side type"); + } + } + + public: + DataVariant + execute(ExecutionPolicy& exec_policy) + { + try { + return this->_eval(m_node.children[0]->execute(exec_policy), m_node.children[1]->execute(exec_policy)); + } + catch (const NormalError& error) { + throw ParseError(error.what(), m_node.begin()); + } + } + + BinaryExpressionProcessor(ASTNode& node) : m_node{node} {} +}; + +template <typename BinaryOpT, typename ValueT, typename A_DataT, typename B_DataT> +struct BinaryExpressionProcessor<BinaryOpT, std::shared_ptr<ValueT>, std::shared_ptr<A_DataT>, B_DataT> final + : public INodeProcessor +{ + private: + ASTNode& m_node; + + PUGS_INLINE DataVariant + _eval(const DataVariant& a, const DataVariant& b) + { + if constexpr ((std::is_arithmetic_v<B_DataT>) or (is_tiny_matrix_v<B_DataT>) or (is_tiny_vector_v<B_DataT>)) { + const auto& embedded_a = std::get<EmbeddedData>(a); + const auto& b_value = std::get<B_DataT>(b); + + std::shared_ptr a_ptr = dynamic_cast<const DataHandler<A_DataT>&>(embedded_a.get()).data_ptr(); + + return EmbeddedData(std::make_shared<DataHandler<ValueT>>(BinOp<BinaryOpT>().eval(a_ptr, b_value))); + } else { + static_assert(std::is_arithmetic_v<B_DataT>, "invalid right hand side type"); + } + } + + public: + DataVariant + execute(ExecutionPolicy& exec_policy) + { + try { + return this->_eval(m_node.children[0]->execute(exec_policy), m_node.children[1]->execute(exec_policy)); + } + catch (const NormalError& error) { + throw ParseError(error.what(), m_node.begin()); + } + } + + BinaryExpressionProcessor(ASTNode& node) : m_node{node} {} +}; + #endif // BINARY_EXPRESSION_PROCESSOR_HPP diff --git a/src/language/utils/BinaryOperatorProcessorBuilder.hpp b/src/language/utils/BinaryOperatorProcessorBuilder.hpp index eb07b35d0..053fd83f5 100644 --- a/src/language/utils/BinaryOperatorProcessorBuilder.hpp +++ b/src/language/utils/BinaryOperatorProcessorBuilder.hpp @@ -8,11 +8,6 @@ #include <language/utils/IBinaryOperatorProcessorBuilder.hpp> #include <language/utils/ParseError.hpp> -#include <type_traits> - -template <typename DataType> -class DataHandler; - template <typename OperatorT, typename ValueT, typename A_DataT, typename B_DataT> class BinaryOperatorProcessorBuilder final : public IBinaryOperatorProcessorBuilder { @@ -44,113 +39,4 @@ class BinaryOperatorProcessorBuilder final : public IBinaryOperatorProcessorBuil } }; -template <typename BinaryOpT, typename ValueT, typename A_DataT, typename B_DataT> -struct BinaryExpressionProcessor<BinaryOpT, std::shared_ptr<ValueT>, std::shared_ptr<A_DataT>, std::shared_ptr<B_DataT>> - final : public INodeProcessor -{ - private: - ASTNode& m_node; - - PUGS_INLINE DataVariant - _eval(const DataVariant& a, const DataVariant& b) - { - const auto& embedded_a = std::get<EmbeddedData>(a); - const auto& embedded_b = std::get<EmbeddedData>(b); - - std::shared_ptr a_ptr = dynamic_cast<const DataHandler<A_DataT>&>(embedded_a.get()).data_ptr(); - - std::shared_ptr b_ptr = dynamic_cast<const DataHandler<B_DataT>&>(embedded_b.get()).data_ptr(); - - return EmbeddedData(std::make_shared<DataHandler<ValueT>>(BinOp<BinaryOpT>().eval(a_ptr, b_ptr))); - } - - public: - DataVariant - execute(ExecutionPolicy& exec_policy) - { - try { - return this->_eval(m_node.children[0]->execute(exec_policy), m_node.children[1]->execute(exec_policy)); - } - catch (const NormalError& error) { - throw ParseError(error.what(), m_node.begin()); - } - } - - BinaryExpressionProcessor(ASTNode& node) : m_node{node} {} -}; - -template <typename BinaryOpT, typename ValueT, typename A_DataT, typename B_DataT> -struct BinaryExpressionProcessor<BinaryOpT, std::shared_ptr<ValueT>, A_DataT, std::shared_ptr<B_DataT>> final - : public INodeProcessor -{ - private: - ASTNode& m_node; - - PUGS_INLINE DataVariant - _eval(const DataVariant& a, const DataVariant& b) - { - if constexpr ((std::is_arithmetic_v<A_DataT>) or (is_tiny_vector_v<A_DataT>) or (is_tiny_matrix_v<A_DataT>)) { - const auto& a_value = std::get<A_DataT>(a); - const auto& embedded_b = std::get<EmbeddedData>(b); - - std::shared_ptr b_ptr = dynamic_cast<const DataHandler<B_DataT>&>(embedded_b.get()).data_ptr(); - - return EmbeddedData(std::make_shared<DataHandler<ValueT>>(BinOp<BinaryOpT>().eval(a_value, b_ptr))); - } else { - static_assert(std::is_arithmetic_v<A_DataT>, "invalid left hand side type"); - } - } - - public: - DataVariant - execute(ExecutionPolicy& exec_policy) - { - try { - return this->_eval(m_node.children[0]->execute(exec_policy), m_node.children[1]->execute(exec_policy)); - } - catch (const NormalError& error) { - throw ParseError(error.what(), m_node.begin()); - } - } - - BinaryExpressionProcessor(ASTNode& node) : m_node{node} {} -}; - -template <typename BinaryOpT, typename ValueT, typename A_DataT, typename B_DataT> -struct BinaryExpressionProcessor<BinaryOpT, std::shared_ptr<ValueT>, std::shared_ptr<A_DataT>, B_DataT> final - : public INodeProcessor -{ - private: - ASTNode& m_node; - - PUGS_INLINE DataVariant - _eval(const DataVariant& a, const DataVariant& b) - { - if constexpr ((std::is_arithmetic_v<B_DataT>) or (is_tiny_matrix_v<B_DataT>) or (is_tiny_vector_v<B_DataT>)) { - const auto& embedded_a = std::get<EmbeddedData>(a); - const auto& b_value = std::get<B_DataT>(b); - - std::shared_ptr a_ptr = dynamic_cast<const DataHandler<A_DataT>&>(embedded_a.get()).data_ptr(); - - return EmbeddedData(std::make_shared<DataHandler<ValueT>>(BinOp<BinaryOpT>().eval(a_ptr, b_value))); - } else { - static_assert(std::is_arithmetic_v<B_DataT>, "invalid right hand side type"); - } - } - - public: - DataVariant - execute(ExecutionPolicy& exec_policy) - { - try { - return this->_eval(m_node.children[0]->execute(exec_policy), m_node.children[1]->execute(exec_policy)); - } - catch (const NormalError& error) { - throw ParseError(error.what(), m_node.begin()); - } - } - - BinaryExpressionProcessor(ASTNode& node) : m_node{node} {} -}; - #endif // BINARY_OPERATOR_PROCESSOR_BUILDER_HPP -- GitLab