]> www.ginac.de Git - cln.git/blob - src/integer/elem/cl_I_equal.cc
Distinguish between cl_word_size and the ABI's pointer size.
[cln.git] / src / integer / elem / cl_I_equal.cc
1 // cl_equal().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_integer.h"
8
9
10 // Implementation.
11
12 #include "cl_I.h"
13 #include "cl_DS.h"
14
15 cl_boolean cl_equal (const cl_I& x, const cl_I& y)
16 {
17 // Methode:
18 // x und y haben gleiches Vorzeichen ->
19 // x Fixnum ->
20 //    y Fixnum -> direkt vergleichen.
21 //    y Bignum -> verschieden.
22 // x Bignum ->
23 //    y Fixnum -> verschieden.
24 //    y Bignum ->
25 //       falls beide gleich lang, wortweise vergleichen, sonst verschieden.
26       if (fixnump(x))
27         // x Fixnum
28         if (fixnump(y))
29           // x Fixnum, y Fixnum
30           { // This assumes cl_value_shift + cl_value_len == cl_pointer_size.
31             return (cl_boolean) ((cl_sint)x.word == (cl_sint)y.word);
32           }
33           else
34           // x Fixnum, y Bignum
35           return cl_false;
36         else
37         // x Bignum
38         if (fixnump(y))
39           // x Bignum, y Fixnum
40           return cl_false;
41           else
42           // x Bignum, y Bignum
43           if (x.pointer == y.pointer)
44             return cl_true; // gleiche Pointer -> selbe Zahl
45             else
46             { var uintC xlen = TheBignum(x)->length;
47               var uintC ylen = TheBignum(y)->length;
48               if (xlen==ylen)
49                 // gleiche Länge -> digitweise vergleichen
50                 return (cl_boolean) (compare_loop_msp(BN_MSDptr(x),BN_MSDptr(y),xlen) == 0);
51                 else
52                 return cl_false;
53             }
54 }