diff --git a/src/macro/MacroValue.cc b/src/macro/MacroValue.cc index 737168c93f7bbfdd2cba9a3c111dd0960aa8dc1c..6088bdb2bb180c3535053b7841ded50afff04ad6 100644 --- a/src/macro/MacroValue.cc +++ b/src/macro/MacroValue.cc @@ -18,6 +18,7 @@ */ #include <utility> +#include <cmath> #include "MacroDriver.hh" @@ -198,6 +199,15 @@ IntMV::divide(const MacroValuePtr &mv) noexcept(false) return make_shared<IntMV>(value / mv2->value); } +MacroValuePtr +IntMV::power(const MacroValuePtr &mv) noexcept(false) +{ + auto mv2 = dynamic_pointer_cast<IntMV>(mv); + if (!mv2) + throw TypeError("Type mismatch for operands of ^ operator"); + return make_shared<IntMV>(pow(value, mv2->value)); +} + shared_ptr<IntMV> IntMV::is_less(const MacroValuePtr &mv) noexcept(false) { diff --git a/src/macro/MacroValue.hh b/src/macro/MacroValue.hh index f0eff55e6ef15184edd3cf558a1ad82e6850d022..acb6447d84875508b11f61a5d3bdab6a7ff8d253 100644 --- a/src/macro/MacroValue.hh +++ b/src/macro/MacroValue.hh @@ -135,6 +135,7 @@ public: MacroValuePtr times(const MacroValuePtr &mv) noexcept(false) override; //! Computes arithmetic division MacroValuePtr divide(const MacroValuePtr &mv) noexcept(false) override; + MacroValuePtr power(const MacroValuePtr &mv) noexcept(false) override; shared_ptr<IntMV> is_less(const MacroValuePtr &mv) noexcept(false) override; shared_ptr<IntMV> is_greater(const MacroValuePtr &mv) noexcept(false) override; shared_ptr<IntMV> is_less_equal(const MacroValuePtr &mv) noexcept(false) override;