| #include "ceres/internal/export.h" | 
 | #include "ceres/local_parameterization.h" | 
 | #include "ceres/manifold.h" | 
 | #include "glog/logging.h" | 
 |  | 
 | namespace ceres { | 
 | namespace internal { | 
 |  | 
 | // Adapter to wrap LocalParameterization and make them look like Manifolds. | 
 | // | 
 | // ManifoldAdapter NEVER takes ownership of local_parameterization. | 
 | class CERES_NO_EXPORT ManifoldAdapter final : public Manifold { | 
 |  public: | 
 |   explicit ManifoldAdapter(const LocalParameterization* local_parameterization) | 
 |       : local_parameterization_(local_parameterization) { | 
 |     CHECK(local_parameterization != nullptr); | 
 |   } | 
 |  | 
 |   bool Plus(const double* x, | 
 |             const double* delta, | 
 |             double* x_plus_delta) const override { | 
 |     return local_parameterization_->Plus(x, delta, x_plus_delta); | 
 |   } | 
 |  | 
 |   bool PlusJacobian(const double* x, double* jacobian) const override { | 
 |     return local_parameterization_->ComputeJacobian(x, jacobian); | 
 |   } | 
 |  | 
 |   bool RightMultiplyByPlusJacobian(const double* x, | 
 |                                    const int num_rows, | 
 |                                    const double* ambient_matrix, | 
 |                                    double* tangent_matrix) const override { | 
 |     return local_parameterization_->MultiplyByJacobian( | 
 |         x, num_rows, ambient_matrix, tangent_matrix); | 
 |   } | 
 |  | 
 |   bool Minus(const double* y, const double* x, double* delta) const override { | 
 |     LOG(FATAL) << "This should never be called."; | 
 |     return false; | 
 |   } | 
 |  | 
 |   bool MinusJacobian(const double* x, double* jacobian) const override { | 
 |     LOG(FATAL) << "This should never be called."; | 
 |     return false; | 
 |   } | 
 |  | 
 |   int AmbientSize() const override { | 
 |     return local_parameterization_->GlobalSize(); | 
 |   } | 
 |  | 
 |   int TangentSize() const override { | 
 |     return local_parameterization_->LocalSize(); | 
 |   } | 
 |  | 
 |  private: | 
 |   const LocalParameterization* local_parameterization_; | 
 | }; | 
 |  | 
 | }  // namespace internal | 
 | }  // namespace ceres |