2020#include < complex>
2121#include < iterator>
2222#include < optional>
23+ #include < utility>
2324#include < vector>
2425
2526namespace Eigen {
@@ -74,14 +75,17 @@ class complex_matrix {
7475
7576 complex_matrix (const complex_matrix &other)
7677 : dimensions{other.dimensions },
77- data{new value_type[get_size (other.dimensions )]},
78+ data{get_size (other.dimensions )
79+ ? new value_type[get_size (other.dimensions )]
80+ : nullptr },
7881 internal_order (other.internal_order) {
79- std::copy (other.data , other.data + get_size (dimensions), data);
82+ if (data)
83+ std::copy (other.data , other.data + get_size (dimensions), data);
8084 }
8185
8286 complex_matrix (const complex_matrix &other, order order);
8387
84- complex_matrix (complex_matrix &&other)
88+ complex_matrix (complex_matrix &&other) noexcept
8589 : dimensions{other.dimensions }, data{other.data },
8690 internal_order (other.internal_order) {
8791 other.data = nullptr ;
@@ -96,18 +100,14 @@ class complex_matrix {
96100 }
97101
98102 complex_matrix &operator =(const complex_matrix &other) {
99- dimensions = other.dimensions ;
100- data = new value_type[get_size (other.dimensions )];
101- std::copy (other.data , other.data + get_size (dimensions), data);
102- internal_order = other.internal_order ;
103+ complex_matrix copy (other);
104+ swap (copy);
103105 return *this ;
104106 }
105107
106- complex_matrix &operator =(complex_matrix &&other) {
107- dimensions = other.dimensions ;
108- data = other.data ;
109- other.data = nullptr ;
110- internal_order = other.internal_order ;
108+ complex_matrix &operator =(complex_matrix &&other) noexcept {
109+ complex_matrix moved (std::move (other));
110+ swap (moved);
111111 return *this ;
112112 }
113113
@@ -232,6 +232,13 @@ class complex_matrix {
232232
233233 static void check_size (std::size_t size, const Dimensions &dim);
234234
235+ void swap (complex_matrix &other) noexcept {
236+ using std::swap;
237+ swap (dimensions, other.dimensions );
238+ swap (data, other.data );
239+ swap (internal_order, other.internal_order );
240+ }
241+
235242 void swap (complex_matrix::value_type *new_data) {
236243 if (data)
237244 delete[] data;
0 commit comments