#include "alfe/main.h" #ifndef INCLUDED_DOUBLE_FUNCTIONS_H #define INCLUDED_DOUBLE_FUNCTIONS_H #include "alfe/function.h" #include "alfe/rational.h" class AddDoubleDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l + i->value()); } Identifier identifier() const { return OperatorPlus(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), DoubleType()); } }; }; class AddDoubleRational : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l + i->value().value()); } Identifier identifier() const { return OperatorPlus(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), RationalType()); } }; }; class AddRationalDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); Rational l = i->value(); ++i; return Value(l.value() + i->value()); } Identifier identifier() const { return OperatorPlus(); } FunctionType type() const { return FunctionType(DoubleType(), RationalType(), DoubleType()); } }; }; class SubtractDoubleDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l - i->value()); } Identifier identifier() const { return OperatorMinus(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), DoubleType()); } }; }; class SubtractDoubleRational : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l - i->value().value()); } Identifier identifier() const { return OperatorMinus(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), RationalType()); } }; }; class SubtractRationalDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); Rational l = i->value(); ++i; return Value(l.value() - i->value()); } Identifier identifier() const { return OperatorMinus(); } FunctionType type() const { return FunctionType(DoubleType(), RationalType(), DoubleType()); } }; }; class MultiplyDoubleDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l * i->value()); } Identifier identifier() const { return OperatorStar(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), DoubleType()); } }; }; class MultiplyDoubleRational : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l * i->value().value()); } Identifier identifier() const { return OperatorStar(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), RationalType()); } }; }; class MultiplyRationalDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); Rational l = i->value(); ++i; return Value(l.value() * i->value()); } Identifier identifier() const { return OperatorStar(); } FunctionType type() const { return FunctionType(DoubleType(), RationalType(), DoubleType()); } }; }; class DivideDoubleDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l / i->value()); } Identifier identifier() const { return OperatorDivide(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), DoubleType()); } }; }; class DivideDoubleRational : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return Value(l / i->value().value()); } Identifier identifier() const { return OperatorDivide(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), RationalType()); } }; }; class DivideRationalDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); Rational l = i->value(); ++i; return Value(l.value() / i->value()); } Identifier identifier() const { return OperatorDivide(); } FunctionType type() const { return FunctionType(DoubleType(), RationalType(), DoubleType()); } }; }; class ShiftLeftDoubleInteger : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); auto l = i->value(); ++i; return l*pow(2.0, i->value()); } Identifier identifier() const { return OperatorShiftLeft(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), IntegerType()); } }; }; class ShiftRightDoubleInteger : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); auto l = i->value(); ++i; return l/pow(2.0, i->value()); } Identifier identifier() const { return OperatorShiftRight(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), IntegerType()); } }; }; class PowerDoubleDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return pow(l, i->value()); } Identifier identifier() const { return OperatorPower(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), DoubleType()); } }; }; class PowerDoubleRational : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); double l = i->value(); ++i; return pow(l, i->value().value()); } Identifier identifier() const { return OperatorPower(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType(), RationalType()); } }; }; class PowerRationalDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { auto i = arguments.begin(); Rational l = i->value(); ++i; return pow(l.value(), i->value()); } Identifier identifier() const { return OperatorPower(); } FunctionType type() const { return FunctionType(DoubleType(), RationalType(), DoubleType()); } }; }; class NegativeDouble : public Nullary { public: class Body : public Nullary::Body { public: Value evaluate(List arguments, Span span) const { return Value( - arguments.begin()->value()); } Identifier identifier() const { return OperatorMinus(); } FunctionType type() const { return FunctionType(DoubleType(), DoubleType()); } }; }; #endif // INCLUDED_DOUBLE_FUNCTIONS_H