1 // equal().
2
3 // General includes.
4 #include "base/cl_sysdep.h"
5
6 // Specification.
7 #include "cln/integer.h"
8
9
10 // Implementation.
11
12 #include "integer/cl_I.h"
13 #include "base/digitseq/cl_DS.h"
14
15 namespace cln {
16
equal(const cl_I & x,const cl_I & y)17 bool equal (const cl_I& x, const cl_I& y)
18 {
19 // Methode:
20 // x und y haben gleiches Vorzeichen ->
21 // x Fixnum ->
22 // y Fixnum -> direkt vergleichen.
23 // y Bignum -> verschieden.
24 // x Bignum ->
25 // y Fixnum -> verschieden.
26 // y Bignum ->
27 // falls beide gleich lang, wortweise vergleichen, sonst verschieden.
28 if (fixnump(x))
29 // x Fixnum
30 if (fixnump(y))
31 // x Fixnum, y Fixnum
32 { // This assumes cl_value_shift + cl_value_len == cl_pointer_size.
33 return (cl_sint)x.word == (cl_sint)y.word;
34 }
35 else
36 // x Fixnum, y Bignum
37 return false;
38 else
39 // x Bignum
40 if (fixnump(y))
41 // x Bignum, y Fixnum
42 return false;
43 else
44 // x Bignum, y Bignum
45 if (x.pointer == y.pointer)
46 return true; // gleiche Pointer -> selbe Zahl
47 else
48 { var uintC xlen = TheBignum(x)->length;
49 var uintC ylen = TheBignum(y)->length;
50 if (xlen==ylen)
51 // gleiche Länge -> digitweise vergleichen
52 return compare_loop_msp(BN_MSDptr(x),BN_MSDptr(y),xlen) == 0;
53 else
54 return false;
55 }
56 }
57
58 } // namespace cln
59