Pass ExpressionRef by const reference instead of by value Currently there is a bug in the copy constructor of ExpressionRef. Fixing this bug, will create new expressions each time a copy is executed. To reduce the amount of copy expression we pass ExpressionRef by const reference now. Change-Id: I0f81fb3d08aa4c66b9191f3138650f17023af67e
diff --git a/include/ceres/internal/expression_ref.h b/include/ceres/internal/expression_ref.h index 570a8d8..5f293b0 100644 --- a/include/ceres/internal/expression_ref.h +++ b/include/ceres/internal/expression_ref.h
@@ -88,10 +88,10 @@ ExpressionRef& operator=(const ExpressionRef& other); // Compound operators - ExpressionRef& operator+=(ExpressionRef x); - ExpressionRef& operator-=(ExpressionRef x); - ExpressionRef& operator*=(ExpressionRef x); - ExpressionRef& operator/=(ExpressionRef x); + ExpressionRef& operator+=(const ExpressionRef& x); + ExpressionRef& operator-=(const ExpressionRef& x); + ExpressionRef& operator*=(const ExpressionRef& x); + ExpressionRef& operator/=(const ExpressionRef& x); bool IsInitialized() const { return id != kInvalidExpressionId; } @@ -102,23 +102,23 @@ }; // Arithmetic Operators -ExpressionRef operator-(ExpressionRef x); -ExpressionRef operator+(ExpressionRef x); -ExpressionRef operator+(ExpressionRef x, ExpressionRef y); -ExpressionRef operator-(ExpressionRef x, ExpressionRef y); -ExpressionRef operator*(ExpressionRef x, ExpressionRef y); -ExpressionRef operator/(ExpressionRef x, ExpressionRef y); +ExpressionRef operator-(const ExpressionRef& x); +ExpressionRef operator+(const ExpressionRef& x); +ExpressionRef operator+(const ExpressionRef& x, const ExpressionRef& y); +ExpressionRef operator-(const ExpressionRef& x, const ExpressionRef& y); +ExpressionRef operator*(const ExpressionRef& x, const ExpressionRef& y); +ExpressionRef operator/(const ExpressionRef& x, const ExpressionRef& y); // Functions #define CERES_DEFINE_UNARY_FUNCTION_CALL(name) \ - inline ExpressionRef name(ExpressionRef x) { \ + inline ExpressionRef name(const ExpressionRef& x) { \ return ExpressionRef::Create( \ Expression::CreateFunctionCall(#name, {x.id})); \ } -#define CERES_DEFINE_BINARY_FUNCTION_CALL(name) \ - inline ExpressionRef name(ExpressionRef x, ExpressionRef y) { \ - return ExpressionRef::Create( \ - Expression::CreateFunctionCall(#name, {x.id, y.id})); \ +#define CERES_DEFINE_BINARY_FUNCTION_CALL(name) \ + inline ExpressionRef name(const ExpressionRef& x, const ExpressionRef& y) { \ + return ExpressionRef::Create( \ + Expression::CreateFunctionCall(#name, {x.id, y.id})); \ } CERES_DEFINE_UNARY_FUNCTION_CALL(abs); CERES_DEFINE_UNARY_FUNCTION_CALL(acos); @@ -161,27 +161,33 @@ // ... struct ComparisonExpressionRef { ExpressionId id; - explicit ComparisonExpressionRef(ExpressionRef ref) : id(ref.id) {} + explicit ComparisonExpressionRef(const ExpressionRef& ref) : id(ref.id) {} }; -ExpressionRef Ternary(ComparisonExpressionRef c, - ExpressionRef a, - ExpressionRef b); +ExpressionRef Ternary(const ComparisonExpressionRef& c, + const ExpressionRef& x, + const ExpressionRef& y); // Comparison operators -ComparisonExpressionRef operator<(ExpressionRef a, ExpressionRef b); -ComparisonExpressionRef operator<=(ExpressionRef a, ExpressionRef b); -ComparisonExpressionRef operator>(ExpressionRef a, ExpressionRef b); -ComparisonExpressionRef operator>=(ExpressionRef a, ExpressionRef b); -ComparisonExpressionRef operator==(ExpressionRef a, ExpressionRef b); -ComparisonExpressionRef operator!=(ExpressionRef a, ExpressionRef b); +ComparisonExpressionRef operator<(const ExpressionRef& x, + const ExpressionRef& y); +ComparisonExpressionRef operator<=(const ExpressionRef& x, + const ExpressionRef& y); +ComparisonExpressionRef operator>(const ExpressionRef& x, + const ExpressionRef& y); +ComparisonExpressionRef operator>=(const ExpressionRef& x, + const ExpressionRef& y); +ComparisonExpressionRef operator==(const ExpressionRef& x, + const ExpressionRef& y); +ComparisonExpressionRef operator!=(const ExpressionRef& x, + const ExpressionRef& y); // Logical Operators -ComparisonExpressionRef operator&&(ComparisonExpressionRef a, - ComparisonExpressionRef b); -ComparisonExpressionRef operator||(ComparisonExpressionRef a, - ComparisonExpressionRef b); -ComparisonExpressionRef operator!(ComparisonExpressionRef a); +ComparisonExpressionRef operator&&(const ComparisonExpressionRef& x, + const ComparisonExpressionRef& y); +ComparisonExpressionRef operator||(const ComparisonExpressionRef& x, + const ComparisonExpressionRef& y); +ComparisonExpressionRef operator!(const ComparisonExpressionRef& x); // This struct is used to mark numbers which are constant over // multiple invocations but can differ between instances. @@ -234,7 +240,8 @@ inline ExpressionRef MakeParameter(const std::string& name) { return ExpressionRef::Create(Expression::CreateInputAssignment(name)); } -inline ExpressionRef MakeOutput(ExpressionRef v, const std::string& name) { +inline ExpressionRef MakeOutput(const ExpressionRef& v, + const std::string& name) { return ExpressionRef::Create(Expression::CreateOutputAssignment(v.id, name)); }
diff --git a/internal/ceres/expression_ref.cc b/internal/ceres/expression_ref.cc index 8f7300c..23af0d1 100644 --- a/internal/ceres/expression_ref.cc +++ b/internal/ceres/expression_ref.cc
@@ -63,73 +63,74 @@ } // Compound operators -ExpressionRef& ExpressionRef::operator+=(ExpressionRef y) { - *this = *this + y; +ExpressionRef& ExpressionRef::operator+=(const ExpressionRef& x) { + *this = *this + x; return *this; } -ExpressionRef& ExpressionRef::operator-=(ExpressionRef y) { - *this = *this - y; +ExpressionRef& ExpressionRef::operator-=(const ExpressionRef& x) { + *this = *this - x; return *this; } -ExpressionRef& ExpressionRef::operator*=(ExpressionRef y) { - *this = *this * y; +ExpressionRef& ExpressionRef::operator*=(const ExpressionRef& x) { + *this = *this * x; return *this; } -ExpressionRef& ExpressionRef::operator/=(ExpressionRef y) { - *this = *this / y; +ExpressionRef& ExpressionRef::operator/=(const ExpressionRef& x) { + *this = *this / x; return *this; } // Arith. Operators -ExpressionRef operator-(ExpressionRef x) { +ExpressionRef operator-(const ExpressionRef& x) { return ExpressionRef::Create(Expression::CreateUnaryArithmetic("-", x.id)); } -ExpressionRef operator+(ExpressionRef x) { +ExpressionRef operator+(const ExpressionRef& x) { return ExpressionRef::Create(Expression::CreateUnaryArithmetic("+", x.id)); } -ExpressionRef operator+(ExpressionRef x, ExpressionRef y) { +ExpressionRef operator+(const ExpressionRef& x, const ExpressionRef& y) { return ExpressionRef::Create( Expression::CreateBinaryArithmetic("+", x.id, y.id)); } -ExpressionRef operator-(ExpressionRef x, ExpressionRef y) { +ExpressionRef operator-(const ExpressionRef& x, const ExpressionRef& y) { return ExpressionRef::Create( Expression::CreateBinaryArithmetic("-", x.id, y.id)); } -ExpressionRef operator/(ExpressionRef x, ExpressionRef y) { +ExpressionRef operator/(const ExpressionRef& x, const ExpressionRef& y) { return ExpressionRef::Create( Expression::CreateBinaryArithmetic("/", x.id, y.id)); } -ExpressionRef operator*(ExpressionRef x, ExpressionRef y) { +ExpressionRef operator*(const ExpressionRef& x, const ExpressionRef& y) { return ExpressionRef::Create( Expression::CreateBinaryArithmetic("*", x.id, y.id)); } -ExpressionRef Ternary(ComparisonExpressionRef c, - ExpressionRef a, - ExpressionRef b) { +ExpressionRef Ternary(const ComparisonExpressionRef& c, + const ExpressionRef& x, + const ExpressionRef& y) { return ExpressionRef::Create( - Expression::CreateFunctionCall("Ternary", {c.id, a.id, b.id})); + Expression::CreateFunctionCall("Ternary", {c.id, x.id, y.id})); } -#define CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(op) \ - ComparisonExpressionRef operator op(ExpressionRef a, ExpressionRef b) { \ - return ComparisonExpressionRef(ExpressionRef::Create( \ - Expression::CreateBinaryCompare(#op, a.id, b.id))); \ +#define CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(op) \ + ComparisonExpressionRef operator op(const ExpressionRef& x, \ + const ExpressionRef& y) { \ + return ComparisonExpressionRef(ExpressionRef::Create( \ + Expression::CreateBinaryCompare(#op, x.id, y.id))); \ } -#define CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(op) \ - ComparisonExpressionRef operator op(ComparisonExpressionRef a, \ - ComparisonExpressionRef b) { \ - return ComparisonExpressionRef(ExpressionRef::Create( \ - Expression::CreateBinaryCompare(#op, a.id, b.id))); \ +#define CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(op) \ + ComparisonExpressionRef operator op(const ComparisonExpressionRef& x, \ + const ComparisonExpressionRef& y) { \ + return ComparisonExpressionRef(ExpressionRef::Create( \ + Expression::CreateBinaryCompare(#op, x.id, y.id))); \ } CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(<) @@ -143,9 +144,9 @@ #undef CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR #undef CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR -ComparisonExpressionRef operator!(ComparisonExpressionRef a) { +ComparisonExpressionRef operator!(const ComparisonExpressionRef& x) { return ComparisonExpressionRef( - ExpressionRef::Create(Expression::CreateLogicalNegation(a.id))); + ExpressionRef::Create(Expression::CreateLogicalNegation(x.id))); } } // namespace internal