TripletSparseMatrix: guard against self-assignment Change-Id: I63159b32d0462fe784019f17242cf4a9f05b2825
diff --git a/internal/ceres/triplet_sparse_matrix.cc b/internal/ceres/triplet_sparse_matrix.cc index 15b9674..54b588b 100644 --- a/internal/ceres/triplet_sparse_matrix.cc +++ b/internal/ceres/triplet_sparse_matrix.cc
@@ -97,6 +97,9 @@ TripletSparseMatrix& TripletSparseMatrix::operator=( const TripletSparseMatrix& rhs) { + if (this == &rhs) { + return *this; + } num_rows_ = rhs.num_rows_; num_cols_ = rhs.num_cols_; num_nonzeros_ = rhs.num_nonzeros_;
diff --git a/internal/ceres/triplet_sparse_matrix_test.cc b/internal/ceres/triplet_sparse_matrix_test.cc index d71df7b..881fabc 100644 --- a/internal/ceres/triplet_sparse_matrix_test.cc +++ b/internal/ceres/triplet_sparse_matrix_test.cc
@@ -172,6 +172,35 @@ EXPECT_DOUBLE_EQ(cpy.values()[1], 5.2); } +TEST(TripletSparseMatrix, AssignmentOperatorSelfAssignment) { + TripletSparseMatrix orig(2, 5, 4); + orig.mutable_rows()[0] = 0; + orig.mutable_cols()[0] = 1; + orig.mutable_values()[0] = 2.5; + + orig.mutable_rows()[1] = 1; + orig.mutable_cols()[1] = 4; + orig.mutable_values()[1] = 5.2; + orig.set_num_nonzeros(2); + + // Who's on earth gonna do this? + orig = orig; + + EXPECT_EQ(orig.num_rows(), 2); + EXPECT_EQ(orig.num_cols(), 5); + ASSERT_EQ(orig.num_nonzeros(), 2); + EXPECT_EQ(orig.max_num_nonzeros(), 4); + + EXPECT_EQ(orig.rows()[0], 0); + EXPECT_EQ(orig.rows()[1], 1); + + EXPECT_EQ(orig.cols()[0], 1); + EXPECT_EQ(orig.cols()[1], 4); + + EXPECT_DOUBLE_EQ(orig.values()[0], 2.5); + EXPECT_DOUBLE_EQ(orig.values()[1], 5.2); +} + TEST(TripletSparseMatrix, AppendRows) { // Build one matrix. TripletSparseMatrix m(2, 5, 4);