Skip to content

Commit adb1094

Browse files
authored
Fixed move constructor and assignment of Polynomial (#102)
Co-authored-by: Thomas Hader <[email protected]>
1 parent ac1c13e commit adb1094

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

include/polyxx/polynomial.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ namespace poly {
5757
/** Copy from a Polynomial. */
5858
Polynomial(const Polynomial& p);
5959
/** Move from a Polynomial. */
60-
Polynomial(Polynomial&& p);
60+
Polynomial(Polynomial&& p) noexcept;
6161

6262
/** Copy from a Polynomial. */
6363
Polynomial& operator=(const Polynomial& p);
6464
/** Move from a Polynomial. */
65-
Polynomial& operator=(Polynomial&& p);
65+
Polynomial& operator=(Polynomial&& p) noexcept;
6666

6767
/** Get a non-const pointer to the internal lp_polynomial_t. Handle with
6868
* care!

src/polyxx/polynomial.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "variable_list.h"
66

77
#include <cassert>
8+
#include <utility>
89

910
namespace poly {
1011

@@ -68,15 +69,15 @@ namespace poly {
6869

6970
Polynomial::Polynomial(const Polynomial& p)
7071
: mPoly(lp_polynomial_new_copy(p.get_internal()), polynomial_deleter) {}
71-
Polynomial::Polynomial(Polynomial&& p)
72-
: mPoly(lp_polynomial_new_copy(p.get_internal()), polynomial_deleter) {}
72+
Polynomial::Polynomial(Polynomial&& p) noexcept
73+
: mPoly(std::move(p.mPoly)) {}
7374

7475
Polynomial& Polynomial::operator=(const Polynomial& p) {
7576
mPoly.reset(lp_polynomial_new_copy(p.get_internal()));
7677
return *this;
7778
}
78-
Polynomial& Polynomial::operator=(Polynomial&& p) {
79-
mPoly.reset(p.release());
79+
Polynomial& Polynomial::operator=(Polynomial&& p) noexcept {
80+
mPoly = std::move(p.mPoly);
8081
return *this;
8182
}
8283

test/polyxx/test_polynomial.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,22 @@ TEST_CASE("polynomial::operator<<") {
8181
out << p;
8282
CHECK(out.str() == "1*x^6 + 2*x^5 + (3*y - 1)");
8383
}
84+
85+
TEST_CASE("polynomial::constructor") {
86+
Variable y("y");
87+
Variable x("x");
88+
Polynomial p = 1 * pow(x, 6) + 2 * pow(x, 5) + 3 * y - 1;
89+
lp_polynomial_t* ptr = p.get_internal();
90+
91+
Polynomial p_cp(p);
92+
Polynomial p_mv(std::move(p));
93+
CHECK(ptr == p_mv.get_internal());
94+
CHECK(ptr != p_cp.get_internal());
95+
CHECK(p_cp == p_mv);
96+
97+
Polynomial p_mv_a, p_cp_a;
98+
p_cp_a = p_cp;
99+
p_mv_a = std::move(p_mv);
100+
CHECK(p_cp == p_cp_a);
101+
CHECK(ptr == p_mv_a.get_internal());
102+
}

0 commit comments

Comments
 (0)