@@ -84,6 +84,7 @@ class mpz {
84
84
#else
85
85
typedef mpz_t mpz_type;
86
86
#endif
87
+ protected:
87
88
int m_val;
88
89
unsigned m_kind:1 ;
89
90
unsigned m_owner:1 ;
@@ -116,6 +117,17 @@ class mpz {
116
117
unsigned o = m_owner; m_owner = other.m_owner ; other.m_owner = o;
117
118
unsigned k = m_kind; m_kind = other.m_kind ; other.m_kind = k;
118
119
}
120
+
121
+ void set (int v) {
122
+ m_val = v;
123
+ m_kind = mpz_small;
124
+ }
125
+
126
+ inline bool is_small () const { return m_kind == mpz_small; }
127
+
128
+ inline int value () const { SASSERT (is_small ()); return m_val; }
129
+
130
+ inline int sign () const { SASSERT (!is_small ()); return m_val; }
119
131
};
120
132
121
133
#ifndef _MP_GMP
@@ -242,14 +254,13 @@ class mpz_manager {
242
254
mpz m_two64;
243
255
244
256
245
- static int64_t i64 (mpz const & a) { return static_cast <int64_t >(a.m_val ); }
257
+ static int64_t i64 (mpz const & a) { return static_cast <int64_t >(a.value () ); }
246
258
247
259
void set_big_i64 (mpz & c, int64_t v);
248
260
249
261
void set_i64 (mpz & c, int64_t v) {
250
262
if (v >= INT_MIN && v <= INT_MAX) {
251
- c.m_val = static_cast <int >(v);
252
- c.m_kind = mpz_small;
263
+ c.set (static_cast <int >(v));
253
264
}
254
265
else {
255
266
set_big_i64 (c, v);
@@ -306,25 +317,25 @@ class mpz_manager {
306
317
307
318
void get_sign_cell (mpz const & a, int & sign, mpz_cell * & cell, mpz_cell* reserve) {
308
319
if (is_small (a)) {
309
- if (a.m_val == INT_MIN) {
320
+ if (a.value () == INT_MIN) {
310
321
sign = -1 ;
311
322
cell = m_int_min.m_ptr ;
312
323
}
313
324
else {
314
325
cell = reserve;
315
326
cell->m_size = 1 ;
316
- if (a.m_val < 0 ) {
327
+ if (a.value () < 0 ) {
317
328
sign = -1 ;
318
- cell->m_digits [0 ] = -a.m_val ;
329
+ cell->m_digits [0 ] = -a.value () ;
319
330
}
320
331
else {
321
332
sign = 1 ;
322
- cell->m_digits [0 ] = a.m_val ;
333
+ cell->m_digits [0 ] = a.value () ;
323
334
}
324
335
}
325
336
}
326
337
else {
327
- sign = a.m_val ;
338
+ sign = a.sign () ;
328
339
cell = a.m_ptr ;
329
340
}
330
341
}
@@ -398,7 +409,7 @@ class mpz_manager {
398
409
399
410
~mpz_manager ();
400
411
401
- static bool is_small (mpz const & a) { return a.m_kind == mpz_small ; }
412
+ static bool is_small (mpz const & a) { return a.is_small () ; }
402
413
403
414
static mpz mk_z (int val) { return mpz (val); }
404
415
@@ -461,7 +472,7 @@ class mpz_manager {
461
472
462
473
bool eq (mpz const & a, mpz const & b) {
463
474
if (is_small (a) && is_small (b)) {
464
- return a.m_val == b.m_val ;
475
+ return a.value () == b.value () ;
465
476
}
466
477
else {
467
478
return big_compare (a, b) == 0 ;
@@ -470,7 +481,7 @@ class mpz_manager {
470
481
471
482
bool lt (mpz const & a, int b) {
472
483
if (is_small (a)) {
473
- return a.m_val < b;
484
+ return a.value () < b;
474
485
}
475
486
else {
476
487
return lt (a, mpz (b));
@@ -479,7 +490,7 @@ class mpz_manager {
479
490
480
491
bool lt (mpz const & a, mpz const & b) {
481
492
if (is_small (a) && is_small (b)) {
482
- return a.m_val < b.m_val ;
493
+ return a.value () < b.value () ;
483
494
}
484
495
else {
485
496
return big_compare (a, b) < 0 ;
@@ -526,17 +537,15 @@ class mpz_manager {
526
537
527
538
void set (mpz & target, mpz const & source) {
528
539
if (is_small (source)) {
529
- target.m_val = source.m_val ;
530
- target.m_kind = mpz_small;
540
+ target.set (source.value ());
531
541
}
532
542
else {
533
543
big_set (target, source);
534
544
}
535
545
}
536
546
537
547
void set (mpz & a, int val) {
538
- a.m_val = val;
539
- a.m_kind = mpz_small;
548
+ a.set (val);
540
549
}
541
550
542
551
void set (mpz & a, unsigned val) {
@@ -554,8 +563,7 @@ class mpz_manager {
554
563
555
564
void set (mpz & a, uint64_t val) {
556
565
if (val < INT_MAX) {
557
- a.m_val = static_cast <int >(val);
558
- a.m_kind = mpz_small;
566
+ a.set (static_cast <int >(val));
559
567
}
560
568
else {
561
569
set_big_ui64 (a, val);
@@ -574,10 +582,7 @@ class mpz_manager {
574
582
void reset (mpz & a);
575
583
576
584
void swap (mpz & a, mpz & b) noexcept {
577
- std::swap (a.m_val , b.m_val );
578
- std::swap (a.m_ptr , b.m_ptr );
579
- auto o = a.m_owner ; a.m_owner = b.m_owner ; b.m_owner = o;
580
- auto k = a.m_kind ; a.m_kind = b.m_kind ; b.m_kind = k;
585
+ a.swap (b);
581
586
}
582
587
583
588
bool is_uint64 (mpz const & a) const ;
@@ -624,20 +629,20 @@ class mpz_manager {
624
629
625
630
static bool is_one (mpz const & a) {
626
631
#ifndef _MP_GMP
627
- return is_small (a) && a.m_val == 1 ;
632
+ return is_small (a) && a.value () == 1 ;
628
633
#else
629
634
if (is_small (a))
630
- return a.m_val == 1 ;
635
+ return a.value () == 1 ;
631
636
return mpz_cmp_si (*a.m_ptr , 1 ) == 0 ;
632
637
#endif
633
638
}
634
639
635
640
static bool is_minus_one (mpz const & a) {
636
641
#ifndef _MP_GMP
637
- return is_small (a) && a.m_val == -1 ;
642
+ return is_small (a) && a.value () == -1 ;
638
643
#else
639
644
if (is_small (a))
640
- return a.m_val == -1 ;
645
+ return a.value () == -1 ;
641
646
return mpz_cmp_si (*a.m_ptr , -1 ) == 0 ;
642
647
#endif
643
648
}
@@ -712,7 +717,7 @@ class mpz_manager {
712
717
713
718
bool is_even (mpz const & a) {
714
719
if (is_small (a))
715
- return !(a.m_val & 0x1 );
720
+ return !(a.value () & 0x1 );
716
721
#ifndef _MP_GMP
717
722
return !(0x1 & digits (a)[0 ]);
718
723
#else
0 commit comments