Parcourir la source

Add basic Integer arithmetic

Jean Fromentin il y a 8 ans
Parent
commit
dd3e847b38
4 fichiers modifiés avec 92 ajouts et 1 suppressions
  1. 6 0
      ext/base/init.cpp
  2. 66 0
      ext/base/integer.cpp
  3. 17 0
      ext/base/integer.hpp
  4. 3 1
      kernel.cpp

+ 6 - 0
ext/base/init.cpp

@@ -32,6 +32,12 @@ extern "C"{
   Gomu::Module::Function functions[]={
     {"Integer","len",{"String"},(void*)string_len},
     {"Integer","len",{"Array"},(void*)array_len},
+    {"Integer","negate",{"Integer"},(void*)integer_negate},
+    {"Integer","operator+",{"Integer","Integer"},(void*)integer_add},
+    {"Integer","operator*",{"Integer","Integer"},(void*)integer_mul},
+    {"Integer","operator/",{"Integer","Integer"},(void*)integer_quo},
+    {"Integer","operator%",{"Integer","Integer"},(void*)integer_rem},
+    {"Integer","operator-",{"Integer","Integer"},(void*)integer_sub},
     FUNC_SENTINEL
   };
   

+ 66 - 0
ext/base/integer.cpp

@@ -18,3 +18,69 @@
  */
 
 #include "integer.hpp"
+
+//------------------------------
+// Integer add(Integer,Integer)
+//------------------------------
+
+void* integer_add(void* a,void* b){
+  fmpz* res=new fmpz;
+  fmpz_init(res);
+  fmpz_add(res,(fmpz*)a,(fmpz*)b);
+  return (void*)res;
+}
+
+//------------------------------
+// Integer mul(Integer,Integer)
+//------------------------------
+
+void* integer_mul(void* a,void* b){
+  fmpz* res=new fmpz;
+  fmpz_init(res);
+  fmpz_mul(res,(fmpz*)a,(fmpz*)b);
+  return (void*)res;
+}
+
+//-------------------------
+// Integer negate(Integer)
+//-------------------------
+
+void* integer_negate(void* a){
+  fmpz* res=new fmpz;
+  fmpz_init(res);
+  fmpz_neg(res,(fmpz*)a);
+  return (void*)res;
+}
+
+//------------------------------
+// Integer quo(Integer,Integer)
+//------------------------------
+
+void* integer_quo(void* a,void* b){
+  fmpz* res=new fmpz;
+  fmpz_init(res);
+  fmpz_fdiv_q(res,(fmpz*)a,(fmpz*)b);
+  return (void*)res;
+}
+
+//------------------------------
+// Integer rem(Integer,Integer)
+//------------------------------
+
+void* integer_rem(void* a,void* b){
+  fmpz* res=new fmpz;
+  fmpz_init(res);
+  fmpz_fdiv_r(res,(fmpz*)a,(fmpz*)b);
+  return (void*)res;
+}
+
+//------------------------------
+// Integer sub(Integer,Integer)
+//------------------------------
+
+void* integer_sub(void* a,void* b){
+  fmpz* res=new fmpz;
+  fmpz_init(res);
+  fmpz_sub(res,(fmpz*)a,(fmpz*)b);
+  return (void*)res;
+}

+ 17 - 0
ext/base/integer.hpp

@@ -21,3 +21,20 @@
 
 using namespace Gomu;
 
+//!Return the sum of two integers
+void* integer_add(void*,void*);
+
+//!Return the multiplication of two integers
+void* integer_mul(void*,void*);
+
+//!Return the opposite of an integer
+void* integer_negate(void*);
+
+//!Return the quotient of two integers
+void* integer_quo(void*,void*);
+
+//!Return the remainder of two integers
+void* integer_rem(void*,void*);
+
+//!Return the substraction of two integers
+void* integer_sub(void*,void*);

+ 3 - 1
kernel.cpp

@@ -347,7 +347,9 @@ namespace Gomu{
     interpreter.add_operator("!=","operator!=",opBinary,8);
     interpreter.add_operator("+","operator+",opBinary,4);
     interpreter.add_operator("-","operator-",opBinary,4);
-    interpreter.add_operator("*","operator*",opBinary,3);
+    interpreter.add_operator("*","operator*",opBinary,5);
+    interpreter.add_operator("/","operator/",opBinary,5);
+    interpreter.add_operator("%","operator%",opBinary,5);
     interpreter.add_operator("::","operator::",opBinary,1);
     interpreter.add_operator("!","factorial",opPostUnitary,2);
     context.add_contextual_function("Void","load",{"String"},(void*)load_module);