Default Initialize ExpressionRef to Zero The default constructor of ExpressionRef now creates a compile time constant zero assignment. This patch is required, because a reason change in Jet assumes default 0 initialization. Change-Id: I8185cef587c17ab828896bce1e768170f8229d4e
diff --git a/include/ceres/codegen/internal/expression_ref.h b/include/ceres/codegen/internal/expression_ref.h index d73d477..5499930 100644 --- a/include/ceres/codegen/internal/expression_ref.h +++ b/include/ceres/codegen/internal/expression_ref.h
@@ -46,7 +46,7 @@ // // ExpressionRef should be passed by value. struct ExpressionRef { - ExpressionRef() = default; + ExpressionRef() : ExpressionRef(0.0) {} // Create a compile time constant expression directly from a double value. // This is important so that we can write T(3.14) in our code and @@ -57,6 +57,10 @@ // must work for T = Jet<ExpressionRef>. ExpressionRef(double compile_time_constant); + // Adds the expression to the active graph and initializes this ExpressionRef + // accordingly. + ExpressionRef(const Expression& expression); + // By adding this deleted constructor we can detect invalid usage of // ExpressionRef. ExpressionRef must only be created from constexpr doubles. // @@ -97,8 +101,6 @@ // The index into the ExpressionGraph data array. ExpressionId id = kInvalidExpressionId; - - static ExpressionRef Create(ExpressionId id); }; // A helper function which calls 'InsertBack' on the currently active graph.
diff --git a/internal/ceres/codegen/code_generator_test.cc b/internal/ceres/codegen/code_generator_test.cc index 8b4aafc..f799a75 100644 --- a/internal/ceres/codegen/code_generator_test.cc +++ b/internal/ceres/codegen/code_generator_test.cc
@@ -46,7 +46,7 @@ auto code = gen.Generate(); EXPECT_EQ(code.size(), reference.size()); - for (int i = 0; i < code.size(); ++i) { + for (int i = 0; i < std::min(code.size(), reference.size()); ++i) { EXPECT_EQ(code[i], reference[i]) << "Invalid Line: " << (i + 1); } } @@ -69,7 +69,7 @@ T d = T(std::numeric_limits<double>::infinity()); T e = T(-std::numeric_limits<double>::infinity()); T f = T(std::numeric_limits<double>::quiet_NaN()); - T g; // Uninitialized variables should not generate code! + T g; // Uninitialized variables are 0 initialized. auto graph = StopRecordingExpressions(); std::vector<std::string> expected_code = { "{", @@ -79,12 +79,14 @@ " double v_3;", " double v_4;", " double v_5;", + " double v_6;", " v_0 = 0;", " v_1 = 123.5;", " v_2 = 2;", " v_3 = std::numeric_limits<double>::infinity();", " v_4 = -std::numeric_limits<double>::infinity();", " v_5 = std::numeric_limits<double>::quiet_NaN();", + " v_6 = 0;", "}"}; GenerateAndCheck(graph, expected_code); }
diff --git a/internal/ceres/codegen/expression_ref.cc b/internal/ceres/codegen/expression_ref.cc index 883d4ea..369aec4 100644 --- a/internal/ceres/codegen/expression_ref.cc +++ b/internal/ceres/codegen/expression_ref.cc
@@ -37,23 +37,19 @@ namespace internal { ExpressionRef AddExpressionToGraph(const Expression& expression) { + return ExpressionRef(expression); +} + +ExpressionRef::ExpressionRef(double compile_time_constant) + : ExpressionRef( + Expression::CreateCompileTimeConstant(compile_time_constant)) {} + +ExpressionRef::ExpressionRef(const Expression& expression) { ExpressionGraph* graph = GetCurrentExpressionGraph(); CHECK(graph) << "The ExpressionGraph has to be created before using Expressions. This " "is achieved by calling ceres::StartRecordingExpressions."; - return ExpressionRef::Create(graph->InsertBack(expression)); -} - -ExpressionRef ExpressionRef::Create(ExpressionId id) { - ExpressionRef ref; - ref.id = id; - return ref; -} - -ExpressionRef::ExpressionRef(double compile_time_constant) { - id = AddExpressionToGraph( - Expression::CreateCompileTimeConstant(compile_time_constant)) - .id; + id = graph->InsertBack(expression); } ExpressionRef::ExpressionRef(const ExpressionRef& other) { *this = other; }
diff --git a/internal/ceres/codegen/expression_ref_test.cc b/internal/ceres/codegen/expression_ref_test.cc index 280043b..c9a118b 100644 --- a/internal/ceres/codegen/expression_ref_test.cc +++ b/internal/ceres/codegen/expression_ref_test.cc
@@ -48,13 +48,14 @@ T a = T(0); T b = T(123.5); T c = T(1 + 1); - T d; // Uninitialized variables should not generate code! + T d; // Uninitialized variables are also compile time constants auto graph = StopRecordingExpressions(); ExpressionGraph reference; reference.InsertBack(Expression::CreateCompileTimeConstant(0)); reference.InsertBack(Expression::CreateCompileTimeConstant(123.5)); reference.InsertBack(Expression::CreateCompileTimeConstant(2)); + reference.InsertBack(Expression::CreateCompileTimeConstant(0)); EXPECT_EQ(reference, graph); }