Skip to content

Commit a2993f7

Browse files
encapsulate mpz a bit more
1 parent d2706ba commit a2993f7

File tree

2 files changed

+33
-28
lines changed

2 files changed

+33
-28
lines changed

src/util/mpq.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class mpq_manager : public mpz_manager<SYNCH> {
4747

4848
void reset_denominator(mpq & a) {
4949
del(a.m_den);
50-
a.m_den.m_val = 1;
50+
a.m_den.set(1);
5151
}
5252

5353
void normalize(mpq & a) {

src/util/mpz.h

+32-27
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class mpz {
8484
#else
8585
typedef mpz_t mpz_type;
8686
#endif
87+
protected:
8788
int m_val;
8889
unsigned m_kind:1;
8990
unsigned m_owner:1;
@@ -116,6 +117,17 @@ class mpz {
116117
unsigned o = m_owner; m_owner = other.m_owner; other.m_owner = o;
117118
unsigned k = m_kind; m_kind = other.m_kind; other.m_kind = k;
118119
}
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; }
119131
};
120132

121133
#ifndef _MP_GMP
@@ -242,14 +254,13 @@ class mpz_manager {
242254
mpz m_two64;
243255

244256

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()); }
246258

247259
void set_big_i64(mpz & c, int64_t v);
248260

249261
void set_i64(mpz & c, int64_t v) {
250262
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));
253264
}
254265
else {
255266
set_big_i64(c, v);
@@ -306,25 +317,25 @@ class mpz_manager {
306317

307318
void get_sign_cell(mpz const & a, int & sign, mpz_cell * & cell, mpz_cell* reserve) {
308319
if (is_small(a)) {
309-
if (a.m_val == INT_MIN) {
320+
if (a.value() == INT_MIN) {
310321
sign = -1;
311322
cell = m_int_min.m_ptr;
312323
}
313324
else {
314325
cell = reserve;
315326
cell->m_size = 1;
316-
if (a.m_val < 0) {
327+
if (a.value() < 0) {
317328
sign = -1;
318-
cell->m_digits[0] = -a.m_val;
329+
cell->m_digits[0] = -a.value();
319330
}
320331
else {
321332
sign = 1;
322-
cell->m_digits[0] = a.m_val;
333+
cell->m_digits[0] = a.value();
323334
}
324335
}
325336
}
326337
else {
327-
sign = a.m_val;
338+
sign = a.sign();
328339
cell = a.m_ptr;
329340
}
330341
}
@@ -398,7 +409,7 @@ class mpz_manager {
398409

399410
~mpz_manager();
400411

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(); }
402413

403414
static mpz mk_z(int val) { return mpz(val); }
404415

@@ -461,7 +472,7 @@ class mpz_manager {
461472

462473
bool eq(mpz const & a, mpz const & b) {
463474
if (is_small(a) && is_small(b)) {
464-
return a.m_val == b.m_val;
475+
return a.value() == b.value();
465476
}
466477
else {
467478
return big_compare(a, b) == 0;
@@ -470,7 +481,7 @@ class mpz_manager {
470481

471482
bool lt(mpz const& a, int b) {
472483
if (is_small(a)) {
473-
return a.m_val < b;
484+
return a.value() < b;
474485
}
475486
else {
476487
return lt(a, mpz(b));
@@ -479,7 +490,7 @@ class mpz_manager {
479490

480491
bool lt(mpz const & a, mpz const & b) {
481492
if (is_small(a) && is_small(b)) {
482-
return a.m_val < b.m_val;
493+
return a.value() < b.value();
483494
}
484495
else {
485496
return big_compare(a, b) < 0;
@@ -526,17 +537,15 @@ class mpz_manager {
526537

527538
void set(mpz & target, mpz const & source) {
528539
if (is_small(source)) {
529-
target.m_val = source.m_val;
530-
target.m_kind = mpz_small;
540+
target.set(source.value());
531541
}
532542
else {
533543
big_set(target, source);
534544
}
535545
}
536546

537547
void set(mpz & a, int val) {
538-
a.m_val = val;
539-
a.m_kind = mpz_small;
548+
a.set(val);
540549
}
541550

542551
void set(mpz & a, unsigned val) {
@@ -554,8 +563,7 @@ class mpz_manager {
554563

555564
void set(mpz & a, uint64_t val) {
556565
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));
559567
}
560568
else {
561569
set_big_ui64(a, val);
@@ -574,10 +582,7 @@ class mpz_manager {
574582
void reset(mpz & a);
575583

576584
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);
581586
}
582587

583588
bool is_uint64(mpz const & a) const;
@@ -624,20 +629,20 @@ class mpz_manager {
624629

625630
static bool is_one(mpz const & a) {
626631
#ifndef _MP_GMP
627-
return is_small(a) && a.m_val == 1;
632+
return is_small(a) && a.value() == 1;
628633
#else
629634
if (is_small(a))
630-
return a.m_val == 1;
635+
return a.value() == 1;
631636
return mpz_cmp_si(*a.m_ptr, 1) == 0;
632637
#endif
633638
}
634639

635640
static bool is_minus_one(mpz const & a) {
636641
#ifndef _MP_GMP
637-
return is_small(a) && a.m_val == -1;
642+
return is_small(a) && a.value() == -1;
638643
#else
639644
if (is_small(a))
640-
return a.m_val == -1;
645+
return a.value() == -1;
641646
return mpz_cmp_si(*a.m_ptr, -1) == 0;
642647
#endif
643648
}
@@ -712,7 +717,7 @@ class mpz_manager {
712717

713718
bool is_even(mpz const & a) {
714719
if (is_small(a))
715-
return !(a.m_val & 0x1);
720+
return !(a.value() & 0x1);
716721
#ifndef _MP_GMP
717722
return !(0x1 & digits(a)[0]);
718723
#else

0 commit comments

Comments
 (0)