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);