@@ -28,90 +28,100 @@ THE SOFTWARE.
2828#include < memory>
2929#include < cstdlib>
3030
31+ struct AutoPoly {
32+ ~AutoPoly () { fmpq_mpoly_ctx_clear (ctx); }
33+ AutoPoly (int nvars) {
34+ fmpq_mpoly_ctx_init (ctx, nvars, ORD_DEGREVLEX);
35+ }
36+ fmpq_mpoly_ctx_t ctx;
37+ };
38+
3139class FPoly : public CMSat ::Field {
3240public:
3341 fmpq_mpoly_t val;
34- std::shared_ptr<fmpq_mpoly_ctx_t > ctx;
42+ std::shared_ptr<AutoPoly > ctx;
3543
3644 ~FPoly () override {
37- fmpq_mpoly_clear (val, ctx. get () );
45+ fmpq_mpoly_clear (val, ctx-> ctx );
3846 }
3947
4048 FPoly (const fmpq_mpoly_t & v,
41- const std::shared_ptr<fmpq_mpoly_ctx_t >& c): ctx(c) {
42- fmpq_mpoly_init (val, ctx.get ());
43- fmpq_mpoly_set (val, v, ctx.get ());
49+ const std::shared_ptr<AutoPoly>& c): ctx(c) {
50+ memcpy (val, v, sizeof (fmpq_mpoly_t ));
4451 }
4552
4653 FPoly (const FPoly& other): ctx(other.ctx) {
4754 ctx = other.ctx ;
48- fmpq_mpoly_init (val, ctx. get () );
49- fmpq_mpoly_set (val, other.val , ctx. get () );
55+ fmpq_mpoly_init (val, ctx-> ctx );
56+ fmpq_mpoly_set (val, other.val , ctx-> ctx );
5057 }
5158 const auto & get_val () const { return val; }
5259
5360 Field& operator =(const Field& other) override {
5461 const auto & od = dynamic_cast <const FPoly&>(other);
55- fmpq_mpoly_set (val, od.val , ctx. get () );
62+ fmpq_mpoly_set (val, od.val , ctx-> ctx );
5663 return *this ;
5764 }
5865
5966 Field& operator +=(const Field& other) override {
6067 const auto & od = dynamic_cast <const FPoly&>(other);
61- fmpq_mpoly_add (val, val, od.val , ctx. get () );
68+ fmpq_mpoly_add (val, val, od.val , ctx-> ctx );
6269 return *this ;
6370 }
6471
6572 std::unique_ptr<Field> add (const Field& other) override {
6673 const auto & od = dynamic_cast <const FPoly&>(other);
6774 fmpq_mpoly_t v;
68- fmpq_mpoly_init (v, ctx. get () );
69- fmpq_mpoly_add (v, val, od.val , ctx. get () );
75+ fmpq_mpoly_init (v, ctx-> ctx );
76+ fmpq_mpoly_add (v, val, od.val , ctx-> ctx );
7077 return std::make_unique<FPoly>(v, ctx);
7178 }
7279
7380 Field& operator -=(const Field& other) override {
7481 const auto & od = dynamic_cast <const FPoly&>(other);
75- fmpq_mpoly_sub (val, val, od.val , ctx. get () );
82+ fmpq_mpoly_sub (val, val, od.val , ctx-> ctx );
7683 return *this ;
7784 }
7885
7986 Field& operator *=(const Field& other) override {
8087 const auto & od = dynamic_cast <const FPoly&>(other);
81- fmpq_mpoly_mul (val, val, od.val , ctx. get () );
88+ fmpq_mpoly_mul (val, val, od.val , ctx-> ctx );
8289 return *this ;
8390 }
8491
8592 Field& operator /=(const Field& other) override {
8693 const auto & od = dynamic_cast <const FPoly&>(other);
87- fmpq_mpoly_div (val, val, od.val , ctx. get () );
94+ fmpq_mpoly_div (val, val, od.val , ctx-> ctx );
8895 return *this ;
8996 }
9097
9198 bool operator ==(const Field& other) const override {
9299 const auto & od = dynamic_cast <const FPoly&>(other);
93- return fmpq_mpoly_equal (val, od.val , ctx. get () );
100+ return fmpq_mpoly_equal (val, od.val , ctx-> ctx );
94101 }
95102
96103 std::ostream& display (std::ostream& os) const override {
97104 auto varnames = nvars_names ();
98- char * str = fmpq_mpoly_get_str_pretty (val, (const char **)varnames, ctx. get () );
105+ char * str = fmpq_mpoly_get_str_pretty (val, (const char **)varnames, ctx-> ctx );
99106 os << str;
100107 free (str);
101108 del_nvars_names (varnames);
102109 return os;
103110 }
104111
105112 std::unique_ptr<Field> dup () const override {
106- return std::make_unique<FPoly>(val, ctx);
113+ fmpq_mpoly_t v;
114+ fmpq_mpoly_init (v, ctx->ctx );
115+ fmpq_mpoly_set (v, val, ctx->ctx );
116+ return std::make_unique<FPoly>(v, ctx);
107117 }
108118
109119 bool is_zero () const override {
110- return fmpq_mpoly_is_zero (val, ctx. get () );
120+ return fmpq_mpoly_is_zero (val, ctx-> ctx );
111121 }
112122
113123 bool is_one () const override {
114- return fmpq_mpoly_is_one (val, ctx. get () );
124+ return fmpq_mpoly_is_one (val, ctx-> ctx );
115125 }
116126
117127 std::string rem_trail_space (const std::string& str) {
@@ -121,12 +131,12 @@ class FPoly : public CMSat::Field {
121131 }
122132
123133 void del_nvars_names (char ** names) const {
124- uint32_t nvars = fmpq_mpoly_ctx_nvars (ctx. get () );
134+ uint32_t nvars = fmpq_mpoly_ctx_nvars (ctx-> ctx );
125135 for (uint32_t i = 0 ; i < nvars; i++) delete[] names[i];
126136 delete[] names;
127137 }
128138 char ** nvars_names () const {
129- uint32_t nvars = fmpq_mpoly_ctx_nvars (ctx. get () );
139+ uint32_t nvars = fmpq_mpoly_ctx_nvars (ctx-> ctx );
130140 char ** vars = new char *[nvars];
131141 for (uint32_t i = 0 ; i < nvars; i++) {
132142 std::string x = " x" ;
@@ -148,7 +158,7 @@ class FPoly : public CMSat::Field {
148158 }
149159 str2.pop_back ();
150160 auto varnames = nvars_names ();
151- auto ret = fmpq_mpoly_set_str_pretty (val, str2.c_str (), (const char **)varnames, ctx. get () );
161+ auto ret = fmpq_mpoly_set_str_pretty (val, str2.c_str (), (const char **)varnames, ctx-> ctx );
152162 del_nvars_names (varnames);
153163 if (ret == -1 ) {
154164 std::cerr << " Error parsing polynomial on line " << line_no
@@ -159,10 +169,10 @@ class FPoly : public CMSat::Field {
159169 }
160170
161171 void set_zero () override {
162- fmpq_mpoly_zero (val, ctx. get () );
172+ fmpq_mpoly_zero (val, ctx-> ctx );
163173 }
164174 void set_one () override {
165- fmpq_mpoly_one (val, ctx. get () );
175+ fmpq_mpoly_one (val, ctx-> ctx );
166176 }
167177
168178 uint64_t bytes_used () const override {
@@ -172,25 +182,20 @@ class FPoly : public CMSat::Field {
172182
173183class FGenPoly : public CMSat ::FieldGen {
174184public:
175- std::shared_ptr<fmpq_mpoly_ctx_t > ctx;
185+ std::shared_ptr<AutoPoly > ctx;
176186
177- FGenPoly (int nvars) {
178- ctx = std::make_shared<fmpq_mpoly_ctx_t >();
179- fmpq_mpoly_ctx_init (ctx.get (), nvars, ORD_DEGREVLEX);
180- }
181- FGenPoly (const FGenPoly& other) = default ;
182- ~FGenPoly () override = default ;
187+ FGenPoly (int nvars) : ctx(std::make_shared<AutoPoly>(nvars)) {}
183188
184189 std::unique_ptr<CMSat::Field> zero () const override {
185190 fmpq_mpoly_t val;
186- fmpq_mpoly_init (val, ctx. get () );
191+ fmpq_mpoly_init (val, ctx-> ctx );
187192 return std::make_unique<FPoly>(val, ctx);
188193 }
189194
190195 std::unique_ptr<CMSat::Field> one () const override {
191196 fmpq_mpoly_t val;
192- fmpq_mpoly_init (val, ctx. get () );
193- fmpq_mpoly_one (val, ctx. get () );
197+ fmpq_mpoly_init (val, ctx-> ctx );
198+ fmpq_mpoly_one (val, ctx-> ctx );
194199 return std::make_unique<FPoly>(val, ctx);
195200 }
196201
0 commit comments