From 4624a3104da35f8dec5be9fa4028c06eff0fe12a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 4 Sep 2018 16:28:38 +0200
Subject: [PATCH] Macroprocessor: implement power operator for integers

For consistency with the power operator for sets (see #5).
---
 src/macro/MacroValue.cc | 10 ++++++++++
 src/macro/MacroValue.hh |  1 +
 2 files changed, 11 insertions(+)

diff --git a/src/macro/MacroValue.cc b/src/macro/MacroValue.cc
index 737168c9..6088bdb2 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 f0eff55e..acb6447d 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;
-- 
GitLab