From f7a6ff7d87bf384e3c3826288d85e3eb0bd386d6 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Thu, 27 Jun 2019 16:48:19 +0200 Subject: [PATCH] Setup basics for userdata binary operations --- src/UserData/UserData.hpp | 49 ++++++++++++++++++++++++++++++ src/UserData/UserDataOperation.cpp | 1 + src/UserData/UserDataOperation.hpp | 37 ++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 src/UserData/UserDataOperation.cpp create mode 100644 src/UserData/UserDataOperation.hpp diff --git a/src/UserData/UserData.hpp b/src/UserData/UserData.hpp index dab7ee3..f3c74fa 100644 --- a/src/UserData/UserData.hpp +++ b/src/UserData/UserData.hpp @@ -6,10 +6,27 @@ #include #include #include "UserDataField.hpp" +#include "UserDataOperation.hpp" namespace Porygon::UserData { class UserData { std::unordered_map _fields; + + // Binary operations + UserDataBinaryOperation* _addition = nullptr; + UserDataBinaryOperation* _subtraction = nullptr; + UserDataBinaryOperation* _multiplication = nullptr; + UserDataBinaryOperation* _division = nullptr; + UserDataBinaryOperation* _equality = nullptr; + UserDataBinaryOperation* _inequality = nullptr; + UserDataBinaryOperation* _lessThen = nullptr; + UserDataBinaryOperation* _lessThenEqual = nullptr; + UserDataBinaryOperation* _greaterThen = nullptr; + UserDataBinaryOperation* _greaterThenEqual = nullptr; + UserDataBinaryOperation* _logicalAnd = nullptr; + UserDataBinaryOperation* _logicalOr = nullptr; + UserDataBinaryOperation* _concatenation = nullptr; + public: explicit UserData(std::unordered_map fields) : _fields(std::move(fields)) @@ -20,6 +37,19 @@ namespace Porygon::UserData { for (auto f: _fields){ delete f.second; } + delete _addition; + delete _subtraction; + delete _multiplication; + delete _division; + delete _equality; + delete _inequality; + delete _lessThen; + delete _lessThenEqual; + delete _greaterThen; + delete _greaterThenEqual; + delete _logicalAnd; + delete _logicalOr; + delete _concatenation; } bool ContainsField(uint32_t fieldId) const{ @@ -37,6 +67,25 @@ namespace Porygon::UserData { int32_t GetFieldCount() const{ return _fields.size(); } + + UserDataBinaryOperation* GetBinaryOperation(Binder::BoundBinaryOperation op){ + switch (op){ + + case Binder::BoundBinaryOperation::Addition: return _addition; + case Binder::BoundBinaryOperation::Subtraction: return _subtraction; + case Binder::BoundBinaryOperation::Multiplication: return _multiplication; + case Binder::BoundBinaryOperation::Division: return _division; + case Binder::BoundBinaryOperation::Equality: return _equality; + case Binder::BoundBinaryOperation::Inequality: return _inequality; + case Binder::BoundBinaryOperation::LessThan: return _lessThen; + case Binder::BoundBinaryOperation::LessThanEquals: return _lessThenEqual; + case Binder::BoundBinaryOperation::GreaterThan: return _greaterThen; + case Binder::BoundBinaryOperation::GreaterThanEquals: return _greaterThenEqual; + case Binder::BoundBinaryOperation::LogicalAnd: return _logicalAnd; + case Binder::BoundBinaryOperation::LogicalOr: return _logicalOr; + case Binder::BoundBinaryOperation::Concatenation: return _concatenation; + } + } }; } diff --git a/src/UserData/UserDataOperation.cpp b/src/UserData/UserDataOperation.cpp new file mode 100644 index 0000000..7957446 --- /dev/null +++ b/src/UserData/UserDataOperation.cpp @@ -0,0 +1 @@ +#include "UserDataOperation.hpp" diff --git a/src/UserData/UserDataOperation.hpp b/src/UserData/UserDataOperation.hpp new file mode 100644 index 0000000..59c4e53 --- /dev/null +++ b/src/UserData/UserDataOperation.hpp @@ -0,0 +1,37 @@ + +#ifndef PORYGONLANG_USERDATAOPERATION_HPP +#define PORYGONLANG_USERDATAOPERATION_HPP +#include +#include "../Binder/BoundOperators.hpp" +#include "../Evaluator/EvalValues/EvalValue.hpp" + +namespace Porygon::UserData { + class UserDataBinaryOperation { + void* _parent; + Evaluation::EvalValue *(*_func)(void *obj, Evaluation::EvalValue *b); + const shared_ptr _secondParameter; + const shared_ptr _returnType; + public: + UserDataBinaryOperation(void *parent, + Evaluation::EvalValue *(*func)(void *, Evaluation::EvalValue *), + shared_ptr secondParameter, + shared_ptr returnType) + : _parent(parent), _func(func), _secondParameter(std::move(secondParameter)), + _returnType(std::move(returnType)) {} + + Evaluation::EvalValue* Invoke(Evaluation::EvalValue * b) const{ + return _func(_parent, b); + } + + const shared_ptr GetSecondParameterType() const{ + return _secondParameter; + } + + const shared_ptr GetReturnType() const{ + return _returnType; + } + }; +} + + +#endif //PORYGONLANG_USERDATAOPERATION_HPP