diff --git a/include/polyxx/polynomial.h b/include/polyxx/polynomial.h index fd4f8e6..f142c8d 100644 --- a/include/polyxx/polynomial.h +++ b/include/polyxx/polynomial.h @@ -56,12 +56,12 @@ namespace poly { /** Copy from a Polynomial. */ Polynomial(const Polynomial& p); /** Move from a Polynomial. */ - Polynomial(Polynomial&& p); + Polynomial(Polynomial&& p) noexcept; /** Copy from a Polynomial. */ Polynomial& operator=(const Polynomial& p); /** Move from a Polynomial. */ - Polynomial& operator=(Polynomial&& p); + Polynomial& operator=(Polynomial&& p) noexcept; /** Get a non-const pointer to the internal lp_polynomial_t. Handle with * care! diff --git a/src/polyxx/polynomial.cpp b/src/polyxx/polynomial.cpp index 87f33fd..3176e86 100644 --- a/src/polyxx/polynomial.cpp +++ b/src/polyxx/polynomial.cpp @@ -5,6 +5,7 @@ #include "variable_list.h" #include +#include namespace poly { @@ -58,15 +59,15 @@ namespace poly { Polynomial::Polynomial(const Polynomial& p) : mPoly(lp_polynomial_new_copy(p.get_internal()), polynomial_deleter) {} - Polynomial::Polynomial(Polynomial&& p) - : mPoly(lp_polynomial_new_copy(p.get_internal()), polynomial_deleter) {} + Polynomial::Polynomial(Polynomial&& p) noexcept + : mPoly(std::move(p.mPoly)) {} Polynomial& Polynomial::operator=(const Polynomial& p) { mPoly.reset(lp_polynomial_new_copy(p.get_internal())); return *this; } - Polynomial& Polynomial::operator=(Polynomial&& p) { - mPoly.reset(p.release()); + Polynomial& Polynomial::operator=(Polynomial&& p) noexcept { + mPoly = std::move(p.mPoly); return *this; } diff --git a/test/polyxx/test_polynomial.cpp b/test/polyxx/test_polynomial.cpp index 7360d42..b116f44 100644 --- a/test/polyxx/test_polynomial.cpp +++ b/test/polyxx/test_polynomial.cpp @@ -81,3 +81,22 @@ TEST_CASE("polynomial::operator<<") { out << p; CHECK(out.str() == "1*x^6 + 2*x^5 + (3*y - 1)"); } + +TEST_CASE("polynomial::constructor") { + Variable y("y"); + Variable x("x"); + Polynomial p = 1 * pow(x, 6) + 2 * pow(x, 5) + 3 * y - 1; + lp_polynomial_t* ptr = p.get_internal(); + + Polynomial p_cp(p); + Polynomial p_mv(std::move(p)); + CHECK(ptr == p_mv.get_internal()); + CHECK(ptr != p_cp.get_internal()); + CHECK(p_cp == p_mv); + + Polynomial p_mv_a, p_cp_a; + p_cp_a = p_cp; + p_mv_a = std::move(p_mv); + CHECK(p_cp == p_cp_a); + CHECK(ptr == p_mv_a.get_internal()); +}