Bug fix for reversing OrderedGroups. Reverse() method now handles the case where no groups exist. Change-Id: Ia1ef08aa3cde01ceb71285b605a2e1f882c3b620
diff --git a/include/ceres/ordered_groups.h b/include/ceres/ordered_groups.h index 74a3995..aa1bd3a 100644 --- a/include/ceres/ordered_groups.h +++ b/include/ceres/ordered_groups.h
@@ -122,6 +122,10 @@ // Reverse the order of the groups in place. void Reverse() { + if (NumGroups() == 0) { + return; + } + typename std::map<int, std::set<T> >::reverse_iterator it = group_to_elements_.rbegin(); std::map<int, std::set<T> > new_group_to_elements;
diff --git a/internal/ceres/ordered_groups_test.cc b/internal/ceres/ordered_groups_test.cc index 5c2e3ec..4510686 100644 --- a/internal/ceres/ordered_groups_test.cc +++ b/internal/ceres/ordered_groups_test.cc
@@ -159,6 +159,20 @@ EXPECT_EQ(ordering.GroupId(x + 2), 2); } +TEST(OrderedGroups, ReverseOrderingWithEmptyOrderedGroups) { + ParameterBlockOrdering ordering; + // This should be a no-op. + ordering.Reverse(); + + // Ensure the properties of an empty OrderedGroups still hold after Reverse(). + EXPECT_EQ(ordering.NumGroups(), 0); + EXPECT_EQ(ordering.NumElements(), 0); + EXPECT_EQ(ordering.GroupSize(1), 0); + double x; + EXPECT_EQ(ordering.GroupId(&x), -1); + EXPECT_FALSE(ordering.Remove(&x)); +} + TEST(OrderedGroups, BulkRemove) { ParameterBlockOrdering ordering; double x[3];